From 12894ca84a16f857029df1d01e4fc70b8e4c0b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Fri, 23 Jan 2026 11:31:15 +0100 Subject: [PATCH 01/12] feat(frontend): add AI Gateway integration for dynamic provider and model selection Add comprehensive AI Gateway integration to Console UI with the following features: - **Gateway Selection**: Fetch and display available AI Gateways from AI Gateway API - Auto-select first available gateway when creating agents - Show gateway ID in agent configuration details - **Dynamic Provider Loading**: Fetch LLM providers from AI Gateway ListModelProviders API - Replace hardcoded provider list with dynamic data - Display provider logos from API response - **Dynamic Model Loading**: Fetch models from AI Gateway ListModels API - Filter models by selected provider - Auto-select first model when provider changes - Show model metadata (context window, description) - **Dual-Mode Support**: - AI Gateway mode: Use gateway for auth, dynamic providers/models, hide API key field - Legacy mode: Use API key, hardcoded providers/models (backward compatible) - **Feature Flag**: enable-api-key-configuration-agent - false (default): AI Gateway mode with dynamic data - true: Legacy mode with hardcoded providers and API key requirement - **API Integration**: - Add buf.build/redpandadata/ai-gateway dependency - Generate TypeScript types for Gateway, ModelProviders, and Models services - Create React Query hooks with proper caching and authentication - Configure dev server proxy for AI Gateway API (/.redpanda/api/redpanda.api.aigateway.v1) - **Validation**: - API key optional when gateway is configured (proto updated with ignore = IGNORE_IF_ZERO_VALUE) - Gateway required when available - Conditional validation based on mode - **UX Improvements**: - No layout shift: gateway field always visible (disabled when unavailable) - Loading states for gateway/provider/model dropdowns - No validation errors during loading transitions - Icons displayed for providers in both selected state and dropdown Technical details: - Proto generation includes AI Gateway v1 API from buf.build - Proxy configuration in both Console UI and Cloud UI to handle CORS - Custom transport for AI Gateway with bearer token authentication - React Query caching with staleTime to prevent excessive refetching Co-Authored-By: Claude Sonnet 4.5 (1M context) --- .../api/aigateway/v1/access_control.pb.go | 2415 ++++++++++++++ .../api/aigateway/v1/access_control.pb.gw.go | 895 ++++++ .../aigateway/v1/access_control_grpc.pb.go | 452 +++ .../redpanda/api/aigateway/v1/account.pb.go | 1443 +++++++++ .../api/aigateway/v1/account.pb.gw.go | 683 ++++ .../api/aigateway/v1/account_grpc.pb.go | 378 +++ .../access_control.connect.go | 375 +++ .../access_control.connect.gw.go | 89 + .../v1/aigatewayv1connect/account.connect.go | 315 ++ .../aigatewayv1connect/account.connect.gw.go | 76 + .../aigatewayv1connect/analytics.connect.go | 221 ++ .../analytics.connect.gw.go | 58 + .../v1/aigatewayv1connect/audit.connect.go | 148 + .../v1/aigatewayv1connect/audit.connect.gw.go | 46 + .../v1/aigatewayv1connect/auth.connect.go | 504 +++ .../v1/aigatewayv1connect/auth.connect.gw.go | 111 + .../backend_pool.connect.go | 247 ++ .../backend_pool.connect.gw.go | 65 + .../v1/aigatewayv1connect/config.connect.go | 340 ++ .../aigatewayv1connect/config.connect.gw.go | 82 + .../v1/aigatewayv1connect/gateway.connect.go | 245 ++ .../aigatewayv1connect/gateway.connect.gw.go | 64 + .../gateway_config.connect.go | 177 ++ .../gateway_config.connect.gw.go | 47 + .../aigatewayv1connect/guardrail.connect.go | 235 ++ .../guardrail.connect.gw.go | 64 + .../iam_settings.connect.go | 247 ++ .../iam_settings.connect.gw.go | 65 + .../aigatewayv1connect/mcp_tools.connect.go | 117 + .../mcp_tools.connect.gw.go | 40 + .../model_providers.connect.go | 241 ++ .../model_providers.connect.gw.go | 65 + .../v1/aigatewayv1connect/models.connect.go | 329 ++ .../aigatewayv1connect/models.connect.gw.go | 82 + .../oauth2_client.connect.go | 353 +++ .../oauth2_client.connect.gw.go | 83 + .../aigatewayv1connect/oauth2_key.connect.go | 321 ++ .../oauth2_key.connect.gw.go | 76 + .../organization.connect.go | 247 ++ .../organization.connect.gw.go | 65 + .../v1/aigatewayv1connect/pricing.connect.go | 447 +++ .../aigatewayv1connect/pricing.connect.gw.go | 107 + .../provider_config.connect.go | 283 ++ .../provider_config.connect.gw.go | 71 + .../aigatewayv1connect/ratelimit.connect.go | 235 ++ .../ratelimit.connect.gw.go | 64 + .../v1/aigatewayv1connect/role.connect.go | 369 +++ .../v1/aigatewayv1connect/role.connect.gw.go | 87 + .../v1/aigatewayv1connect/routing.connect.go | 235 ++ .../aigatewayv1connect/routing.connect.gw.go | 64 + .../v1/aigatewayv1connect/settings.connect.go | 149 + .../aigatewayv1connect/settings.connect.gw.go | 46 + .../aigatewayv1connect/spend_limit.connect.go | 266 ++ .../spend_limit.connect.gw.go | 70 + .../v1/aigatewayv1connect/sso.connect.go | 442 +++ .../v1/aigatewayv1connect/sso.connect.gw.go | 99 + .../v1/aigatewayv1connect/team.connect.go | 399 +++ .../v1/aigatewayv1connect/team.connect.gw.go | 93 + .../v1/aigatewayv1connect/user.connect.go | 503 +++ .../v1/aigatewayv1connect/user.connect.gw.go | 111 + .../visual_metadata.connect.go | 185 ++ .../visual_metadata.connect.gw.go | 53 + .../aigatewayv1connect/workspace.connect.go | 245 ++ .../workspace.connect.gw.go | 64 + .../redpanda/api/aigateway/v1/analytics.pb.go | 1888 +++++++++++ .../api/aigateway/v1/analytics.pb.gw.go | 387 +++ .../api/aigateway/v1/analytics_grpc.pb.go | 258 ++ .../redpanda/api/aigateway/v1/audit.pb.go | 1287 ++++++++ .../redpanda/api/aigateway/v1/audit.pb.gw.go | 223 ++ .../api/aigateway/v1/audit_grpc.pb.go | 170 + .../redpanda/api/aigateway/v1/auth.pb.go | 2162 +++++++++++++ .../redpanda/api/aigateway/v1/auth.pb.gw.go | 981 ++++++ .../redpanda/api/aigateway/v1/auth_grpc.pb.go | 622 ++++ .../api/aigateway/v1/backend_pool.pb.go | 2505 +++++++++++++++ .../api/aigateway/v1/backend_pool.pb.gw.go | 973 ++++++ .../api/aigateway/v1/backend_pool_grpc.pb.go | 284 ++ .../redpanda/api/aigateway/v1/config.pb.go | 1946 ++++++++++++ .../redpanda/api/aigateway/v1/config.pb.gw.go | 1387 ++++++++ .../api/aigateway/v1/config_grpc.pb.go | 404 +++ .../redpanda/api/aigateway/v1/gateway.pb.go | 965 ++++++ .../api/aigateway/v1/gateway.pb.gw.go | 535 ++++ .../api/aigateway/v1/gateway_config.pb.go | 1208 +++++++ .../api/aigateway/v1/gateway_config.pb.gw.go | 225 ++ .../aigateway/v1/gateway_config_grpc.pb.go | 215 ++ .../api/aigateway/v1/gateway_grpc.pb.go | 284 ++ .../redpanda/api/aigateway/v1/guardrail.pb.go | 1260 ++++++++ .../api/aigateway/v1/guardrail.pb.gw.go | 987 ++++++ .../api/aigateway/v1/guardrail_grpc.pb.go | 274 ++ .../api/aigateway/v1/iam_settings.pb.go | 1037 ++++++ .../api/aigateway/v1/iam_settings.pb.gw.go | 471 +++ .../api/aigateway/v1/iam_settings_grpc.pb.go | 292 ++ .../redpanda/api/aigateway/v1/mcp_tools.pb.go | 339 ++ .../api/aigateway/v1/mcp_tools.pb.gw.go | 183 ++ .../api/aigateway/v1/mcp_tools_grpc.pb.go | 132 + .../api/aigateway/v1/model_providers.pb.go | 1164 +++++++ .../api/aigateway/v1/model_providers.pb.gw.go | 531 ++++ .../aigateway/v1/model_providers_grpc.pb.go | 288 ++ .../redpanda/api/aigateway/v1/models.pb.go | 1337 ++++++++ .../redpanda/api/aigateway/v1/models.pb.gw.go | 763 +++++ .../api/aigateway/v1/models_grpc.pb.go | 394 +++ .../api/aigateway/v1/oauth2_client.pb.go | 1667 ++++++++++ .../api/aigateway/v1/oauth2_client.pb.gw.go | 741 +++++ .../api/aigateway/v1/oauth2_client_grpc.pb.go | 420 +++ .../api/aigateway/v1/oauth2_key.pb.go | 1322 ++++++++ .../api/aigateway/v1/oauth2_key.pb.gw.go | 657 ++++ .../api/aigateway/v1/oauth2_key_grpc.pb.go | 384 +++ .../api/aigateway/v1/organization.pb.go | 984 ++++++ .../api/aigateway/v1/organization.pb.gw.go | 557 ++++ .../api/aigateway/v1/organization_grpc.pb.go | 292 ++ .../redpanda/api/aigateway/v1/pricing.pb.go | 2587 +++++++++++++++ .../api/aigateway/v1/pricing.pb.gw.go | 1201 +++++++ .../api/aigateway/v1/pricing_grpc.pb.go | 540 ++++ .../api/aigateway/v1/provider_config.pb.go | 1746 ++++++++++ .../api/aigateway/v1/provider_config.pb.gw.go | 641 ++++ .../aigateway/v1/provider_config_grpc.pb.go | 336 ++ .../redpanda/api/aigateway/v1/ratelimit.pb.go | 984 ++++++ .../api/aigateway/v1/ratelimit.pb.gw.go | 973 ++++++ .../api/aigateway/v1/ratelimit_grpc.pb.go | 274 ++ .../redpanda/api/aigateway/v1/role.pb.go | 1639 ++++++++++ .../redpanda/api/aigateway/v1/role.pb.gw.go | 923 ++++++ .../redpanda/api/aigateway/v1/role_grpc.pb.go | 456 +++ .../redpanda/api/aigateway/v1/routing.pb.go | 965 ++++++ .../api/aigateway/v1/routing.pb.gw.go | 973 ++++++ .../api/aigateway/v1/routing_grpc.pb.go | 274 ++ .../redpanda/api/aigateway/v1/settings.pb.go | 1496 +++++++++ .../api/aigateway/v1/settings.pb.gw.go | 217 ++ .../api/aigateway/v1/settings_grpc.pb.go | 170 + .../api/aigateway/v1/spend_limit.pb.go | 1488 +++++++++ .../api/aigateway/v1/spend_limit.pb.gw.go | 1157 +++++++ .../api/aigateway/v1/spend_limit_grpc.pb.go | 312 ++ .../redpanda/api/aigateway/v1/sso.pb.go | 2814 +++++++++++++++++ .../redpanda/api/aigateway/v1/sso.pb.gw.go | 1061 +++++++ .../redpanda/api/aigateway/v1/sso_grpc.pb.go | 544 ++++ .../redpanda/api/aigateway/v1/team.pb.go | 1819 +++++++++++ .../redpanda/api/aigateway/v1/team.pb.gw.go | 987 ++++++ .../redpanda/api/aigateway/v1/team_grpc.pb.go | 492 +++ .../redpanda/api/aigateway/v1/user.pb.go | 2429 ++++++++++++++ .../redpanda/api/aigateway/v1/user.pb.gw.go | 1241 ++++++++ .../redpanda/api/aigateway/v1/user_grpc.pb.go | 620 ++++ .../api/aigateway/v1/visual_metadata.pb.go | 735 +++++ .../api/aigateway/v1/visual_metadata.pb.gw.go | 359 +++ .../aigateway/v1/visual_metadata_grpc.pb.go | 214 ++ .../redpanda/api/aigateway/v1/workspace.pb.go | 991 ++++++ .../api/aigateway/v1/workspace.pb.gw.go | 571 ++++ .../api/aigateway/v1/workspace_grpc.pb.go | 292 ++ buf.lock | 6 +- buf.yaml | 1 + frontend/bun.lock | 1 + frontend/rsbuild.config.ts | 31 +- frontend/src/components/constants.ts | 1 + .../agents/create/ai-agent-create-page.tsx | 50 +- .../components/pages/agents/create/schemas.ts | 30 +- .../src/hooks/use-ai-gateway-transport.ts | 34 + .../src/protogen/buf/validate/validate_pb.ts | 197 +- frontend/src/protogen/google/api/client_pb.ts | 953 ++++++ .../protogen/google/api/launch_stage_pb.ts | 118 + ...ntrol-AccessControlService_connectquery.ts | 68 + .../api/aigateway/v1/access_control_pb.ts | 1117 +++++++ .../v1/account-AccountService_connectquery.ts | 57 + .../redpanda/api/aigateway/v1/account_pb.ts | 671 ++++ ...analytics-AnalyticsService_connectquery.ts | 37 + .../redpanda/api/aigateway/v1/analytics_pb.ts | 947 ++++++ .../v1/audit-AuditService_connectquery.ts | 19 + .../redpanda/api/aigateway/v1/audit_pb.ts | 651 ++++ .../v1/auth-AuthService_connectquery.ts | 101 + .../redpanda/api/aigateway/v1/auth_pb.ts | 1027 ++++++ ...nd_pool-BackendPoolService_connectquery.ts | 40 + .../api/aigateway/v1/backend_pool_pb.ts | 1134 +++++++ .../v1/config-ConfigService_connectquery.ts | 61 + .../redpanda/api/aigateway/v1/config_pb.ts | 780 +++++ .../v1/gateway-GatewayService_connectquery.ts | 40 + ...onfig-GatewayConfigService_connectquery.ts | 14 + .../api/aigateway/v1/gateway_config_pb.ts | 593 ++++ .../redpanda/api/aigateway/v1/gateway_pb.ts | 425 +++ ...guardrail-GuardrailService_connectquery.ts | 30 + .../redpanda/api/aigateway/v1/guardrail_pb.ts | 502 +++ ...ettings-IAMSettingsService_connectquery.ts | 40 + .../api/aigateway/v1/iam_settings_pb.ts | 474 +++ .../mcp_tools-MCPToolsService_connectquery.ts | 12 + .../redpanda/api/aigateway/v1/mcp_tools_pb.ts | 139 + ...ders-ModelProvidersService_connectquery.ts | 34 + .../api/aigateway/v1/model_providers_pb.ts | 488 +++ .../v1/models-ModelsService_connectquery.ts | 51 + .../redpanda/api/aigateway/v1/models_pb.ts | 549 ++++ ...client-OAuth2ClientService_connectquery.ts | 65 + .../api/aigateway/v1/oauth2_client_pb.ts | 738 +++++ ...auth2_key-OAuth2KeyService_connectquery.ts | 60 + .../api/aigateway/v1/oauth2_key_pb.ts | 610 ++++ ...zation-OrganizationService_connectquery.ts | 40 + .../api/aigateway/v1/organization_pb.ts | 427 +++ ...ricing-ModelPricingService_connectquery.ts | 65 + .../redpanda/api/aigateway/v1/pricing_pb.ts | 1083 +++++++ ...nfig-ProviderConfigService_connectquery.ts | 49 + .../api/aigateway/v1/provider_config_pb.ts | 785 +++++ ...ratelimit-RateLimitService_connectquery.ts | 30 + .../redpanda/api/aigateway/v1/ratelimit_pb.ts | 368 +++ .../v1/role-RoleService_connectquery.ts | 69 + .../redpanda/api/aigateway/v1/role_pb.ts | 748 +++++ .../v1/routing-RoutingService_connectquery.ts | 30 + .../redpanda/api/aigateway/v1/routing_pb.ts | 351 ++ .../settings-SettingsService_connectquery.ts | 19 + .../redpanda/api/aigateway/v1/settings_pb.ts | 699 ++++ ...nd_limit-SpendLimitService_connectquery.ts | 35 + .../api/aigateway/v1/spend_limit_pb.ts | 577 ++++ .../v1/sso-SSOService_connectquery.ts | 87 + .../redpanda/api/aigateway/v1/sso_pb.ts | 1334 ++++++++ .../v1/team-TeamService_connectquery.ts | 75 + .../redpanda/api/aigateway/v1/team_pb.ts | 818 +++++ .../v1/user-UserService_connectquery.ts | 99 + .../redpanda/api/aigateway/v1/user_pb.ts | 1126 +++++++ ...data-VisualMetadataService_connectquery.ts | 27 + .../api/aigateway/v1/visual_metadata_pb.ts | 323 ++ ...workspace-WorkspaceService_connectquery.ts | 40 + .../redpanda/api/aigateway/v1/workspace_pb.ts | 435 +++ frontend/src/react-query/api/ai-gateway.tsx | 114 + frontend/start-cloud.sh | 6 + proto/gen/openapi/openapi.v1alpha2.json | 2 +- proto/gen/openapi/openapi.v1alpha2.yaml | 2 +- taskfiles/proto.yaml | 1 + 219 files changed, 109352 insertions(+), 207 deletions(-) create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/access_control_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/account_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/analytics_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/audit_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/auth_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/config_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/models_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/organization_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/pricing_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/role_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/routing_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/settings_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/sso_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/team_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/user_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata_grpc.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/aigateway/v1/workspace_grpc.pb.go create mode 100644 frontend/src/hooks/use-ai-gateway-transport.ts create mode 100644 frontend/src/protogen/google/api/client_pb.ts create mode 100644 frontend/src/protogen/google/api/launch_stage_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/access_control-AccessControlService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/access_control_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/account-AccountService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/account_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/analytics-AnalyticsService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/analytics_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/audit-AuditService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/audit_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/auth-AuthService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/auth_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool-BackendPoolService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/config-ConfigService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/config_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config-GatewayConfigService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/gateway_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/guardrail-GuardrailService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/guardrail_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings-IAMSettingsService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools-MCPToolsService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/model_providers_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/models_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client-OAuth2ClientService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key-OAuth2KeyService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/organization-OrganizationService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/organization_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/pricing-ModelPricingService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/pricing_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/provider_config-ProviderConfigService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/provider_config_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit-RateLimitService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/role-RoleService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/role_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/routing-RoutingService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/routing_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/settings-SettingsService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/settings_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit-SpendLimitService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/sso-SSOService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/sso_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/team-TeamService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/team_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/user-UserService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/user_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata-VisualMetadataService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/workspace-WorkspaceService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/aigateway/v1/workspace_pb.ts create mode 100644 frontend/src/react-query/api/ai-gateway.tsx diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.go new file mode 100644 index 0000000000..fed8f127ba --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.go @@ -0,0 +1,2415 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/access_control.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Policy type enumeration +type PolicyType int32 + +const ( + PolicyType_POLICY_TYPE_UNSPECIFIED PolicyType = 0 + PolicyType_POLICY_TYPE_STATIC PolicyType = 1 // Standard Cedar policy + PolicyType_POLICY_TYPE_TEMPLATE PolicyType = 2 // Cedar policy template +) + +// Enum value maps for PolicyType. +var ( + PolicyType_name = map[int32]string{ + 0: "POLICY_TYPE_UNSPECIFIED", + 1: "POLICY_TYPE_STATIC", + 2: "POLICY_TYPE_TEMPLATE", + } + PolicyType_value = map[string]int32{ + "POLICY_TYPE_UNSPECIFIED": 0, + "POLICY_TYPE_STATIC": 1, + "POLICY_TYPE_TEMPLATE": 2, + } +) + +func (x PolicyType) Enum() *PolicyType { + p := new(PolicyType) + *p = x + return p +} + +func (x PolicyType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PolicyType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[0].Descriptor() +} + +func (PolicyType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[0] +} + +func (x PolicyType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PolicyType.Descriptor instead. +func (PolicyType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{0} +} + +// Policy effect enumeration +type PolicyEffect int32 + +const ( + PolicyEffect_POLICY_EFFECT_UNSPECIFIED PolicyEffect = 0 + PolicyEffect_POLICY_EFFECT_PERMIT PolicyEffect = 1 + PolicyEffect_POLICY_EFFECT_FORBID PolicyEffect = 2 +) + +// Enum value maps for PolicyEffect. +var ( + PolicyEffect_name = map[int32]string{ + 0: "POLICY_EFFECT_UNSPECIFIED", + 1: "POLICY_EFFECT_PERMIT", + 2: "POLICY_EFFECT_FORBID", + } + PolicyEffect_value = map[string]int32{ + "POLICY_EFFECT_UNSPECIFIED": 0, + "POLICY_EFFECT_PERMIT": 1, + "POLICY_EFFECT_FORBID": 2, + } +) + +func (x PolicyEffect) Enum() *PolicyEffect { + p := new(PolicyEffect) + *p = x + return p +} + +func (x PolicyEffect) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PolicyEffect) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[1].Descriptor() +} + +func (PolicyEffect) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[1] +} + +func (x PolicyEffect) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PolicyEffect.Descriptor instead. +func (PolicyEffect) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{1} +} + +// Authorization decision enumeration. +type Decision int32 + +const ( + Decision_DECISION_UNSPECIFIED Decision = 0 + Decision_DECISION_ALLOW Decision = 1 + Decision_DECISION_DENY Decision = 2 + Decision_DECISION_NO_DECISION Decision = 3 // No applicable policies +) + +// Enum value maps for Decision. +var ( + Decision_name = map[int32]string{ + 0: "DECISION_UNSPECIFIED", + 1: "DECISION_ALLOW", + 2: "DECISION_DENY", + 3: "DECISION_NO_DECISION", + } + Decision_value = map[string]int32{ + "DECISION_UNSPECIFIED": 0, + "DECISION_ALLOW": 1, + "DECISION_DENY": 2, + "DECISION_NO_DECISION": 3, + } +) + +func (x Decision) Enum() *Decision { + p := new(Decision) + *p = x + return p +} + +func (x Decision) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Decision) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[2].Descriptor() +} + +func (Decision) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_access_control_proto_enumTypes[2] +} + +func (x Decision) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Decision.Descriptor instead. +func (Decision) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{2} +} + +// AccessPolicy represents a Cedar authorization policy. +type AccessPolicy struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `workspaces/{workspace}/access-policies/{policy}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Required: The Cedar policy source code + PolicyText string `protobuf:"bytes,4,opt,name=policy_text,json=policyText,proto3" json:"policy_text,omitempty"` + // Policy type: STATIC or TEMPLATE + PolicyType PolicyType `protobuf:"varint,5,opt,name=policy_type,json=policyType,proto3,enum=redpanda.api.aigateway.v1.PolicyType" json:"policy_type,omitempty"` + // Output only. Effect: PERMIT or FORBID (extracted from policy) + Effect PolicyEffect `protobuf:"varint,6,opt,name=effect,proto3,enum=redpanda.api.aigateway.v1.PolicyEffect" json:"effect,omitempty"` + // Output only. Types of principals this policy applies to + PrincipalTypes []string `protobuf:"bytes,7,rep,name=principal_types,json=principalTypes,proto3" json:"principal_types,omitempty"` + // Output only. Types of resources this policy applies to + ResourceTypes []string `protobuf:"bytes,8,rep,name=resource_types,json=resourceTypes,proto3" json:"resource_types,omitempty"` + // Output only. Types of actions this policy applies to + ActionTypes []string `protobuf:"bytes,9,rep,name=action_types,json=actionTypes,proto3" json:"action_types,omitempty"` + // Whether this policy is active + Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Priority for policy ordering (lower = higher priority) + Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` + // Current version number + Version int32 `protobuf:"varint,12,opt,name=version,proto3" json:"version,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,13,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only timestamps + CreateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Creator string `protobuf:"bytes,16,opt,name=creator,proto3" json:"creator,omitempty"` + Updater string `protobuf:"bytes,17,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AccessPolicy) Reset() { + *x = AccessPolicy{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AccessPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicy) ProtoMessage() {} + +func (x *AccessPolicy) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicy.ProtoReflect.Descriptor instead. +func (*AccessPolicy) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{0} +} + +func (x *AccessPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AccessPolicy) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AccessPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *AccessPolicy) GetPolicyText() string { + if x != nil { + return x.PolicyText + } + return "" +} + +func (x *AccessPolicy) GetPolicyType() PolicyType { + if x != nil { + return x.PolicyType + } + return PolicyType_POLICY_TYPE_UNSPECIFIED +} + +func (x *AccessPolicy) GetEffect() PolicyEffect { + if x != nil { + return x.Effect + } + return PolicyEffect_POLICY_EFFECT_UNSPECIFIED +} + +func (x *AccessPolicy) GetPrincipalTypes() []string { + if x != nil { + return x.PrincipalTypes + } + return nil +} + +func (x *AccessPolicy) GetResourceTypes() []string { + if x != nil { + return x.ResourceTypes + } + return nil +} + +func (x *AccessPolicy) GetActionTypes() []string { + if x != nil { + return x.ActionTypes + } + return nil +} + +func (x *AccessPolicy) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AccessPolicy) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *AccessPolicy) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *AccessPolicy) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *AccessPolicy) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *AccessPolicy) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *AccessPolicy) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *AccessPolicy) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// PolicyVersion represents a historical version of a policy. +type PolicyVersion struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Version number + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + // The policy text at this version + PolicyText string `protobuf:"bytes,2,opt,name=policy_text,json=policyText,proto3" json:"policy_text,omitempty"` + // Reason for this change + ChangeReason string `protobuf:"bytes,3,opt,name=change_reason,json=changeReason,proto3" json:"change_reason,omitempty"` + // When this version was created + CreateTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Who created this version + Creator string `protobuf:"bytes,5,opt,name=creator,proto3" json:"creator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PolicyVersion) Reset() { + *x = PolicyVersion{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PolicyVersion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PolicyVersion) ProtoMessage() {} + +func (x *PolicyVersion) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PolicyVersion.ProtoReflect.Descriptor instead. +func (*PolicyVersion) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{1} +} + +func (x *PolicyVersion) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *PolicyVersion) GetPolicyText() string { + if x != nil { + return x.PolicyText + } + return "" +} + +func (x *PolicyVersion) GetChangeReason() string { + if x != nil { + return x.ChangeReason + } + return "" +} + +func (x *PolicyVersion) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *PolicyVersion) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +// Request message for CreatePolicy RPC. +type CreatePolicyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent workspace. + // Format: `workspaces/{workspace}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Optional policy ID (auto-generated if empty) + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // Required: The policy to create + Policy *AccessPolicy `protobuf:"bytes,3,opt,name=policy,proto3" json:"policy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreatePolicyRequest) Reset() { + *x = CreatePolicyRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreatePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreatePolicyRequest) ProtoMessage() {} + +func (x *CreatePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreatePolicyRequest.ProtoReflect.Descriptor instead. +func (*CreatePolicyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{2} +} + +func (x *CreatePolicyRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreatePolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *CreatePolicyRequest) GetPolicy() *AccessPolicy { + if x != nil { + return x.Policy + } + return nil +} + +// Response message for CreatePolicy RPC. +type CreatePolicyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Policy *AccessPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreatePolicyResponse) Reset() { + *x = CreatePolicyResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreatePolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreatePolicyResponse) ProtoMessage() {} + +func (x *CreatePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreatePolicyResponse.ProtoReflect.Descriptor instead. +func (*CreatePolicyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{3} +} + +func (x *CreatePolicyResponse) GetPolicy() *AccessPolicy { + if x != nil { + return x.Policy + } + return nil +} + +// Request message for GetPolicy RPC. +type GetPolicyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the policy. + // Format: `workspaces/{workspace}/access-policies/{policy}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPolicyRequest) Reset() { + *x = GetPolicyRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPolicyRequest) ProtoMessage() {} + +func (x *GetPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetPolicyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{4} +} + +func (x *GetPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetPolicy RPC. +type GetPolicyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Policy *AccessPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPolicyResponse) Reset() { + *x = GetPolicyResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPolicyResponse) ProtoMessage() {} + +func (x *GetPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetPolicyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{5} +} + +func (x *GetPolicyResponse) GetPolicy() *AccessPolicy { + if x != nil { + return x.Policy + } + return nil +} + +// Request message for ListPolicies RPC. +type ListPoliciesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent workspace. + // Format: `workspaces/{workspace}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of policies to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListPolicies call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPoliciesRequest) Reset() { + *x = ListPoliciesRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPoliciesRequest) ProtoMessage() {} + +func (x *ListPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListPoliciesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{6} +} + +func (x *ListPoliciesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListPoliciesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListPoliciesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListPoliciesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListPoliciesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListPolicies RPC. +type ListPoliciesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Policies []*AccessPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPoliciesResponse) Reset() { + *x = ListPoliciesResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPoliciesResponse) ProtoMessage() {} + +func (x *ListPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListPoliciesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{7} +} + +func (x *ListPoliciesResponse) GetPolicies() []*AccessPolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *ListPoliciesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListPoliciesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdatePolicy RPC. +type UpdatePolicyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The policy resource to update. + Policy *AccessPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + // The fields to update. + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + // Optional reason for this update (stored in version history) + ChangeReason string `protobuf:"bytes,3,opt,name=change_reason,json=changeReason,proto3" json:"change_reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdatePolicyRequest) Reset() { + *x = UpdatePolicyRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdatePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdatePolicyRequest) ProtoMessage() {} + +func (x *UpdatePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdatePolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdatePolicyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdatePolicyRequest) GetPolicy() *AccessPolicy { + if x != nil { + return x.Policy + } + return nil +} + +func (x *UpdatePolicyRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +func (x *UpdatePolicyRequest) GetChangeReason() string { + if x != nil { + return x.ChangeReason + } + return "" +} + +// Response message for UpdatePolicy RPC. +type UpdatePolicyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Policy *AccessPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdatePolicyResponse) Reset() { + *x = UpdatePolicyResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdatePolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdatePolicyResponse) ProtoMessage() {} + +func (x *UpdatePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdatePolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdatePolicyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdatePolicyResponse) GetPolicy() *AccessPolicy { + if x != nil { + return x.Policy + } + return nil +} + +// Request message for DeletePolicy RPC. +type DeletePolicyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the policy to delete. + // Format: `workspaces/{workspace}/access-policies/{policy}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeletePolicyRequest) Reset() { + *x = DeletePolicyRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeletePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeletePolicyRequest) ProtoMessage() {} + +func (x *DeletePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeletePolicyRequest.ProtoReflect.Descriptor instead. +func (*DeletePolicyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{10} +} + +func (x *DeletePolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DeletePolicy RPC. +type DeletePolicyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeletePolicyResponse) Reset() { + *x = DeletePolicyResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeletePolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeletePolicyResponse) ProtoMessage() {} + +func (x *DeletePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeletePolicyResponse.ProtoReflect.Descriptor instead. +func (*DeletePolicyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{11} +} + +// Request message for ValidatePolicy RPC. +type ValidatePolicyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent workspace (for context). + // Format: `workspaces/{workspace}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The Cedar policy text to validate + PolicyText string `protobuf:"bytes,2,opt,name=policy_text,json=policyText,proto3" json:"policy_text,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePolicyRequest) Reset() { + *x = ValidatePolicyRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePolicyRequest) ProtoMessage() {} + +func (x *ValidatePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePolicyRequest.ProtoReflect.Descriptor instead. +func (*ValidatePolicyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{12} +} + +func (x *ValidatePolicyRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ValidatePolicyRequest) GetPolicyText() string { + if x != nil { + return x.PolicyText + } + return "" +} + +// Response message for ValidatePolicy RPC. +type ValidatePolicyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether the policy is valid + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + // Validation errors (if any) + Errors []*PolicyValidationError `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` + // Parsed policy information (if valid) + Effect PolicyEffect `protobuf:"varint,3,opt,name=effect,proto3,enum=redpanda.api.aigateway.v1.PolicyEffect" json:"effect,omitempty"` + PrincipalTypes []string `protobuf:"bytes,4,rep,name=principal_types,json=principalTypes,proto3" json:"principal_types,omitempty"` + ResourceTypes []string `protobuf:"bytes,5,rep,name=resource_types,json=resourceTypes,proto3" json:"resource_types,omitempty"` + ActionTypes []string `protobuf:"bytes,6,rep,name=action_types,json=actionTypes,proto3" json:"action_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePolicyResponse) Reset() { + *x = ValidatePolicyResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePolicyResponse) ProtoMessage() {} + +func (x *ValidatePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePolicyResponse.ProtoReflect.Descriptor instead. +func (*ValidatePolicyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{13} +} + +func (x *ValidatePolicyResponse) GetValid() bool { + if x != nil { + return x.Valid + } + return false +} + +func (x *ValidatePolicyResponse) GetErrors() []*PolicyValidationError { + if x != nil { + return x.Errors + } + return nil +} + +func (x *ValidatePolicyResponse) GetEffect() PolicyEffect { + if x != nil { + return x.Effect + } + return PolicyEffect_POLICY_EFFECT_UNSPECIFIED +} + +func (x *ValidatePolicyResponse) GetPrincipalTypes() []string { + if x != nil { + return x.PrincipalTypes + } + return nil +} + +func (x *ValidatePolicyResponse) GetResourceTypes() []string { + if x != nil { + return x.ResourceTypes + } + return nil +} + +func (x *ValidatePolicyResponse) GetActionTypes() []string { + if x != nil { + return x.ActionTypes + } + return nil +} + +// PolicyValidationError describes a syntax error in a Cedar policy. +type PolicyValidationError struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Line number (1-indexed) + Line int32 `protobuf:"varint,1,opt,name=line,proto3" json:"line,omitempty"` + // Column number (1-indexed) + Column int32 `protobuf:"varint,2,opt,name=column,proto3" json:"column,omitempty"` + // Error message + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PolicyValidationError) Reset() { + *x = PolicyValidationError{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PolicyValidationError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PolicyValidationError) ProtoMessage() {} + +func (x *PolicyValidationError) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PolicyValidationError.ProtoReflect.Descriptor instead. +func (*PolicyValidationError) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{14} +} + +func (x *PolicyValidationError) GetLine() int32 { + if x != nil { + return x.Line + } + return 0 +} + +func (x *PolicyValidationError) GetColumn() int32 { + if x != nil { + return x.Column + } + return 0 +} + +func (x *PolicyValidationError) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for EvaluateAccess RPC. +type EvaluateAccessRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Workspace containing the policies. + // Format: `workspaces/{workspace}` + Workspace string `protobuf:"bytes,1,opt,name=workspace,proto3" json:"workspace,omitempty"` + // Principal making the request + Principal *CedarEntity `protobuf:"bytes,2,opt,name=principal,proto3" json:"principal,omitempty"` + // Action being performed + Action *CedarEntity `protobuf:"bytes,3,opt,name=action,proto3" json:"action,omitempty"` + // Resource being accessed + Resource *CedarEntity `protobuf:"bytes,4,opt,name=resource,proto3" json:"resource,omitempty"` + // Optional context attributes + Context map[string]string `protobuf:"bytes,5,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EvaluateAccessRequest) Reset() { + *x = EvaluateAccessRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EvaluateAccessRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EvaluateAccessRequest) ProtoMessage() {} + +func (x *EvaluateAccessRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EvaluateAccessRequest.ProtoReflect.Descriptor instead. +func (*EvaluateAccessRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{15} +} + +func (x *EvaluateAccessRequest) GetWorkspace() string { + if x != nil { + return x.Workspace + } + return "" +} + +func (x *EvaluateAccessRequest) GetPrincipal() *CedarEntity { + if x != nil { + return x.Principal + } + return nil +} + +func (x *EvaluateAccessRequest) GetAction() *CedarEntity { + if x != nil { + return x.Action + } + return nil +} + +func (x *EvaluateAccessRequest) GetResource() *CedarEntity { + if x != nil { + return x.Resource + } + return nil +} + +func (x *EvaluateAccessRequest) GetContext() map[string]string { + if x != nil { + return x.Context + } + return nil +} + +// Response message for EvaluateAccess RPC. +type EvaluateAccessResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether access is allowed + Allowed bool `protobuf:"varint,1,opt,name=allowed,proto3" json:"allowed,omitempty"` + // The decision: ALLOW, DENY, or NO_DECISION + Decision Decision `protobuf:"varint,2,opt,name=decision,proto3,enum=redpanda.api.aigateway.v1.Decision" json:"decision,omitempty"` + // IDs of policies that contributed to this decision + DeterminingPolicies []string `protobuf:"bytes,3,rep,name=determining_policies,json=determiningPolicies,proto3" json:"determining_policies,omitempty"` + // Diagnostic information + Diagnostics []string `protobuf:"bytes,4,rep,name=diagnostics,proto3" json:"diagnostics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EvaluateAccessResponse) Reset() { + *x = EvaluateAccessResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EvaluateAccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EvaluateAccessResponse) ProtoMessage() {} + +func (x *EvaluateAccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EvaluateAccessResponse.ProtoReflect.Descriptor instead. +func (*EvaluateAccessResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{16} +} + +func (x *EvaluateAccessResponse) GetAllowed() bool { + if x != nil { + return x.Allowed + } + return false +} + +func (x *EvaluateAccessResponse) GetDecision() Decision { + if x != nil { + return x.Decision + } + return Decision_DECISION_UNSPECIFIED +} + +func (x *EvaluateAccessResponse) GetDeterminingPolicies() []string { + if x != nil { + return x.DeterminingPolicies + } + return nil +} + +func (x *EvaluateAccessResponse) GetDiagnostics() []string { + if x != nil { + return x.Diagnostics + } + return nil +} + +// CedarEntity represents a Cedar principal, action, or resource. +type CedarEntity struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Entity type (e.g., "AIGateway::User") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Entity ID + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CedarEntity) Reset() { + *x = CedarEntity{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CedarEntity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CedarEntity) ProtoMessage() {} + +func (x *CedarEntity) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CedarEntity.ProtoReflect.Descriptor instead. +func (*CedarEntity) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{17} +} + +func (x *CedarEntity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *CedarEntity) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// Request message for ListPolicyVersions RPC. +type ListPolicyVersionsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Parent policy resource. + // Format: `workspaces/{workspace}/access-policies/{policy}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPolicyVersionsRequest) Reset() { + *x = ListPolicyVersionsRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPolicyVersionsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPolicyVersionsRequest) ProtoMessage() {} + +func (x *ListPolicyVersionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPolicyVersionsRequest.ProtoReflect.Descriptor instead. +func (*ListPolicyVersionsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{18} +} + +func (x *ListPolicyVersionsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListPolicyVersionsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListPolicyVersionsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListPolicyVersions RPC. +type ListPolicyVersionsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Versions []*PolicyVersion `protobuf:"bytes,1,rep,name=versions,proto3" json:"versions,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPolicyVersionsResponse) Reset() { + *x = ListPolicyVersionsResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPolicyVersionsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPolicyVersionsResponse) ProtoMessage() {} + +func (x *ListPolicyVersionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPolicyVersionsResponse.ProtoReflect.Descriptor instead. +func (*ListPolicyVersionsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{19} +} + +func (x *ListPolicyVersionsResponse) GetVersions() []*PolicyVersion { + if x != nil { + return x.Versions + } + return nil +} + +func (x *ListPolicyVersionsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// Request message for GetPolicyEntities RPC. +type GetPolicyEntitiesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Parent workspace. + // Format: `workspaces/{workspace}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPolicyEntitiesRequest) Reset() { + *x = GetPolicyEntitiesRequest{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPolicyEntitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPolicyEntitiesRequest) ProtoMessage() {} + +func (x *GetPolicyEntitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPolicyEntitiesRequest.ProtoReflect.Descriptor instead. +func (*GetPolicyEntitiesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{20} +} + +func (x *GetPolicyEntitiesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +// Response message for GetPolicyEntities RPC. +type GetPolicyEntitiesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Available principal types with descriptions + PrincipalTypes []*EntityTypeInfo `protobuf:"bytes,1,rep,name=principal_types,json=principalTypes,proto3" json:"principal_types,omitempty"` + // Available action types + ActionTypes []*EntityTypeInfo `protobuf:"bytes,2,rep,name=action_types,json=actionTypes,proto3" json:"action_types,omitempty"` + // Available resource types with descriptions + ResourceTypes []*EntityTypeInfo `protobuf:"bytes,3,rep,name=resource_types,json=resourceTypes,proto3" json:"resource_types,omitempty"` + // Sample entities for autocomplete + SampleEntities []*EntityInstance `protobuf:"bytes,4,rep,name=sample_entities,json=sampleEntities,proto3" json:"sample_entities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPolicyEntitiesResponse) Reset() { + *x = GetPolicyEntitiesResponse{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPolicyEntitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPolicyEntitiesResponse) ProtoMessage() {} + +func (x *GetPolicyEntitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPolicyEntitiesResponse.ProtoReflect.Descriptor instead. +func (*GetPolicyEntitiesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{21} +} + +func (x *GetPolicyEntitiesResponse) GetPrincipalTypes() []*EntityTypeInfo { + if x != nil { + return x.PrincipalTypes + } + return nil +} + +func (x *GetPolicyEntitiesResponse) GetActionTypes() []*EntityTypeInfo { + if x != nil { + return x.ActionTypes + } + return nil +} + +func (x *GetPolicyEntitiesResponse) GetResourceTypes() []*EntityTypeInfo { + if x != nil { + return x.ResourceTypes + } + return nil +} + +func (x *GetPolicyEntitiesResponse) GetSampleEntities() []*EntityInstance { + if x != nil { + return x.SampleEntities + } + return nil +} + +// EntityTypeInfo describes a Cedar entity type. +type EntityTypeInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Entity type name (e.g., "AIGateway::User") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Human-readable description + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // Available attributes on this entity type + Attributes []*EntityAttribute `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntityTypeInfo) Reset() { + *x = EntityTypeInfo{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntityTypeInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityTypeInfo) ProtoMessage() {} + +func (x *EntityTypeInfo) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityTypeInfo.ProtoReflect.Descriptor instead. +func (*EntityTypeInfo) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{22} +} + +func (x *EntityTypeInfo) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *EntityTypeInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *EntityTypeInfo) GetAttributes() []*EntityAttribute { + if x != nil { + return x.Attributes + } + return nil +} + +// EntityAttribute describes an attribute on a Cedar entity. +type EntityAttribute struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Attribute name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Attribute type ("String", "Long", "Boolean", "Set", "Record") + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // Human-readable description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntityAttribute) Reset() { + *x = EntityAttribute{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntityAttribute) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityAttribute) ProtoMessage() {} + +func (x *EntityAttribute) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityAttribute.ProtoReflect.Descriptor instead. +func (*EntityAttribute) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{23} +} + +func (x *EntityAttribute) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EntityAttribute) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *EntityAttribute) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// EntityInstance represents a concrete entity for autocomplete. +type EntityInstance struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Entity type + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Entity ID + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Display name for UI + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntityInstance) Reset() { + *x = EntityInstance{} + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntityInstance) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityInstance) ProtoMessage() {} + +func (x *EntityInstance) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_access_control_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityInstance.ProtoReflect.Descriptor instead. +func (*EntityInstance) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP(), []int{24} +} + +func (x *EntityInstance) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *EntityInstance) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *EntityInstance) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +var File_redpanda_api_aigateway_v1_access_control_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_access_control_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xb3, 0x07, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x78, 0x74, + 0x12, 0x4b, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, + 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x06, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x59, 0xea, 0x41, + 0x56, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x22, 0xc6, 0x01, 0x0a, 0x0d, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x65, 0x78, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, + 0x22, 0xbf, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, + 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0x57, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x53, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, + 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x54, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xda, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, + 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x44, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x22, 0x57, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x56, 0x0a, 0x13, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x15, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x78, 0x74, 0x22, 0xac, 0x02, 0x0a, + 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x48, 0x0a, + 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x15, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x03, 0x0a, 0x15, 0x45, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, + 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x09, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x64, 0x61, + 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x64, 0x61, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x64, 0x61, 0x72, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x57, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc8, 0x01, 0x0a, 0x16, 0x45, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, + 0x3f, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x31, 0x0a, 0x14, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, + 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x3b, 0x0a, 0x0b, 0x43, 0x65, 0x64, 0x61, 0x72, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, + 0x69, 0x64, 0x22, 0xa6, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x43, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xe3, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0e, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x92, 0x01, 0x0a, + 0x0e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x22, 0x5b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x57, + 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x5b, 0x0a, 0x0a, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x4f, + 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, + 0x54, 0x45, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x0c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x45, + 0x46, 0x46, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x45, 0x46, + 0x46, 0x45, 0x43, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x12, 0x18, 0x0a, + 0x14, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x5f, 0x46, + 0x4f, 0x52, 0x42, 0x49, 0x44, 0x10, 0x02, 0x2a, 0x65, 0x0a, 0x08, 0x44, 0x65, 0x63, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, + 0x4e, 0x59, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0xdf, + 0x0c, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x33, 0x3a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xa2, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x32, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x0c, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2b, 0x2a, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb4, + 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, + 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0xae, 0x01, 0x0a, 0x0e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0xbf, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x36, 0x12, 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xba, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x33, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x34, 0x12, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x42, 0x87, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x42, 0x12, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, + 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, + 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_access_control_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_access_control_proto_rawDescData = file_redpanda_api_aigateway_v1_access_control_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_access_control_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_access_control_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_access_control_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_access_control_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_access_control_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_access_control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_redpanda_api_aigateway_v1_access_control_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_redpanda_api_aigateway_v1_access_control_proto_goTypes = []any{ + (PolicyType)(0), // 0: redpanda.api.aigateway.v1.PolicyType + (PolicyEffect)(0), // 1: redpanda.api.aigateway.v1.PolicyEffect + (Decision)(0), // 2: redpanda.api.aigateway.v1.Decision + (*AccessPolicy)(nil), // 3: redpanda.api.aigateway.v1.AccessPolicy + (*PolicyVersion)(nil), // 4: redpanda.api.aigateway.v1.PolicyVersion + (*CreatePolicyRequest)(nil), // 5: redpanda.api.aigateway.v1.CreatePolicyRequest + (*CreatePolicyResponse)(nil), // 6: redpanda.api.aigateway.v1.CreatePolicyResponse + (*GetPolicyRequest)(nil), // 7: redpanda.api.aigateway.v1.GetPolicyRequest + (*GetPolicyResponse)(nil), // 8: redpanda.api.aigateway.v1.GetPolicyResponse + (*ListPoliciesRequest)(nil), // 9: redpanda.api.aigateway.v1.ListPoliciesRequest + (*ListPoliciesResponse)(nil), // 10: redpanda.api.aigateway.v1.ListPoliciesResponse + (*UpdatePolicyRequest)(nil), // 11: redpanda.api.aigateway.v1.UpdatePolicyRequest + (*UpdatePolicyResponse)(nil), // 12: redpanda.api.aigateway.v1.UpdatePolicyResponse + (*DeletePolicyRequest)(nil), // 13: redpanda.api.aigateway.v1.DeletePolicyRequest + (*DeletePolicyResponse)(nil), // 14: redpanda.api.aigateway.v1.DeletePolicyResponse + (*ValidatePolicyRequest)(nil), // 15: redpanda.api.aigateway.v1.ValidatePolicyRequest + (*ValidatePolicyResponse)(nil), // 16: redpanda.api.aigateway.v1.ValidatePolicyResponse + (*PolicyValidationError)(nil), // 17: redpanda.api.aigateway.v1.PolicyValidationError + (*EvaluateAccessRequest)(nil), // 18: redpanda.api.aigateway.v1.EvaluateAccessRequest + (*EvaluateAccessResponse)(nil), // 19: redpanda.api.aigateway.v1.EvaluateAccessResponse + (*CedarEntity)(nil), // 20: redpanda.api.aigateway.v1.CedarEntity + (*ListPolicyVersionsRequest)(nil), // 21: redpanda.api.aigateway.v1.ListPolicyVersionsRequest + (*ListPolicyVersionsResponse)(nil), // 22: redpanda.api.aigateway.v1.ListPolicyVersionsResponse + (*GetPolicyEntitiesRequest)(nil), // 23: redpanda.api.aigateway.v1.GetPolicyEntitiesRequest + (*GetPolicyEntitiesResponse)(nil), // 24: redpanda.api.aigateway.v1.GetPolicyEntitiesResponse + (*EntityTypeInfo)(nil), // 25: redpanda.api.aigateway.v1.EntityTypeInfo + (*EntityAttribute)(nil), // 26: redpanda.api.aigateway.v1.EntityAttribute + (*EntityInstance)(nil), // 27: redpanda.api.aigateway.v1.EntityInstance + nil, // 28: redpanda.api.aigateway.v1.AccessPolicy.MetadataEntry + nil, // 29: redpanda.api.aigateway.v1.EvaluateAccessRequest.ContextEntry + (*timestamppb.Timestamp)(nil), // 30: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 31: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_access_control_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.AccessPolicy.policy_type:type_name -> redpanda.api.aigateway.v1.PolicyType + 1, // 1: redpanda.api.aigateway.v1.AccessPolicy.effect:type_name -> redpanda.api.aigateway.v1.PolicyEffect + 28, // 2: redpanda.api.aigateway.v1.AccessPolicy.metadata:type_name -> redpanda.api.aigateway.v1.AccessPolicy.MetadataEntry + 30, // 3: redpanda.api.aigateway.v1.AccessPolicy.create_time:type_name -> google.protobuf.Timestamp + 30, // 4: redpanda.api.aigateway.v1.AccessPolicy.update_time:type_name -> google.protobuf.Timestamp + 30, // 5: redpanda.api.aigateway.v1.PolicyVersion.create_time:type_name -> google.protobuf.Timestamp + 3, // 6: redpanda.api.aigateway.v1.CreatePolicyRequest.policy:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 3, // 7: redpanda.api.aigateway.v1.CreatePolicyResponse.policy:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 3, // 8: redpanda.api.aigateway.v1.GetPolicyResponse.policy:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 3, // 9: redpanda.api.aigateway.v1.ListPoliciesResponse.policies:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 3, // 10: redpanda.api.aigateway.v1.UpdatePolicyRequest.policy:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 31, // 11: redpanda.api.aigateway.v1.UpdatePolicyRequest.update_mask:type_name -> google.protobuf.FieldMask + 3, // 12: redpanda.api.aigateway.v1.UpdatePolicyResponse.policy:type_name -> redpanda.api.aigateway.v1.AccessPolicy + 17, // 13: redpanda.api.aigateway.v1.ValidatePolicyResponse.errors:type_name -> redpanda.api.aigateway.v1.PolicyValidationError + 1, // 14: redpanda.api.aigateway.v1.ValidatePolicyResponse.effect:type_name -> redpanda.api.aigateway.v1.PolicyEffect + 20, // 15: redpanda.api.aigateway.v1.EvaluateAccessRequest.principal:type_name -> redpanda.api.aigateway.v1.CedarEntity + 20, // 16: redpanda.api.aigateway.v1.EvaluateAccessRequest.action:type_name -> redpanda.api.aigateway.v1.CedarEntity + 20, // 17: redpanda.api.aigateway.v1.EvaluateAccessRequest.resource:type_name -> redpanda.api.aigateway.v1.CedarEntity + 29, // 18: redpanda.api.aigateway.v1.EvaluateAccessRequest.context:type_name -> redpanda.api.aigateway.v1.EvaluateAccessRequest.ContextEntry + 2, // 19: redpanda.api.aigateway.v1.EvaluateAccessResponse.decision:type_name -> redpanda.api.aigateway.v1.Decision + 4, // 20: redpanda.api.aigateway.v1.ListPolicyVersionsResponse.versions:type_name -> redpanda.api.aigateway.v1.PolicyVersion + 25, // 21: redpanda.api.aigateway.v1.GetPolicyEntitiesResponse.principal_types:type_name -> redpanda.api.aigateway.v1.EntityTypeInfo + 25, // 22: redpanda.api.aigateway.v1.GetPolicyEntitiesResponse.action_types:type_name -> redpanda.api.aigateway.v1.EntityTypeInfo + 25, // 23: redpanda.api.aigateway.v1.GetPolicyEntitiesResponse.resource_types:type_name -> redpanda.api.aigateway.v1.EntityTypeInfo + 27, // 24: redpanda.api.aigateway.v1.GetPolicyEntitiesResponse.sample_entities:type_name -> redpanda.api.aigateway.v1.EntityInstance + 26, // 25: redpanda.api.aigateway.v1.EntityTypeInfo.attributes:type_name -> redpanda.api.aigateway.v1.EntityAttribute + 5, // 26: redpanda.api.aigateway.v1.AccessControlService.CreatePolicy:input_type -> redpanda.api.aigateway.v1.CreatePolicyRequest + 7, // 27: redpanda.api.aigateway.v1.AccessControlService.GetPolicy:input_type -> redpanda.api.aigateway.v1.GetPolicyRequest + 9, // 28: redpanda.api.aigateway.v1.AccessControlService.ListPolicies:input_type -> redpanda.api.aigateway.v1.ListPoliciesRequest + 11, // 29: redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy:input_type -> redpanda.api.aigateway.v1.UpdatePolicyRequest + 13, // 30: redpanda.api.aigateway.v1.AccessControlService.DeletePolicy:input_type -> redpanda.api.aigateway.v1.DeletePolicyRequest + 15, // 31: redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy:input_type -> redpanda.api.aigateway.v1.ValidatePolicyRequest + 18, // 32: redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess:input_type -> redpanda.api.aigateway.v1.EvaluateAccessRequest + 21, // 33: redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions:input_type -> redpanda.api.aigateway.v1.ListPolicyVersionsRequest + 23, // 34: redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities:input_type -> redpanda.api.aigateway.v1.GetPolicyEntitiesRequest + 6, // 35: redpanda.api.aigateway.v1.AccessControlService.CreatePolicy:output_type -> redpanda.api.aigateway.v1.CreatePolicyResponse + 8, // 36: redpanda.api.aigateway.v1.AccessControlService.GetPolicy:output_type -> redpanda.api.aigateway.v1.GetPolicyResponse + 10, // 37: redpanda.api.aigateway.v1.AccessControlService.ListPolicies:output_type -> redpanda.api.aigateway.v1.ListPoliciesResponse + 12, // 38: redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy:output_type -> redpanda.api.aigateway.v1.UpdatePolicyResponse + 14, // 39: redpanda.api.aigateway.v1.AccessControlService.DeletePolicy:output_type -> redpanda.api.aigateway.v1.DeletePolicyResponse + 16, // 40: redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy:output_type -> redpanda.api.aigateway.v1.ValidatePolicyResponse + 19, // 41: redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess:output_type -> redpanda.api.aigateway.v1.EvaluateAccessResponse + 22, // 42: redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions:output_type -> redpanda.api.aigateway.v1.ListPolicyVersionsResponse + 24, // 43: redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities:output_type -> redpanda.api.aigateway.v1.GetPolicyEntitiesResponse + 35, // [35:44] is the sub-list for method output_type + 26, // [26:35] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_access_control_proto_init() } +func file_redpanda_api_aigateway_v1_access_control_proto_init() { + if File_redpanda_api_aigateway_v1_access_control_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_access_control_proto_rawDesc, + NumEnums: 3, + NumMessages: 27, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_access_control_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_access_control_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_access_control_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_access_control_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_access_control_proto = out.File + file_redpanda_api_aigateway_v1_access_control_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_access_control_proto_goTypes = nil + file_redpanda_api_aigateway_v1_access_control_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.gw.go new file mode 100644 index 0000000000..4321354e84 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control.pb.gw.go @@ -0,0 +1,895 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/access_control.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_AccessControlService_CreatePolicy_0 = &utilities.DoubleArray{Encoding: map[string]int{"policy": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_AccessControlService_CreatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Policy); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_CreatePolicy_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreatePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_CreatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Policy); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_CreatePolicy_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreatePolicy(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccessControlService_GetPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPolicyRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_GetPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPolicyRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetPolicy(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccessControlService_ListPolicies_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_AccessControlService_ListPolicies_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPoliciesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_ListPolicies_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListPolicies(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_ListPolicies_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPoliciesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_ListPolicies_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListPolicies(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccessControlService_UpdatePolicy_0 = &utilities.DoubleArray{Encoding: map[string]int{"policy": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_AccessControlService_UpdatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Policy); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Policy); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["policy.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "policy.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "policy.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "policy.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_UpdatePolicy_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdatePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_UpdatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Policy); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Policy); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["policy.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "policy.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "policy.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "policy.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_UpdatePolicy_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdatePolicy(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccessControlService_DeletePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeletePolicyRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeletePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_DeletePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeletePolicyRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeletePolicy(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccessControlService_ValidatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ValidatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.ValidatePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_ValidatePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ValidatePolicyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.ValidatePolicy(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccessControlService_EvaluateAccess_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EvaluateAccessRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["workspace"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workspace") + } + protoReq.Workspace, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workspace", err) + } + msg, err := client.EvaluateAccess(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_EvaluateAccess_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EvaluateAccessRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["workspace"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workspace") + } + protoReq.Workspace, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workspace", err) + } + msg, err := server.EvaluateAccess(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccessControlService_ListPolicyVersions_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_AccessControlService_ListPolicyVersions_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPolicyVersionsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_ListPolicyVersions_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListPolicyVersions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_ListPolicyVersions_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPolicyVersionsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccessControlService_ListPolicyVersions_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListPolicyVersions(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccessControlService_GetPolicyEntities_0(ctx context.Context, marshaler runtime.Marshaler, client AccessControlServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPolicyEntitiesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.GetPolicyEntities(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccessControlService_GetPolicyEntities_0(ctx context.Context, marshaler runtime.Marshaler, server AccessControlServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPolicyEntitiesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.GetPolicyEntities(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterAccessControlServiceHandlerServer registers the http handlers for service AccessControlService to "mux". +// UnaryRPC :call AccessControlServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAccessControlServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterAccessControlServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AccessControlServiceServer) error { + mux.Handle(http.MethodPost, pattern_AccessControlService_CreatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/CreatePolicy", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_CreatePolicy_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_CreatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_GetPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/GetPolicy", runtime.WithHTTPPathPattern("/v1/{name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_GetPolicy_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_GetPolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_ListPolicies_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ListPolicies", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_ListPolicies_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ListPolicies_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_AccessControlService_UpdatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/UpdatePolicy", runtime.WithHTTPPathPattern("/v1/{policy.name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_UpdatePolicy_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_UpdatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AccessControlService_DeletePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/DeletePolicy", runtime.WithHTTPPathPattern("/v1/{name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_DeletePolicy_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_DeletePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccessControlService_ValidatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ValidatePolicy", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies:validate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_ValidatePolicy_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ValidatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccessControlService_EvaluateAccess_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/EvaluateAccess", runtime.WithHTTPPathPattern("/v1/{workspace=workspaces/*}/access:evaluate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_EvaluateAccess_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_EvaluateAccess_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_ListPolicyVersions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ListPolicyVersions", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*/access-policies/*}/versions")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_ListPolicyVersions_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ListPolicyVersions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_GetPolicyEntities_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/GetPolicyEntities", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies:entities")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccessControlService_GetPolicyEntities_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_GetPolicyEntities_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterAccessControlServiceHandlerFromEndpoint is same as RegisterAccessControlServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAccessControlServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterAccessControlServiceHandler(ctx, mux, conn) +} + +// RegisterAccessControlServiceHandler registers the http handlers for service AccessControlService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAccessControlServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAccessControlServiceHandlerClient(ctx, mux, NewAccessControlServiceClient(conn)) +} + +// RegisterAccessControlServiceHandlerClient registers the http handlers for service AccessControlService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AccessControlServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AccessControlServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AccessControlServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterAccessControlServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AccessControlServiceClient) error { + mux.Handle(http.MethodPost, pattern_AccessControlService_CreatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/CreatePolicy", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_CreatePolicy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_CreatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_GetPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/GetPolicy", runtime.WithHTTPPathPattern("/v1/{name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_GetPolicy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_GetPolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_ListPolicies_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ListPolicies", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_ListPolicies_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ListPolicies_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_AccessControlService_UpdatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/UpdatePolicy", runtime.WithHTTPPathPattern("/v1/{policy.name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_UpdatePolicy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_UpdatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AccessControlService_DeletePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/DeletePolicy", runtime.WithHTTPPathPattern("/v1/{name=workspaces/*/access-policies/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_DeletePolicy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_DeletePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccessControlService_ValidatePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ValidatePolicy", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies:validate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_ValidatePolicy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ValidatePolicy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccessControlService_EvaluateAccess_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/EvaluateAccess", runtime.WithHTTPPathPattern("/v1/{workspace=workspaces/*}/access:evaluate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_EvaluateAccess_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_EvaluateAccess_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_ListPolicyVersions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/ListPolicyVersions", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*/access-policies/*}/versions")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_ListPolicyVersions_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_ListPolicyVersions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccessControlService_GetPolicyEntities_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccessControlService/GetPolicyEntities", runtime.WithHTTPPathPattern("/v1/{parent=workspaces/*}/access-policies:entities")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccessControlService_GetPolicyEntities_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccessControlService_GetPolicyEntities_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_AccessControlService_CreatePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "workspaces", "parent", "access-policies"}, "")) + pattern_AccessControlService_GetPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "workspaces", "access-policies", "name"}, "")) + pattern_AccessControlService_ListPolicies_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "workspaces", "parent", "access-policies"}, "")) + pattern_AccessControlService_UpdatePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "workspaces", "access-policies", "policy.name"}, "")) + pattern_AccessControlService_DeletePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "workspaces", "access-policies", "name"}, "")) + pattern_AccessControlService_ValidatePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "workspaces", "parent", "access-policies"}, "validate")) + pattern_AccessControlService_EvaluateAccess_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "workspaces", "workspace", "access"}, "evaluate")) + pattern_AccessControlService_ListPolicyVersions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "workspaces", "access-policies", "parent", "versions"}, "")) + pattern_AccessControlService_GetPolicyEntities_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "workspaces", "parent", "access-policies"}, "entities")) +) + +var ( + forward_AccessControlService_CreatePolicy_0 = runtime.ForwardResponseMessage + forward_AccessControlService_GetPolicy_0 = runtime.ForwardResponseMessage + forward_AccessControlService_ListPolicies_0 = runtime.ForwardResponseMessage + forward_AccessControlService_UpdatePolicy_0 = runtime.ForwardResponseMessage + forward_AccessControlService_DeletePolicy_0 = runtime.ForwardResponseMessage + forward_AccessControlService_ValidatePolicy_0 = runtime.ForwardResponseMessage + forward_AccessControlService_EvaluateAccess_0 = runtime.ForwardResponseMessage + forward_AccessControlService_ListPolicyVersions_0 = runtime.ForwardResponseMessage + forward_AccessControlService_GetPolicyEntities_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control_grpc.pb.go new file mode 100644 index 0000000000..86007ff697 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/access_control_grpc.pb.go @@ -0,0 +1,452 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/access_control.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AccessControlService_CreatePolicy_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/CreatePolicy" + AccessControlService_GetPolicy_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/GetPolicy" + AccessControlService_ListPolicies_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/ListPolicies" + AccessControlService_UpdatePolicy_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/UpdatePolicy" + AccessControlService_DeletePolicy_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/DeletePolicy" + AccessControlService_ValidatePolicy_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/ValidatePolicy" + AccessControlService_EvaluateAccess_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/EvaluateAccess" + AccessControlService_ListPolicyVersions_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/ListPolicyVersions" + AccessControlService_GetPolicyEntities_FullMethodName = "/redpanda.api.aigateway.v1.AccessControlService/GetPolicyEntities" +) + +// AccessControlServiceClient is the client API for AccessControlService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AccessControlService manages Cedar access control policies. +// Policies define fine-grained authorization rules for AI Gateway resources. +// Resource name: workspaces/{workspace}/access-policies/{policy} +type AccessControlServiceClient interface { + // Creates a new Cedar policy. + CreatePolicy(ctx context.Context, in *CreatePolicyRequest, opts ...grpc.CallOption) (*CreatePolicyResponse, error) + // Gets a policy by name. + GetPolicy(ctx context.Context, in *GetPolicyRequest, opts ...grpc.CallOption) (*GetPolicyResponse, error) + // Lists policies within a workspace. + ListPolicies(ctx context.Context, in *ListPoliciesRequest, opts ...grpc.CallOption) (*ListPoliciesResponse, error) + // Updates a policy. + UpdatePolicy(ctx context.Context, in *UpdatePolicyRequest, opts ...grpc.CallOption) (*UpdatePolicyResponse, error) + // Deletes a policy. + DeletePolicy(ctx context.Context, in *DeletePolicyRequest, opts ...grpc.CallOption) (*DeletePolicyResponse, error) + // Validates a Cedar policy without saving it. + ValidatePolicy(ctx context.Context, in *ValidatePolicyRequest, opts ...grpc.CallOption) (*ValidatePolicyResponse, error) + // Evaluates an authorization request against policies. + EvaluateAccess(ctx context.Context, in *EvaluateAccessRequest, opts ...grpc.CallOption) (*EvaluateAccessResponse, error) + // Lists policy versions (audit trail). + ListPolicyVersions(ctx context.Context, in *ListPolicyVersionsRequest, opts ...grpc.CallOption) (*ListPolicyVersionsResponse, error) + // Gets available entities for policy authoring (autocomplete). + GetPolicyEntities(ctx context.Context, in *GetPolicyEntitiesRequest, opts ...grpc.CallOption) (*GetPolicyEntitiesResponse, error) +} + +type accessControlServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAccessControlServiceClient(cc grpc.ClientConnInterface) AccessControlServiceClient { + return &accessControlServiceClient{cc} +} + +func (c *accessControlServiceClient) CreatePolicy(ctx context.Context, in *CreatePolicyRequest, opts ...grpc.CallOption) (*CreatePolicyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreatePolicyResponse) + err := c.cc.Invoke(ctx, AccessControlService_CreatePolicy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) GetPolicy(ctx context.Context, in *GetPolicyRequest, opts ...grpc.CallOption) (*GetPolicyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetPolicyResponse) + err := c.cc.Invoke(ctx, AccessControlService_GetPolicy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) ListPolicies(ctx context.Context, in *ListPoliciesRequest, opts ...grpc.CallOption) (*ListPoliciesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListPoliciesResponse) + err := c.cc.Invoke(ctx, AccessControlService_ListPolicies_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) UpdatePolicy(ctx context.Context, in *UpdatePolicyRequest, opts ...grpc.CallOption) (*UpdatePolicyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdatePolicyResponse) + err := c.cc.Invoke(ctx, AccessControlService_UpdatePolicy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) DeletePolicy(ctx context.Context, in *DeletePolicyRequest, opts ...grpc.CallOption) (*DeletePolicyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeletePolicyResponse) + err := c.cc.Invoke(ctx, AccessControlService_DeletePolicy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) ValidatePolicy(ctx context.Context, in *ValidatePolicyRequest, opts ...grpc.CallOption) (*ValidatePolicyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ValidatePolicyResponse) + err := c.cc.Invoke(ctx, AccessControlService_ValidatePolicy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) EvaluateAccess(ctx context.Context, in *EvaluateAccessRequest, opts ...grpc.CallOption) (*EvaluateAccessResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EvaluateAccessResponse) + err := c.cc.Invoke(ctx, AccessControlService_EvaluateAccess_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) ListPolicyVersions(ctx context.Context, in *ListPolicyVersionsRequest, opts ...grpc.CallOption) (*ListPolicyVersionsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListPolicyVersionsResponse) + err := c.cc.Invoke(ctx, AccessControlService_ListPolicyVersions_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accessControlServiceClient) GetPolicyEntities(ctx context.Context, in *GetPolicyEntitiesRequest, opts ...grpc.CallOption) (*GetPolicyEntitiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetPolicyEntitiesResponse) + err := c.cc.Invoke(ctx, AccessControlService_GetPolicyEntities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AccessControlServiceServer is the server API for AccessControlService service. +// All implementations must embed UnimplementedAccessControlServiceServer +// for forward compatibility. +// +// AccessControlService manages Cedar access control policies. +// Policies define fine-grained authorization rules for AI Gateway resources. +// Resource name: workspaces/{workspace}/access-policies/{policy} +type AccessControlServiceServer interface { + // Creates a new Cedar policy. + CreatePolicy(context.Context, *CreatePolicyRequest) (*CreatePolicyResponse, error) + // Gets a policy by name. + GetPolicy(context.Context, *GetPolicyRequest) (*GetPolicyResponse, error) + // Lists policies within a workspace. + ListPolicies(context.Context, *ListPoliciesRequest) (*ListPoliciesResponse, error) + // Updates a policy. + UpdatePolicy(context.Context, *UpdatePolicyRequest) (*UpdatePolicyResponse, error) + // Deletes a policy. + DeletePolicy(context.Context, *DeletePolicyRequest) (*DeletePolicyResponse, error) + // Validates a Cedar policy without saving it. + ValidatePolicy(context.Context, *ValidatePolicyRequest) (*ValidatePolicyResponse, error) + // Evaluates an authorization request against policies. + EvaluateAccess(context.Context, *EvaluateAccessRequest) (*EvaluateAccessResponse, error) + // Lists policy versions (audit trail). + ListPolicyVersions(context.Context, *ListPolicyVersionsRequest) (*ListPolicyVersionsResponse, error) + // Gets available entities for policy authoring (autocomplete). + GetPolicyEntities(context.Context, *GetPolicyEntitiesRequest) (*GetPolicyEntitiesResponse, error) + mustEmbedUnimplementedAccessControlServiceServer() +} + +// UnimplementedAccessControlServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAccessControlServiceServer struct{} + +func (UnimplementedAccessControlServiceServer) CreatePolicy(context.Context, *CreatePolicyRequest) (*CreatePolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePolicy not implemented") +} +func (UnimplementedAccessControlServiceServer) GetPolicy(context.Context, *GetPolicyRequest) (*GetPolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPolicy not implemented") +} +func (UnimplementedAccessControlServiceServer) ListPolicies(context.Context, *ListPoliciesRequest) (*ListPoliciesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPolicies not implemented") +} +func (UnimplementedAccessControlServiceServer) UpdatePolicy(context.Context, *UpdatePolicyRequest) (*UpdatePolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdatePolicy not implemented") +} +func (UnimplementedAccessControlServiceServer) DeletePolicy(context.Context, *DeletePolicyRequest) (*DeletePolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeletePolicy not implemented") +} +func (UnimplementedAccessControlServiceServer) ValidatePolicy(context.Context, *ValidatePolicyRequest) (*ValidatePolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePolicy not implemented") +} +func (UnimplementedAccessControlServiceServer) EvaluateAccess(context.Context, *EvaluateAccessRequest) (*EvaluateAccessResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EvaluateAccess not implemented") +} +func (UnimplementedAccessControlServiceServer) ListPolicyVersions(context.Context, *ListPolicyVersionsRequest) (*ListPolicyVersionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPolicyVersions not implemented") +} +func (UnimplementedAccessControlServiceServer) GetPolicyEntities(context.Context, *GetPolicyEntitiesRequest) (*GetPolicyEntitiesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPolicyEntities not implemented") +} +func (UnimplementedAccessControlServiceServer) mustEmbedUnimplementedAccessControlServiceServer() {} +func (UnimplementedAccessControlServiceServer) testEmbeddedByValue() {} + +// UnsafeAccessControlServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AccessControlServiceServer will +// result in compilation errors. +type UnsafeAccessControlServiceServer interface { + mustEmbedUnimplementedAccessControlServiceServer() +} + +func RegisterAccessControlServiceServer(s grpc.ServiceRegistrar, srv AccessControlServiceServer) { + // If the following call pancis, it indicates UnimplementedAccessControlServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AccessControlService_ServiceDesc, srv) +} + +func _AccessControlService_CreatePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreatePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).CreatePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_CreatePolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).CreatePolicy(ctx, req.(*CreatePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_GetPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).GetPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_GetPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).GetPolicy(ctx, req.(*GetPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_ListPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPoliciesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).ListPolicies(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_ListPolicies_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).ListPolicies(ctx, req.(*ListPoliciesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_UpdatePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdatePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).UpdatePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_UpdatePolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).UpdatePolicy(ctx, req.(*UpdatePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_DeletePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeletePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).DeletePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_DeletePolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).DeletePolicy(ctx, req.(*DeletePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_ValidatePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidatePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).ValidatePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_ValidatePolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).ValidatePolicy(ctx, req.(*ValidatePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_EvaluateAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EvaluateAccessRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).EvaluateAccess(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_EvaluateAccess_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).EvaluateAccess(ctx, req.(*EvaluateAccessRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_ListPolicyVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPolicyVersionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).ListPolicyVersions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_ListPolicyVersions_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).ListPolicyVersions(ctx, req.(*ListPolicyVersionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccessControlService_GetPolicyEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPolicyEntitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccessControlServiceServer).GetPolicyEntities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccessControlService_GetPolicyEntities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccessControlServiceServer).GetPolicyEntities(ctx, req.(*GetPolicyEntitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AccessControlService_ServiceDesc is the grpc.ServiceDesc for AccessControlService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AccessControlService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.AccessControlService", + HandlerType: (*AccessControlServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreatePolicy", + Handler: _AccessControlService_CreatePolicy_Handler, + }, + { + MethodName: "GetPolicy", + Handler: _AccessControlService_GetPolicy_Handler, + }, + { + MethodName: "ListPolicies", + Handler: _AccessControlService_ListPolicies_Handler, + }, + { + MethodName: "UpdatePolicy", + Handler: _AccessControlService_UpdatePolicy_Handler, + }, + { + MethodName: "DeletePolicy", + Handler: _AccessControlService_DeletePolicy_Handler, + }, + { + MethodName: "ValidatePolicy", + Handler: _AccessControlService_ValidatePolicy_Handler, + }, + { + MethodName: "EvaluateAccess", + Handler: _AccessControlService_EvaluateAccess_Handler, + }, + { + MethodName: "ListPolicyVersions", + Handler: _AccessControlService_ListPolicyVersions_Handler, + }, + { + MethodName: "GetPolicyEntities", + Handler: _AccessControlService_GetPolicyEntities_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/access_control.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.go new file mode 100644 index 0000000000..8bd44ed29e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.go @@ -0,0 +1,1443 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/account.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// LicenseType represents the license tier for an account. +type LicenseType int32 + +const ( + // Unspecified license type + LicenseType_LICENSE_TYPE_UNSPECIFIED LicenseType = 0 + // Trial license - limited features, time-limited + LicenseType_LICENSE_TYPE_TRIAL LicenseType = 1 + // Professional license - standard features + LicenseType_LICENSE_TYPE_PROFESSIONAL LicenseType = 2 + // Enterprise license - full features, SLA support + LicenseType_LICENSE_TYPE_ENTERPRISE LicenseType = 3 + // Unlimited license - no restrictions + LicenseType_LICENSE_TYPE_UNLIMITED LicenseType = 4 +) + +// Enum value maps for LicenseType. +var ( + LicenseType_name = map[int32]string{ + 0: "LICENSE_TYPE_UNSPECIFIED", + 1: "LICENSE_TYPE_TRIAL", + 2: "LICENSE_TYPE_PROFESSIONAL", + 3: "LICENSE_TYPE_ENTERPRISE", + 4: "LICENSE_TYPE_UNLIMITED", + } + LicenseType_value = map[string]int32{ + "LICENSE_TYPE_UNSPECIFIED": 0, + "LICENSE_TYPE_TRIAL": 1, + "LICENSE_TYPE_PROFESSIONAL": 2, + "LICENSE_TYPE_ENTERPRISE": 3, + "LICENSE_TYPE_UNLIMITED": 4, + } +) + +func (x LicenseType) Enum() *LicenseType { + p := new(LicenseType) + *p = x + return p +} + +func (x LicenseType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LicenseType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_account_proto_enumTypes[0].Descriptor() +} + +func (LicenseType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_account_proto_enumTypes[0] +} + +func (x LicenseType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LicenseType.Descriptor instead. +func (LicenseType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{0} +} + +// License information for an account. +// License keys are JWT tokens signed by Redpanda and encrypted at rest. +type LicenseInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + // License type/tier + Type LicenseType `protobuf:"varint,1,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.LicenseType" json:"type,omitempty"` + // When the license expires (null for perpetual licenses) + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // When the license was issued + IssuedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=issued_at,json=issuedAt,proto3" json:"issued_at,omitempty"` + // Licensed features and their limits + // Example: {"max_gateways": 10, "max_requests_per_day": 1000000, "sso_enabled": true} + Features *structpb.Struct `protobuf:"bytes,4,opt,name=features,proto3" json:"features,omitempty"` + // Whether the license is currently valid + Valid bool `protobuf:"varint,5,opt,name=valid,proto3" json:"valid,omitempty"` + // Human-readable license status message + StatusMessage string `protobuf:"bytes,6,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LicenseInfo) Reset() { + *x = LicenseInfo{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LicenseInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseInfo) ProtoMessage() {} + +func (x *LicenseInfo) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseInfo.ProtoReflect.Descriptor instead. +func (*LicenseInfo) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{0} +} + +func (x *LicenseInfo) GetType() LicenseType { + if x != nil { + return x.Type + } + return LicenseType_LICENSE_TYPE_UNSPECIFIED +} + +func (x *LicenseInfo) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *LicenseInfo) GetIssuedAt() *timestamppb.Timestamp { + if x != nil { + return x.IssuedAt + } + return nil +} + +func (x *LicenseInfo) GetFeatures() *structpb.Struct { + if x != nil { + return x.Features + } + return nil +} + +func (x *LicenseInfo) GetValid() bool { + if x != nil { + return x.Valid + } + return false +} + +func (x *LicenseInfo) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +// Account represents a top-level billing entity. +// Accounts contain organizations and serve as the billing boundary in multi-tenant SaaS. +// Each account has an associated license key from Redpanda. +type Account struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account_id}` + // Account ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name (must be unique) + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Whether this account is active + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Required: Billing email address + BillingEmail string `protobuf:"bytes,5,opt,name=billing_email,json=billingEmail,proto3" json:"billing_email,omitempty"` + // Optional: Billing address as structured JSON + BillingAddress *structpb.Struct `protobuf:"bytes,6,opt,name=billing_address,json=billingAddress,proto3" json:"billing_address,omitempty"` + // Optional: Tax identification number + TaxId string `protobuf:"bytes,7,opt,name=tax_id,json=taxId,proto3" json:"tax_id,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,11,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,12,opt,name=updater,proto3" json:"updater,omitempty"` + // Output only. License information for this account. + // License keys are JWT tokens signed by Redpanda, stored encrypted at rest. + License *LicenseInfo `protobuf:"bytes,13,opt,name=license,proto3" json:"license,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Account) Reset() { + *x = Account{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Account) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Account) ProtoMessage() {} + +func (x *Account) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Account.ProtoReflect.Descriptor instead. +func (*Account) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{1} +} + +func (x *Account) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Account) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Account) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Account) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Account) GetBillingEmail() string { + if x != nil { + return x.BillingEmail + } + return "" +} + +func (x *Account) GetBillingAddress() *structpb.Struct { + if x != nil { + return x.BillingAddress + } + return nil +} + +func (x *Account) GetTaxId() string { + if x != nil { + return x.TaxId + } + return "" +} + +func (x *Account) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Account) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Account) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Account) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Account) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +func (x *Account) GetLicense() *LicenseInfo { + if x != nil { + return x.License + } + return nil +} + +// Request message for CreateAccount RPC. +type CreateAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The account resource to create. + Account *Account `protobuf:"bytes,2,opt,name=account,proto3" json:"account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateAccountRequest) Reset() { + *x = CreateAccountRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAccountRequest) ProtoMessage() {} + +func (x *CreateAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAccountRequest.ProtoReflect.Descriptor instead. +func (*CreateAccountRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateAccountRequest) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +// Response message for CreateAccount RPC. +type CreateAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateAccountResponse) Reset() { + *x = CreateAccountResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAccountResponse) ProtoMessage() {} + +func (x *CreateAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAccountResponse.ProtoReflect.Descriptor instead. +func (*CreateAccountResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateAccountResponse) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +// Request message for GetAccount RPC. +type GetAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the account. + // Format: `accounts/{account}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAccountRequest) Reset() { + *x = GetAccountRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountRequest) ProtoMessage() {} + +func (x *GetAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAccountRequest.ProtoReflect.Descriptor instead. +func (*GetAccountRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{4} +} + +func (x *GetAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetAccount RPC. +type GetAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAccountResponse) Reset() { + *x = GetAccountResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountResponse) ProtoMessage() {} + +func (x *GetAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAccountResponse.ProtoReflect.Descriptor instead. +func (*GetAccountResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{5} +} + +func (x *GetAccountResponse) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +// Request message for ListAccounts RPC. +type ListAccountsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Maximum number of accounts to return (max 1000) + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListAccounts call + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + // Examples: + // + // enabled == true + // display_name == "production" + // billing_email.endsWith("@example.com") + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + // Examples: "create_time desc", "display_name" + OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAccountsRequest) Reset() { + *x = ListAccountsRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAccountsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAccountsRequest) ProtoMessage() {} + +func (x *ListAccountsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAccountsRequest.ProtoReflect.Descriptor instead. +func (*ListAccountsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{6} +} + +func (x *ListAccountsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListAccountsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListAccountsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListAccountsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListAccounts RPC. +type ListAccountsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of accounts + Accounts []*Account `protobuf:"bytes,1,rep,name=accounts,proto3" json:"accounts,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching accounts + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAccountsResponse) Reset() { + *x = ListAccountsResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAccountsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAccountsResponse) ProtoMessage() {} + +func (x *ListAccountsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAccountsResponse.ProtoReflect.Descriptor instead. +func (*ListAccountsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{7} +} + +func (x *ListAccountsResponse) GetAccounts() []*Account { + if x != nil { + return x.Accounts + } + return nil +} + +func (x *ListAccountsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListAccountsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateAccount RPC. +type UpdateAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The account resource to update. + // The account's name field is used to identify the resource. + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + // The fields to update. + // If omitted, all mutable fields are updated. + // Allowed fields: display_name, description, enabled, billing_email, billing_address, tax_id, metadata + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateAccountRequest) Reset() { + *x = UpdateAccountRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAccountRequest) ProtoMessage() {} + +func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAccountRequest.ProtoReflect.Descriptor instead. +func (*UpdateAccountRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateAccountRequest) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +func (x *UpdateAccountRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateAccount RPC. +type UpdateAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateAccountResponse) Reset() { + *x = UpdateAccountResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAccountResponse) ProtoMessage() {} + +func (x *UpdateAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAccountResponse.ProtoReflect.Descriptor instead. +func (*UpdateAccountResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateAccountResponse) GetAccount() *Account { + if x != nil { + return x.Account + } + return nil +} + +// Request message for DeleteAccount RPC. +type DeleteAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the account to delete. + // Format: `accounts/{account}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all child resources (organizations, workspaces, etc.) + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAccountRequest) Reset() { + *x = DeleteAccountRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAccountRequest) ProtoMessage() {} + +func (x *DeleteAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteAccountRequest.ProtoReflect.Descriptor instead. +func (*DeleteAccountRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteAccountRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteAccount RPC. +type DeleteAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAccountResponse) Reset() { + *x = DeleteAccountResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAccountResponse) ProtoMessage() {} + +func (x *DeleteAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteAccountResponse.ProtoReflect.Descriptor instead. +func (*DeleteAccountResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{11} +} + +// Request message for SetAccountLicense RPC. +type SetAccountLicenseRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the account. + // Format: `accounts/{account}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The JWT license key signed by Redpanda. + // This will be validated and stored encrypted at rest. + LicenseKey string `protobuf:"bytes,2,opt,name=license_key,json=licenseKey,proto3" json:"license_key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetAccountLicenseRequest) Reset() { + *x = SetAccountLicenseRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetAccountLicenseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetAccountLicenseRequest) ProtoMessage() {} + +func (x *SetAccountLicenseRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetAccountLicenseRequest.ProtoReflect.Descriptor instead. +func (*SetAccountLicenseRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{12} +} + +func (x *SetAccountLicenseRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SetAccountLicenseRequest) GetLicenseKey() string { + if x != nil { + return x.LicenseKey + } + return "" +} + +// Response message for SetAccountLicense RPC. +type SetAccountLicenseResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The updated license information + License *LicenseInfo `protobuf:"bytes,1,opt,name=license,proto3" json:"license,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetAccountLicenseResponse) Reset() { + *x = SetAccountLicenseResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetAccountLicenseResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetAccountLicenseResponse) ProtoMessage() {} + +func (x *SetAccountLicenseResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetAccountLicenseResponse.ProtoReflect.Descriptor instead. +func (*SetAccountLicenseResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{13} +} + +func (x *SetAccountLicenseResponse) GetLicense() *LicenseInfo { + if x != nil { + return x.License + } + return nil +} + +// Request message for GetAccountLicense RPC. +type GetAccountLicenseRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the account. + // Format: `accounts/{account}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAccountLicenseRequest) Reset() { + *x = GetAccountLicenseRequest{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAccountLicenseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountLicenseRequest) ProtoMessage() {} + +func (x *GetAccountLicenseRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAccountLicenseRequest.ProtoReflect.Descriptor instead. +func (*GetAccountLicenseRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{14} +} + +func (x *GetAccountLicenseRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetAccountLicense RPC. +type GetAccountLicenseResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The license information for the account + License *LicenseInfo `protobuf:"bytes,1,opt,name=license,proto3" json:"license,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAccountLicenseResponse) Reset() { + *x = GetAccountLicenseResponse{} + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAccountLicenseResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountLicenseResponse) ProtoMessage() {} + +func (x *GetAccountLicenseResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_account_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAccountLicenseResponse.ProtoReflect.Descriptor instead. +func (*GetAccountLicenseResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP(), []int{15} +} + +func (x *GetAccountLicenseResponse) GetLicense() *LicenseInfo { + if x != nil { + return x.License + } + return nil +} + +var File_redpanda_api_aigateway_v1_account_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_account_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcd, 0x02, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x19, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf6, 0x05, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, + 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, + 0x0d, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x60, 0x01, + 0x52, 0x0c, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x45, + 0x0a, 0x0f, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x06, 0x74, 0x61, 0x78, 0x5f, 0x69, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x74, 0x61, 0x78, 0x49, + 0x64, 0x12, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x72, 0x12, 0x45, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x37, 0xea, 0x41, 0x34, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x22, 0x6b, + 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, + 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa2, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, + 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x9d, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x08, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x9b, 0x01, 0x0a, + 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x55, 0x0a, 0x15, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x6d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, + 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x22, + 0x5d, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, + 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x56, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, + 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x6c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2a, 0x9b, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4c, + 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x46, + 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x4c, 0x49, + 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x54, 0x45, 0x52, + 0x50, 0x52, 0x49, 0x53, 0x45, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x49, 0x43, 0x45, 0x4e, + 0x53, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, + 0x44, 0x10, 0x04, 0x32, 0xe1, 0x08, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x0c, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, + 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0xa2, 0x01, + 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x32, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x2a, 0x7d, 0x12, 0x91, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, + 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, + 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x1a, 0x19, 0xca, 0x41, + 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x81, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, + 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_account_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_account_proto_rawDescData = file_redpanda_api_aigateway_v1_account_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_account_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_account_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_account_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_account_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_account_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_account_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_account_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_redpanda_api_aigateway_v1_account_proto_goTypes = []any{ + (LicenseType)(0), // 0: redpanda.api.aigateway.v1.LicenseType + (*LicenseInfo)(nil), // 1: redpanda.api.aigateway.v1.LicenseInfo + (*Account)(nil), // 2: redpanda.api.aigateway.v1.Account + (*CreateAccountRequest)(nil), // 3: redpanda.api.aigateway.v1.CreateAccountRequest + (*CreateAccountResponse)(nil), // 4: redpanda.api.aigateway.v1.CreateAccountResponse + (*GetAccountRequest)(nil), // 5: redpanda.api.aigateway.v1.GetAccountRequest + (*GetAccountResponse)(nil), // 6: redpanda.api.aigateway.v1.GetAccountResponse + (*ListAccountsRequest)(nil), // 7: redpanda.api.aigateway.v1.ListAccountsRequest + (*ListAccountsResponse)(nil), // 8: redpanda.api.aigateway.v1.ListAccountsResponse + (*UpdateAccountRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateAccountRequest + (*UpdateAccountResponse)(nil), // 10: redpanda.api.aigateway.v1.UpdateAccountResponse + (*DeleteAccountRequest)(nil), // 11: redpanda.api.aigateway.v1.DeleteAccountRequest + (*DeleteAccountResponse)(nil), // 12: redpanda.api.aigateway.v1.DeleteAccountResponse + (*SetAccountLicenseRequest)(nil), // 13: redpanda.api.aigateway.v1.SetAccountLicenseRequest + (*SetAccountLicenseResponse)(nil), // 14: redpanda.api.aigateway.v1.SetAccountLicenseResponse + (*GetAccountLicenseRequest)(nil), // 15: redpanda.api.aigateway.v1.GetAccountLicenseRequest + (*GetAccountLicenseResponse)(nil), // 16: redpanda.api.aigateway.v1.GetAccountLicenseResponse + nil, // 17: redpanda.api.aigateway.v1.Account.MetadataEntry + (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 19: google.protobuf.Struct + (*fieldmaskpb.FieldMask)(nil), // 20: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_account_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.LicenseInfo.type:type_name -> redpanda.api.aigateway.v1.LicenseType + 18, // 1: redpanda.api.aigateway.v1.LicenseInfo.expires_at:type_name -> google.protobuf.Timestamp + 18, // 2: redpanda.api.aigateway.v1.LicenseInfo.issued_at:type_name -> google.protobuf.Timestamp + 19, // 3: redpanda.api.aigateway.v1.LicenseInfo.features:type_name -> google.protobuf.Struct + 19, // 4: redpanda.api.aigateway.v1.Account.billing_address:type_name -> google.protobuf.Struct + 17, // 5: redpanda.api.aigateway.v1.Account.metadata:type_name -> redpanda.api.aigateway.v1.Account.MetadataEntry + 18, // 6: redpanda.api.aigateway.v1.Account.create_time:type_name -> google.protobuf.Timestamp + 18, // 7: redpanda.api.aigateway.v1.Account.update_time:type_name -> google.protobuf.Timestamp + 1, // 8: redpanda.api.aigateway.v1.Account.license:type_name -> redpanda.api.aigateway.v1.LicenseInfo + 2, // 9: redpanda.api.aigateway.v1.CreateAccountRequest.account:type_name -> redpanda.api.aigateway.v1.Account + 2, // 10: redpanda.api.aigateway.v1.CreateAccountResponse.account:type_name -> redpanda.api.aigateway.v1.Account + 2, // 11: redpanda.api.aigateway.v1.GetAccountResponse.account:type_name -> redpanda.api.aigateway.v1.Account + 2, // 12: redpanda.api.aigateway.v1.ListAccountsResponse.accounts:type_name -> redpanda.api.aigateway.v1.Account + 2, // 13: redpanda.api.aigateway.v1.UpdateAccountRequest.account:type_name -> redpanda.api.aigateway.v1.Account + 20, // 14: redpanda.api.aigateway.v1.UpdateAccountRequest.update_mask:type_name -> google.protobuf.FieldMask + 2, // 15: redpanda.api.aigateway.v1.UpdateAccountResponse.account:type_name -> redpanda.api.aigateway.v1.Account + 1, // 16: redpanda.api.aigateway.v1.SetAccountLicenseResponse.license:type_name -> redpanda.api.aigateway.v1.LicenseInfo + 1, // 17: redpanda.api.aigateway.v1.GetAccountLicenseResponse.license:type_name -> redpanda.api.aigateway.v1.LicenseInfo + 3, // 18: redpanda.api.aigateway.v1.AccountService.CreateAccount:input_type -> redpanda.api.aigateway.v1.CreateAccountRequest + 5, // 19: redpanda.api.aigateway.v1.AccountService.GetAccount:input_type -> redpanda.api.aigateway.v1.GetAccountRequest + 7, // 20: redpanda.api.aigateway.v1.AccountService.ListAccounts:input_type -> redpanda.api.aigateway.v1.ListAccountsRequest + 9, // 21: redpanda.api.aigateway.v1.AccountService.UpdateAccount:input_type -> redpanda.api.aigateway.v1.UpdateAccountRequest + 11, // 22: redpanda.api.aigateway.v1.AccountService.DeleteAccount:input_type -> redpanda.api.aigateway.v1.DeleteAccountRequest + 13, // 23: redpanda.api.aigateway.v1.AccountService.SetAccountLicense:input_type -> redpanda.api.aigateway.v1.SetAccountLicenseRequest + 15, // 24: redpanda.api.aigateway.v1.AccountService.GetAccountLicense:input_type -> redpanda.api.aigateway.v1.GetAccountLicenseRequest + 4, // 25: redpanda.api.aigateway.v1.AccountService.CreateAccount:output_type -> redpanda.api.aigateway.v1.CreateAccountResponse + 6, // 26: redpanda.api.aigateway.v1.AccountService.GetAccount:output_type -> redpanda.api.aigateway.v1.GetAccountResponse + 8, // 27: redpanda.api.aigateway.v1.AccountService.ListAccounts:output_type -> redpanda.api.aigateway.v1.ListAccountsResponse + 10, // 28: redpanda.api.aigateway.v1.AccountService.UpdateAccount:output_type -> redpanda.api.aigateway.v1.UpdateAccountResponse + 12, // 29: redpanda.api.aigateway.v1.AccountService.DeleteAccount:output_type -> redpanda.api.aigateway.v1.DeleteAccountResponse + 14, // 30: redpanda.api.aigateway.v1.AccountService.SetAccountLicense:output_type -> redpanda.api.aigateway.v1.SetAccountLicenseResponse + 16, // 31: redpanda.api.aigateway.v1.AccountService.GetAccountLicense:output_type -> redpanda.api.aigateway.v1.GetAccountLicenseResponse + 25, // [25:32] is the sub-list for method output_type + 18, // [18:25] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_account_proto_init() } +func file_redpanda_api_aigateway_v1_account_proto_init() { + if File_redpanda_api_aigateway_v1_account_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_account_proto_rawDesc, + NumEnums: 1, + NumMessages: 17, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_account_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_account_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_account_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_account_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_account_proto = out.File + file_redpanda_api_aigateway_v1_account_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_account_proto_goTypes = nil + file_redpanda_api_aigateway_v1_account_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.gw.go new file mode 100644 index 0000000000..8f133b57fb --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/account.pb.gw.go @@ -0,0 +1,683 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/account.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_AccountService_CreateAccount_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateAccountRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.CreateAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_CreateAccount_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateAccountRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateAccount(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccountService_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAccountRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAccountRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetAccount(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccountService_ListAccounts_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AccountService_ListAccounts_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListAccountsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_ListAccounts_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListAccounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_ListAccounts_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListAccountsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_ListAccounts_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListAccounts(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccountService_UpdateAccount_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_AccountService_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateAccountRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Account); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["account.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "account.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "account.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "account.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_UpdateAccount_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateAccountRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Account); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["account.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "account.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "account.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "account.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_UpdateAccount_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateAccount(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AccountService_DeleteAccount_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_AccountService_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteAccountRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_DeleteAccount_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteAccountRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AccountService_DeleteAccount_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteAccount(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccountService_SetAccountLicense_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SetAccountLicenseRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.SetAccountLicense(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_SetAccountLicense_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SetAccountLicenseRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.SetAccountLicense(ctx, &protoReq) + return msg, metadata, err +} + +func request_AccountService_GetAccountLicense_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAccountLicenseRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetAccountLicense(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AccountService_GetAccountLicense_0(ctx context.Context, marshaler runtime.Marshaler, server AccountServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAccountLicenseRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetAccountLicense(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterAccountServiceHandlerServer registers the http handlers for service AccountService to "mux". +// UnaryRPC :call AccountServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAccountServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterAccountServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AccountServiceServer) error { + mux.Handle(http.MethodPost, pattern_AccountService_CreateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/CreateAccount", runtime.WithHTTPPathPattern("/v1/accounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_CreateAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_CreateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/GetAccount", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_GetAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/ListAccounts", runtime.WithHTTPPathPattern("/v1/accounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_ListAccounts_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_ListAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_AccountService_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/UpdateAccount", runtime.WithHTTPPathPattern("/v1/{account.name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_UpdateAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AccountService_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/DeleteAccount", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_DeleteAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccountService_SetAccountLicense_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/SetAccountLicense", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}:setLicense")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_SetAccountLicense_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_SetAccountLicense_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_GetAccountLicense_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/GetAccountLicense", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}/license")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AccountService_GetAccountLicense_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_GetAccountLicense_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterAccountServiceHandlerFromEndpoint is same as RegisterAccountServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAccountServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterAccountServiceHandler(ctx, mux, conn) +} + +// RegisterAccountServiceHandler registers the http handlers for service AccountService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAccountServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAccountServiceHandlerClient(ctx, mux, NewAccountServiceClient(conn)) +} + +// RegisterAccountServiceHandlerClient registers the http handlers for service AccountService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AccountServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AccountServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AccountServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterAccountServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AccountServiceClient) error { + mux.Handle(http.MethodPost, pattern_AccountService_CreateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/CreateAccount", runtime.WithHTTPPathPattern("/v1/accounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_CreateAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_CreateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/GetAccount", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_GetAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/ListAccounts", runtime.WithHTTPPathPattern("/v1/accounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_ListAccounts_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_ListAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_AccountService_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/UpdateAccount", runtime.WithHTTPPathPattern("/v1/{account.name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_UpdateAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AccountService_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/DeleteAccount", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_DeleteAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AccountService_SetAccountLicense_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/SetAccountLicense", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}:setLicense")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_SetAccountLicense_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_SetAccountLicense_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AccountService_GetAccountLicense_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AccountService/GetAccountLicense", runtime.WithHTTPPathPattern("/v1/{name=accounts/*}/license")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AccountService_GetAccountLicense_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AccountService_GetAccountLicense_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_AccountService_CreateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "accounts"}, "")) + pattern_AccountService_GetAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "accounts", "name"}, "")) + pattern_AccountService_ListAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "accounts"}, "")) + pattern_AccountService_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "accounts", "account.name"}, "")) + pattern_AccountService_DeleteAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "accounts", "name"}, "")) + pattern_AccountService_SetAccountLicense_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "accounts", "name"}, "setLicense")) + pattern_AccountService_GetAccountLicense_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "name", "license"}, "")) +) + +var ( + forward_AccountService_CreateAccount_0 = runtime.ForwardResponseMessage + forward_AccountService_GetAccount_0 = runtime.ForwardResponseMessage + forward_AccountService_ListAccounts_0 = runtime.ForwardResponseMessage + forward_AccountService_UpdateAccount_0 = runtime.ForwardResponseMessage + forward_AccountService_DeleteAccount_0 = runtime.ForwardResponseMessage + forward_AccountService_SetAccountLicense_0 = runtime.ForwardResponseMessage + forward_AccountService_GetAccountLicense_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/account_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/account_grpc.pb.go new file mode 100644 index 0000000000..301e738995 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/account_grpc.pb.go @@ -0,0 +1,378 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/account.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AccountService_CreateAccount_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/CreateAccount" + AccountService_GetAccount_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/GetAccount" + AccountService_ListAccounts_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/ListAccounts" + AccountService_UpdateAccount_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/UpdateAccount" + AccountService_DeleteAccount_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/DeleteAccount" + AccountService_SetAccountLicense_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/SetAccountLicense" + AccountService_GetAccountLicense_FullMethodName = "/redpanda.api.aigateway.v1.AccountService/GetAccountLicense" +) + +// AccountServiceClient is the client API for AccountService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AccountService manages accounts - top-level billing entities. +// An account contains one or more organizations and serves as the billing boundary. +// Resource name: accounts/{account_id} +type AccountServiceClient interface { + // Creates a new account. + CreateAccount(ctx context.Context, in *CreateAccountRequest, opts ...grpc.CallOption) (*CreateAccountResponse, error) + // Gets an account by name. + GetAccount(ctx context.Context, in *GetAccountRequest, opts ...grpc.CallOption) (*GetAccountResponse, error) + // Lists accounts. + ListAccounts(ctx context.Context, in *ListAccountsRequest, opts ...grpc.CallOption) (*ListAccountsResponse, error) + // Updates an account. + UpdateAccount(ctx context.Context, in *UpdateAccountRequest, opts ...grpc.CallOption) (*UpdateAccountResponse, error) + // Deletes an account. + DeleteAccount(ctx context.Context, in *DeleteAccountRequest, opts ...grpc.CallOption) (*DeleteAccountResponse, error) + // Sets the license key for an account. + // The license key is a JWT token signed by Redpanda. + // This operation will validate the JWT and store it encrypted at rest. + SetAccountLicense(ctx context.Context, in *SetAccountLicenseRequest, opts ...grpc.CallOption) (*SetAccountLicenseResponse, error) + // Gets the current license information for an account. + // Returns the decoded license info without the encrypted key. + GetAccountLicense(ctx context.Context, in *GetAccountLicenseRequest, opts ...grpc.CallOption) (*GetAccountLicenseResponse, error) +} + +type accountServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAccountServiceClient(cc grpc.ClientConnInterface) AccountServiceClient { + return &accountServiceClient{cc} +} + +func (c *accountServiceClient) CreateAccount(ctx context.Context, in *CreateAccountRequest, opts ...grpc.CallOption) (*CreateAccountResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateAccountResponse) + err := c.cc.Invoke(ctx, AccountService_CreateAccount_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) GetAccount(ctx context.Context, in *GetAccountRequest, opts ...grpc.CallOption) (*GetAccountResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAccountResponse) + err := c.cc.Invoke(ctx, AccountService_GetAccount_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) ListAccounts(ctx context.Context, in *ListAccountsRequest, opts ...grpc.CallOption) (*ListAccountsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListAccountsResponse) + err := c.cc.Invoke(ctx, AccountService_ListAccounts_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) UpdateAccount(ctx context.Context, in *UpdateAccountRequest, opts ...grpc.CallOption) (*UpdateAccountResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateAccountResponse) + err := c.cc.Invoke(ctx, AccountService_UpdateAccount_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) DeleteAccount(ctx context.Context, in *DeleteAccountRequest, opts ...grpc.CallOption) (*DeleteAccountResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteAccountResponse) + err := c.cc.Invoke(ctx, AccountService_DeleteAccount_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) SetAccountLicense(ctx context.Context, in *SetAccountLicenseRequest, opts ...grpc.CallOption) (*SetAccountLicenseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SetAccountLicenseResponse) + err := c.cc.Invoke(ctx, AccountService_SetAccountLicense_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *accountServiceClient) GetAccountLicense(ctx context.Context, in *GetAccountLicenseRequest, opts ...grpc.CallOption) (*GetAccountLicenseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAccountLicenseResponse) + err := c.cc.Invoke(ctx, AccountService_GetAccountLicense_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AccountServiceServer is the server API for AccountService service. +// All implementations must embed UnimplementedAccountServiceServer +// for forward compatibility. +// +// AccountService manages accounts - top-level billing entities. +// An account contains one or more organizations and serves as the billing boundary. +// Resource name: accounts/{account_id} +type AccountServiceServer interface { + // Creates a new account. + CreateAccount(context.Context, *CreateAccountRequest) (*CreateAccountResponse, error) + // Gets an account by name. + GetAccount(context.Context, *GetAccountRequest) (*GetAccountResponse, error) + // Lists accounts. + ListAccounts(context.Context, *ListAccountsRequest) (*ListAccountsResponse, error) + // Updates an account. + UpdateAccount(context.Context, *UpdateAccountRequest) (*UpdateAccountResponse, error) + // Deletes an account. + DeleteAccount(context.Context, *DeleteAccountRequest) (*DeleteAccountResponse, error) + // Sets the license key for an account. + // The license key is a JWT token signed by Redpanda. + // This operation will validate the JWT and store it encrypted at rest. + SetAccountLicense(context.Context, *SetAccountLicenseRequest) (*SetAccountLicenseResponse, error) + // Gets the current license information for an account. + // Returns the decoded license info without the encrypted key. + GetAccountLicense(context.Context, *GetAccountLicenseRequest) (*GetAccountLicenseResponse, error) + mustEmbedUnimplementedAccountServiceServer() +} + +// UnimplementedAccountServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAccountServiceServer struct{} + +func (UnimplementedAccountServiceServer) CreateAccount(context.Context, *CreateAccountRequest) (*CreateAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAccount not implemented") +} +func (UnimplementedAccountServiceServer) GetAccount(context.Context, *GetAccountRequest) (*GetAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAccount not implemented") +} +func (UnimplementedAccountServiceServer) ListAccounts(context.Context, *ListAccountsRequest) (*ListAccountsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListAccounts not implemented") +} +func (UnimplementedAccountServiceServer) UpdateAccount(context.Context, *UpdateAccountRequest) (*UpdateAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAccount not implemented") +} +func (UnimplementedAccountServiceServer) DeleteAccount(context.Context, *DeleteAccountRequest) (*DeleteAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAccount not implemented") +} +func (UnimplementedAccountServiceServer) SetAccountLicense(context.Context, *SetAccountLicenseRequest) (*SetAccountLicenseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetAccountLicense not implemented") +} +func (UnimplementedAccountServiceServer) GetAccountLicense(context.Context, *GetAccountLicenseRequest) (*GetAccountLicenseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAccountLicense not implemented") +} +func (UnimplementedAccountServiceServer) mustEmbedUnimplementedAccountServiceServer() {} +func (UnimplementedAccountServiceServer) testEmbeddedByValue() {} + +// UnsafeAccountServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AccountServiceServer will +// result in compilation errors. +type UnsafeAccountServiceServer interface { + mustEmbedUnimplementedAccountServiceServer() +} + +func RegisterAccountServiceServer(s grpc.ServiceRegistrar, srv AccountServiceServer) { + // If the following call pancis, it indicates UnimplementedAccountServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AccountService_ServiceDesc, srv) +} + +func _AccountService_CreateAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).CreateAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_CreateAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).CreateAccount(ctx, req.(*CreateAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_GetAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).GetAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_GetAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).GetAccount(ctx, req.(*GetAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_ListAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAccountsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).ListAccounts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_ListAccounts_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).ListAccounts(ctx, req.(*ListAccountsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_UpdateAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).UpdateAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_UpdateAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).UpdateAccount(ctx, req.(*UpdateAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_DeleteAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).DeleteAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_DeleteAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).DeleteAccount(ctx, req.(*DeleteAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_SetAccountLicense_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetAccountLicenseRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).SetAccountLicense(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_SetAccountLicense_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).SetAccountLicense(ctx, req.(*SetAccountLicenseRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AccountService_GetAccountLicense_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAccountLicenseRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AccountServiceServer).GetAccountLicense(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AccountService_GetAccountLicense_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AccountServiceServer).GetAccountLicense(ctx, req.(*GetAccountLicenseRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AccountService_ServiceDesc is the grpc.ServiceDesc for AccountService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AccountService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.AccountService", + HandlerType: (*AccountServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateAccount", + Handler: _AccountService_CreateAccount_Handler, + }, + { + MethodName: "GetAccount", + Handler: _AccountService_GetAccount_Handler, + }, + { + MethodName: "ListAccounts", + Handler: _AccountService_ListAccounts_Handler, + }, + { + MethodName: "UpdateAccount", + Handler: _AccountService_UpdateAccount_Handler, + }, + { + MethodName: "DeleteAccount", + Handler: _AccountService_DeleteAccount_Handler, + }, + { + MethodName: "SetAccountLicense", + Handler: _AccountService_SetAccountLicense_Handler, + }, + { + MethodName: "GetAccountLicense", + Handler: _AccountService_GetAccountLicense_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/account.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.go new file mode 100644 index 0000000000..8c71b491ef --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.go @@ -0,0 +1,375 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/access_control.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AccessControlServiceName is the fully-qualified name of the AccessControlService service. + AccessControlServiceName = "redpanda.api.aigateway.v1.AccessControlService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AccessControlServiceCreatePolicyProcedure is the fully-qualified name of the + // AccessControlService's CreatePolicy RPC. + AccessControlServiceCreatePolicyProcedure = "/redpanda.api.aigateway.v1.AccessControlService/CreatePolicy" + // AccessControlServiceGetPolicyProcedure is the fully-qualified name of the AccessControlService's + // GetPolicy RPC. + AccessControlServiceGetPolicyProcedure = "/redpanda.api.aigateway.v1.AccessControlService/GetPolicy" + // AccessControlServiceListPoliciesProcedure is the fully-qualified name of the + // AccessControlService's ListPolicies RPC. + AccessControlServiceListPoliciesProcedure = "/redpanda.api.aigateway.v1.AccessControlService/ListPolicies" + // AccessControlServiceUpdatePolicyProcedure is the fully-qualified name of the + // AccessControlService's UpdatePolicy RPC. + AccessControlServiceUpdatePolicyProcedure = "/redpanda.api.aigateway.v1.AccessControlService/UpdatePolicy" + // AccessControlServiceDeletePolicyProcedure is the fully-qualified name of the + // AccessControlService's DeletePolicy RPC. + AccessControlServiceDeletePolicyProcedure = "/redpanda.api.aigateway.v1.AccessControlService/DeletePolicy" + // AccessControlServiceValidatePolicyProcedure is the fully-qualified name of the + // AccessControlService's ValidatePolicy RPC. + AccessControlServiceValidatePolicyProcedure = "/redpanda.api.aigateway.v1.AccessControlService/ValidatePolicy" + // AccessControlServiceEvaluateAccessProcedure is the fully-qualified name of the + // AccessControlService's EvaluateAccess RPC. + AccessControlServiceEvaluateAccessProcedure = "/redpanda.api.aigateway.v1.AccessControlService/EvaluateAccess" + // AccessControlServiceListPolicyVersionsProcedure is the fully-qualified name of the + // AccessControlService's ListPolicyVersions RPC. + AccessControlServiceListPolicyVersionsProcedure = "/redpanda.api.aigateway.v1.AccessControlService/ListPolicyVersions" + // AccessControlServiceGetPolicyEntitiesProcedure is the fully-qualified name of the + // AccessControlService's GetPolicyEntities RPC. + AccessControlServiceGetPolicyEntitiesProcedure = "/redpanda.api.aigateway.v1.AccessControlService/GetPolicyEntities" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + accessControlServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_access_control_proto.Services().ByName("AccessControlService") + accessControlServiceCreatePolicyMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("CreatePolicy") + accessControlServiceGetPolicyMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("GetPolicy") + accessControlServiceListPoliciesMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("ListPolicies") + accessControlServiceUpdatePolicyMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("UpdatePolicy") + accessControlServiceDeletePolicyMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("DeletePolicy") + accessControlServiceValidatePolicyMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("ValidatePolicy") + accessControlServiceEvaluateAccessMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("EvaluateAccess") + accessControlServiceListPolicyVersionsMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("ListPolicyVersions") + accessControlServiceGetPolicyEntitiesMethodDescriptor = accessControlServiceServiceDescriptor.Methods().ByName("GetPolicyEntities") +) + +// AccessControlServiceClient is a client for the redpanda.api.aigateway.v1.AccessControlService +// service. +type AccessControlServiceClient interface { + // Creates a new Cedar policy. + CreatePolicy(context.Context, *connect.Request[v1.CreatePolicyRequest]) (*connect.Response[v1.CreatePolicyResponse], error) + // Gets a policy by name. + GetPolicy(context.Context, *connect.Request[v1.GetPolicyRequest]) (*connect.Response[v1.GetPolicyResponse], error) + // Lists policies within a workspace. + ListPolicies(context.Context, *connect.Request[v1.ListPoliciesRequest]) (*connect.Response[v1.ListPoliciesResponse], error) + // Updates a policy. + UpdatePolicy(context.Context, *connect.Request[v1.UpdatePolicyRequest]) (*connect.Response[v1.UpdatePolicyResponse], error) + // Deletes a policy. + DeletePolicy(context.Context, *connect.Request[v1.DeletePolicyRequest]) (*connect.Response[v1.DeletePolicyResponse], error) + // Validates a Cedar policy without saving it. + ValidatePolicy(context.Context, *connect.Request[v1.ValidatePolicyRequest]) (*connect.Response[v1.ValidatePolicyResponse], error) + // Evaluates an authorization request against policies. + EvaluateAccess(context.Context, *connect.Request[v1.EvaluateAccessRequest]) (*connect.Response[v1.EvaluateAccessResponse], error) + // Lists policy versions (audit trail). + ListPolicyVersions(context.Context, *connect.Request[v1.ListPolicyVersionsRequest]) (*connect.Response[v1.ListPolicyVersionsResponse], error) + // Gets available entities for policy authoring (autocomplete). + GetPolicyEntities(context.Context, *connect.Request[v1.GetPolicyEntitiesRequest]) (*connect.Response[v1.GetPolicyEntitiesResponse], error) +} + +// NewAccessControlServiceClient constructs a client for the +// redpanda.api.aigateway.v1.AccessControlService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAccessControlServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AccessControlServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &accessControlServiceClient{ + createPolicy: connect.NewClient[v1.CreatePolicyRequest, v1.CreatePolicyResponse]( + httpClient, + baseURL+AccessControlServiceCreatePolicyProcedure, + connect.WithSchema(accessControlServiceCreatePolicyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getPolicy: connect.NewClient[v1.GetPolicyRequest, v1.GetPolicyResponse]( + httpClient, + baseURL+AccessControlServiceGetPolicyProcedure, + connect.WithSchema(accessControlServiceGetPolicyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listPolicies: connect.NewClient[v1.ListPoliciesRequest, v1.ListPoliciesResponse]( + httpClient, + baseURL+AccessControlServiceListPoliciesProcedure, + connect.WithSchema(accessControlServiceListPoliciesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updatePolicy: connect.NewClient[v1.UpdatePolicyRequest, v1.UpdatePolicyResponse]( + httpClient, + baseURL+AccessControlServiceUpdatePolicyProcedure, + connect.WithSchema(accessControlServiceUpdatePolicyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deletePolicy: connect.NewClient[v1.DeletePolicyRequest, v1.DeletePolicyResponse]( + httpClient, + baseURL+AccessControlServiceDeletePolicyProcedure, + connect.WithSchema(accessControlServiceDeletePolicyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + validatePolicy: connect.NewClient[v1.ValidatePolicyRequest, v1.ValidatePolicyResponse]( + httpClient, + baseURL+AccessControlServiceValidatePolicyProcedure, + connect.WithSchema(accessControlServiceValidatePolicyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + evaluateAccess: connect.NewClient[v1.EvaluateAccessRequest, v1.EvaluateAccessResponse]( + httpClient, + baseURL+AccessControlServiceEvaluateAccessProcedure, + connect.WithSchema(accessControlServiceEvaluateAccessMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listPolicyVersions: connect.NewClient[v1.ListPolicyVersionsRequest, v1.ListPolicyVersionsResponse]( + httpClient, + baseURL+AccessControlServiceListPolicyVersionsProcedure, + connect.WithSchema(accessControlServiceListPolicyVersionsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getPolicyEntities: connect.NewClient[v1.GetPolicyEntitiesRequest, v1.GetPolicyEntitiesResponse]( + httpClient, + baseURL+AccessControlServiceGetPolicyEntitiesProcedure, + connect.WithSchema(accessControlServiceGetPolicyEntitiesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// accessControlServiceClient implements AccessControlServiceClient. +type accessControlServiceClient struct { + createPolicy *connect.Client[v1.CreatePolicyRequest, v1.CreatePolicyResponse] + getPolicy *connect.Client[v1.GetPolicyRequest, v1.GetPolicyResponse] + listPolicies *connect.Client[v1.ListPoliciesRequest, v1.ListPoliciesResponse] + updatePolicy *connect.Client[v1.UpdatePolicyRequest, v1.UpdatePolicyResponse] + deletePolicy *connect.Client[v1.DeletePolicyRequest, v1.DeletePolicyResponse] + validatePolicy *connect.Client[v1.ValidatePolicyRequest, v1.ValidatePolicyResponse] + evaluateAccess *connect.Client[v1.EvaluateAccessRequest, v1.EvaluateAccessResponse] + listPolicyVersions *connect.Client[v1.ListPolicyVersionsRequest, v1.ListPolicyVersionsResponse] + getPolicyEntities *connect.Client[v1.GetPolicyEntitiesRequest, v1.GetPolicyEntitiesResponse] +} + +// CreatePolicy calls redpanda.api.aigateway.v1.AccessControlService.CreatePolicy. +func (c *accessControlServiceClient) CreatePolicy(ctx context.Context, req *connect.Request[v1.CreatePolicyRequest]) (*connect.Response[v1.CreatePolicyResponse], error) { + return c.createPolicy.CallUnary(ctx, req) +} + +// GetPolicy calls redpanda.api.aigateway.v1.AccessControlService.GetPolicy. +func (c *accessControlServiceClient) GetPolicy(ctx context.Context, req *connect.Request[v1.GetPolicyRequest]) (*connect.Response[v1.GetPolicyResponse], error) { + return c.getPolicy.CallUnary(ctx, req) +} + +// ListPolicies calls redpanda.api.aigateway.v1.AccessControlService.ListPolicies. +func (c *accessControlServiceClient) ListPolicies(ctx context.Context, req *connect.Request[v1.ListPoliciesRequest]) (*connect.Response[v1.ListPoliciesResponse], error) { + return c.listPolicies.CallUnary(ctx, req) +} + +// UpdatePolicy calls redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy. +func (c *accessControlServiceClient) UpdatePolicy(ctx context.Context, req *connect.Request[v1.UpdatePolicyRequest]) (*connect.Response[v1.UpdatePolicyResponse], error) { + return c.updatePolicy.CallUnary(ctx, req) +} + +// DeletePolicy calls redpanda.api.aigateway.v1.AccessControlService.DeletePolicy. +func (c *accessControlServiceClient) DeletePolicy(ctx context.Context, req *connect.Request[v1.DeletePolicyRequest]) (*connect.Response[v1.DeletePolicyResponse], error) { + return c.deletePolicy.CallUnary(ctx, req) +} + +// ValidatePolicy calls redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy. +func (c *accessControlServiceClient) ValidatePolicy(ctx context.Context, req *connect.Request[v1.ValidatePolicyRequest]) (*connect.Response[v1.ValidatePolicyResponse], error) { + return c.validatePolicy.CallUnary(ctx, req) +} + +// EvaluateAccess calls redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess. +func (c *accessControlServiceClient) EvaluateAccess(ctx context.Context, req *connect.Request[v1.EvaluateAccessRequest]) (*connect.Response[v1.EvaluateAccessResponse], error) { + return c.evaluateAccess.CallUnary(ctx, req) +} + +// ListPolicyVersions calls redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions. +func (c *accessControlServiceClient) ListPolicyVersions(ctx context.Context, req *connect.Request[v1.ListPolicyVersionsRequest]) (*connect.Response[v1.ListPolicyVersionsResponse], error) { + return c.listPolicyVersions.CallUnary(ctx, req) +} + +// GetPolicyEntities calls redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities. +func (c *accessControlServiceClient) GetPolicyEntities(ctx context.Context, req *connect.Request[v1.GetPolicyEntitiesRequest]) (*connect.Response[v1.GetPolicyEntitiesResponse], error) { + return c.getPolicyEntities.CallUnary(ctx, req) +} + +// AccessControlServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.AccessControlService service. +type AccessControlServiceHandler interface { + // Creates a new Cedar policy. + CreatePolicy(context.Context, *connect.Request[v1.CreatePolicyRequest]) (*connect.Response[v1.CreatePolicyResponse], error) + // Gets a policy by name. + GetPolicy(context.Context, *connect.Request[v1.GetPolicyRequest]) (*connect.Response[v1.GetPolicyResponse], error) + // Lists policies within a workspace. + ListPolicies(context.Context, *connect.Request[v1.ListPoliciesRequest]) (*connect.Response[v1.ListPoliciesResponse], error) + // Updates a policy. + UpdatePolicy(context.Context, *connect.Request[v1.UpdatePolicyRequest]) (*connect.Response[v1.UpdatePolicyResponse], error) + // Deletes a policy. + DeletePolicy(context.Context, *connect.Request[v1.DeletePolicyRequest]) (*connect.Response[v1.DeletePolicyResponse], error) + // Validates a Cedar policy without saving it. + ValidatePolicy(context.Context, *connect.Request[v1.ValidatePolicyRequest]) (*connect.Response[v1.ValidatePolicyResponse], error) + // Evaluates an authorization request against policies. + EvaluateAccess(context.Context, *connect.Request[v1.EvaluateAccessRequest]) (*connect.Response[v1.EvaluateAccessResponse], error) + // Lists policy versions (audit trail). + ListPolicyVersions(context.Context, *connect.Request[v1.ListPolicyVersionsRequest]) (*connect.Response[v1.ListPolicyVersionsResponse], error) + // Gets available entities for policy authoring (autocomplete). + GetPolicyEntities(context.Context, *connect.Request[v1.GetPolicyEntitiesRequest]) (*connect.Response[v1.GetPolicyEntitiesResponse], error) +} + +// NewAccessControlServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAccessControlServiceHandler(svc AccessControlServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + accessControlServiceCreatePolicyHandler := connect.NewUnaryHandler( + AccessControlServiceCreatePolicyProcedure, + svc.CreatePolicy, + connect.WithSchema(accessControlServiceCreatePolicyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceGetPolicyHandler := connect.NewUnaryHandler( + AccessControlServiceGetPolicyProcedure, + svc.GetPolicy, + connect.WithSchema(accessControlServiceGetPolicyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceListPoliciesHandler := connect.NewUnaryHandler( + AccessControlServiceListPoliciesProcedure, + svc.ListPolicies, + connect.WithSchema(accessControlServiceListPoliciesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceUpdatePolicyHandler := connect.NewUnaryHandler( + AccessControlServiceUpdatePolicyProcedure, + svc.UpdatePolicy, + connect.WithSchema(accessControlServiceUpdatePolicyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceDeletePolicyHandler := connect.NewUnaryHandler( + AccessControlServiceDeletePolicyProcedure, + svc.DeletePolicy, + connect.WithSchema(accessControlServiceDeletePolicyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceValidatePolicyHandler := connect.NewUnaryHandler( + AccessControlServiceValidatePolicyProcedure, + svc.ValidatePolicy, + connect.WithSchema(accessControlServiceValidatePolicyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceEvaluateAccessHandler := connect.NewUnaryHandler( + AccessControlServiceEvaluateAccessProcedure, + svc.EvaluateAccess, + connect.WithSchema(accessControlServiceEvaluateAccessMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceListPolicyVersionsHandler := connect.NewUnaryHandler( + AccessControlServiceListPolicyVersionsProcedure, + svc.ListPolicyVersions, + connect.WithSchema(accessControlServiceListPolicyVersionsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accessControlServiceGetPolicyEntitiesHandler := connect.NewUnaryHandler( + AccessControlServiceGetPolicyEntitiesProcedure, + svc.GetPolicyEntities, + connect.WithSchema(accessControlServiceGetPolicyEntitiesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.AccessControlService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AccessControlServiceCreatePolicyProcedure: + accessControlServiceCreatePolicyHandler.ServeHTTP(w, r) + case AccessControlServiceGetPolicyProcedure: + accessControlServiceGetPolicyHandler.ServeHTTP(w, r) + case AccessControlServiceListPoliciesProcedure: + accessControlServiceListPoliciesHandler.ServeHTTP(w, r) + case AccessControlServiceUpdatePolicyProcedure: + accessControlServiceUpdatePolicyHandler.ServeHTTP(w, r) + case AccessControlServiceDeletePolicyProcedure: + accessControlServiceDeletePolicyHandler.ServeHTTP(w, r) + case AccessControlServiceValidatePolicyProcedure: + accessControlServiceValidatePolicyHandler.ServeHTTP(w, r) + case AccessControlServiceEvaluateAccessProcedure: + accessControlServiceEvaluateAccessHandler.ServeHTTP(w, r) + case AccessControlServiceListPolicyVersionsProcedure: + accessControlServiceListPolicyVersionsHandler.ServeHTTP(w, r) + case AccessControlServiceGetPolicyEntitiesProcedure: + accessControlServiceGetPolicyEntitiesHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAccessControlServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAccessControlServiceHandler struct{} + +func (UnimplementedAccessControlServiceHandler) CreatePolicy(context.Context, *connect.Request[v1.CreatePolicyRequest]) (*connect.Response[v1.CreatePolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.CreatePolicy is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) GetPolicy(context.Context, *connect.Request[v1.GetPolicyRequest]) (*connect.Response[v1.GetPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.GetPolicy is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) ListPolicies(context.Context, *connect.Request[v1.ListPoliciesRequest]) (*connect.Response[v1.ListPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.ListPolicies is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) UpdatePolicy(context.Context, *connect.Request[v1.UpdatePolicyRequest]) (*connect.Response[v1.UpdatePolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) DeletePolicy(context.Context, *connect.Request[v1.DeletePolicyRequest]) (*connect.Response[v1.DeletePolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.DeletePolicy is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) ValidatePolicy(context.Context, *connect.Request[v1.ValidatePolicyRequest]) (*connect.Response[v1.ValidatePolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) EvaluateAccess(context.Context, *connect.Request[v1.EvaluateAccessRequest]) (*connect.Response[v1.EvaluateAccessResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) ListPolicyVersions(context.Context, *connect.Request[v1.ListPolicyVersionsRequest]) (*connect.Response[v1.ListPolicyVersionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions is not implemented")) +} + +func (UnimplementedAccessControlServiceHandler) GetPolicyEntities(context.Context, *connect.Request[v1.GetPolicyEntitiesRequest]) (*connect.Response[v1.GetPolicyEntitiesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.gw.go new file mode 100644 index 0000000000..4f4381f7a3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/access_control.connect.gw.go @@ -0,0 +1,89 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/access_control.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// AccessControlServiceGatewayServer implements the gRPC server API for the AccessControlService +// service. +type AccessControlServiceGatewayServer struct { + v1.UnimplementedAccessControlServiceServer + createPolicy connect_gateway.UnaryHandler[v1.CreatePolicyRequest, v1.CreatePolicyResponse] + getPolicy connect_gateway.UnaryHandler[v1.GetPolicyRequest, v1.GetPolicyResponse] + listPolicies connect_gateway.UnaryHandler[v1.ListPoliciesRequest, v1.ListPoliciesResponse] + updatePolicy connect_gateway.UnaryHandler[v1.UpdatePolicyRequest, v1.UpdatePolicyResponse] + deletePolicy connect_gateway.UnaryHandler[v1.DeletePolicyRequest, v1.DeletePolicyResponse] + validatePolicy connect_gateway.UnaryHandler[v1.ValidatePolicyRequest, v1.ValidatePolicyResponse] + evaluateAccess connect_gateway.UnaryHandler[v1.EvaluateAccessRequest, v1.EvaluateAccessResponse] + listPolicyVersions connect_gateway.UnaryHandler[v1.ListPolicyVersionsRequest, v1.ListPolicyVersionsResponse] + getPolicyEntities connect_gateway.UnaryHandler[v1.GetPolicyEntitiesRequest, v1.GetPolicyEntitiesResponse] +} + +// NewAccessControlServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// AccessControlService service. +func NewAccessControlServiceGatewayServer(svc AccessControlServiceHandler, opts ...connect_gateway.HandlerOption) *AccessControlServiceGatewayServer { + return &AccessControlServiceGatewayServer{ + createPolicy: connect_gateway.NewUnaryHandler(AccessControlServiceCreatePolicyProcedure, svc.CreatePolicy, opts...), + getPolicy: connect_gateway.NewUnaryHandler(AccessControlServiceGetPolicyProcedure, svc.GetPolicy, opts...), + listPolicies: connect_gateway.NewUnaryHandler(AccessControlServiceListPoliciesProcedure, svc.ListPolicies, opts...), + updatePolicy: connect_gateway.NewUnaryHandler(AccessControlServiceUpdatePolicyProcedure, svc.UpdatePolicy, opts...), + deletePolicy: connect_gateway.NewUnaryHandler(AccessControlServiceDeletePolicyProcedure, svc.DeletePolicy, opts...), + validatePolicy: connect_gateway.NewUnaryHandler(AccessControlServiceValidatePolicyProcedure, svc.ValidatePolicy, opts...), + evaluateAccess: connect_gateway.NewUnaryHandler(AccessControlServiceEvaluateAccessProcedure, svc.EvaluateAccess, opts...), + listPolicyVersions: connect_gateway.NewUnaryHandler(AccessControlServiceListPolicyVersionsProcedure, svc.ListPolicyVersions, opts...), + getPolicyEntities: connect_gateway.NewUnaryHandler(AccessControlServiceGetPolicyEntitiesProcedure, svc.GetPolicyEntities, opts...), + } +} + +func (s *AccessControlServiceGatewayServer) CreatePolicy(ctx context.Context, req *v1.CreatePolicyRequest) (*v1.CreatePolicyResponse, error) { + return s.createPolicy(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) GetPolicy(ctx context.Context, req *v1.GetPolicyRequest) (*v1.GetPolicyResponse, error) { + return s.getPolicy(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) ListPolicies(ctx context.Context, req *v1.ListPoliciesRequest) (*v1.ListPoliciesResponse, error) { + return s.listPolicies(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) UpdatePolicy(ctx context.Context, req *v1.UpdatePolicyRequest) (*v1.UpdatePolicyResponse, error) { + return s.updatePolicy(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) DeletePolicy(ctx context.Context, req *v1.DeletePolicyRequest) (*v1.DeletePolicyResponse, error) { + return s.deletePolicy(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) ValidatePolicy(ctx context.Context, req *v1.ValidatePolicyRequest) (*v1.ValidatePolicyResponse, error) { + return s.validatePolicy(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) EvaluateAccess(ctx context.Context, req *v1.EvaluateAccessRequest) (*v1.EvaluateAccessResponse, error) { + return s.evaluateAccess(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) ListPolicyVersions(ctx context.Context, req *v1.ListPolicyVersionsRequest) (*v1.ListPolicyVersionsResponse, error) { + return s.listPolicyVersions(ctx, req) +} + +func (s *AccessControlServiceGatewayServer) GetPolicyEntities(ctx context.Context, req *v1.GetPolicyEntitiesRequest) (*v1.GetPolicyEntitiesResponse, error) { + return s.getPolicyEntities(ctx, req) +} + +// RegisterAccessControlServiceHandlerGatewayServer registers the Connect handlers for the +// AccessControlService "svc" to "mux". +func RegisterAccessControlServiceHandlerGatewayServer(mux *runtime.ServeMux, svc AccessControlServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterAccessControlServiceHandlerServer(context.TODO(), mux, NewAccessControlServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.go new file mode 100644 index 0000000000..7b43d94971 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.go @@ -0,0 +1,315 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/account.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AccountServiceName is the fully-qualified name of the AccountService service. + AccountServiceName = "redpanda.api.aigateway.v1.AccountService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AccountServiceCreateAccountProcedure is the fully-qualified name of the AccountService's + // CreateAccount RPC. + AccountServiceCreateAccountProcedure = "/redpanda.api.aigateway.v1.AccountService/CreateAccount" + // AccountServiceGetAccountProcedure is the fully-qualified name of the AccountService's GetAccount + // RPC. + AccountServiceGetAccountProcedure = "/redpanda.api.aigateway.v1.AccountService/GetAccount" + // AccountServiceListAccountsProcedure is the fully-qualified name of the AccountService's + // ListAccounts RPC. + AccountServiceListAccountsProcedure = "/redpanda.api.aigateway.v1.AccountService/ListAccounts" + // AccountServiceUpdateAccountProcedure is the fully-qualified name of the AccountService's + // UpdateAccount RPC. + AccountServiceUpdateAccountProcedure = "/redpanda.api.aigateway.v1.AccountService/UpdateAccount" + // AccountServiceDeleteAccountProcedure is the fully-qualified name of the AccountService's + // DeleteAccount RPC. + AccountServiceDeleteAccountProcedure = "/redpanda.api.aigateway.v1.AccountService/DeleteAccount" + // AccountServiceSetAccountLicenseProcedure is the fully-qualified name of the AccountService's + // SetAccountLicense RPC. + AccountServiceSetAccountLicenseProcedure = "/redpanda.api.aigateway.v1.AccountService/SetAccountLicense" + // AccountServiceGetAccountLicenseProcedure is the fully-qualified name of the AccountService's + // GetAccountLicense RPC. + AccountServiceGetAccountLicenseProcedure = "/redpanda.api.aigateway.v1.AccountService/GetAccountLicense" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + accountServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_account_proto.Services().ByName("AccountService") + accountServiceCreateAccountMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("CreateAccount") + accountServiceGetAccountMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("GetAccount") + accountServiceListAccountsMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("ListAccounts") + accountServiceUpdateAccountMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("UpdateAccount") + accountServiceDeleteAccountMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("DeleteAccount") + accountServiceSetAccountLicenseMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("SetAccountLicense") + accountServiceGetAccountLicenseMethodDescriptor = accountServiceServiceDescriptor.Methods().ByName("GetAccountLicense") +) + +// AccountServiceClient is a client for the redpanda.api.aigateway.v1.AccountService service. +type AccountServiceClient interface { + // Creates a new account. + CreateAccount(context.Context, *connect.Request[v1.CreateAccountRequest]) (*connect.Response[v1.CreateAccountResponse], error) + // Gets an account by name. + GetAccount(context.Context, *connect.Request[v1.GetAccountRequest]) (*connect.Response[v1.GetAccountResponse], error) + // Lists accounts. + ListAccounts(context.Context, *connect.Request[v1.ListAccountsRequest]) (*connect.Response[v1.ListAccountsResponse], error) + // Updates an account. + UpdateAccount(context.Context, *connect.Request[v1.UpdateAccountRequest]) (*connect.Response[v1.UpdateAccountResponse], error) + // Deletes an account. + DeleteAccount(context.Context, *connect.Request[v1.DeleteAccountRequest]) (*connect.Response[v1.DeleteAccountResponse], error) + // Sets the license key for an account. + // The license key is a JWT token signed by Redpanda. + // This operation will validate the JWT and store it encrypted at rest. + SetAccountLicense(context.Context, *connect.Request[v1.SetAccountLicenseRequest]) (*connect.Response[v1.SetAccountLicenseResponse], error) + // Gets the current license information for an account. + // Returns the decoded license info without the encrypted key. + GetAccountLicense(context.Context, *connect.Request[v1.GetAccountLicenseRequest]) (*connect.Response[v1.GetAccountLicenseResponse], error) +} + +// NewAccountServiceClient constructs a client for the redpanda.api.aigateway.v1.AccountService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAccountServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AccountServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &accountServiceClient{ + createAccount: connect.NewClient[v1.CreateAccountRequest, v1.CreateAccountResponse]( + httpClient, + baseURL+AccountServiceCreateAccountProcedure, + connect.WithSchema(accountServiceCreateAccountMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getAccount: connect.NewClient[v1.GetAccountRequest, v1.GetAccountResponse]( + httpClient, + baseURL+AccountServiceGetAccountProcedure, + connect.WithSchema(accountServiceGetAccountMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listAccounts: connect.NewClient[v1.ListAccountsRequest, v1.ListAccountsResponse]( + httpClient, + baseURL+AccountServiceListAccountsProcedure, + connect.WithSchema(accountServiceListAccountsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateAccount: connect.NewClient[v1.UpdateAccountRequest, v1.UpdateAccountResponse]( + httpClient, + baseURL+AccountServiceUpdateAccountProcedure, + connect.WithSchema(accountServiceUpdateAccountMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteAccount: connect.NewClient[v1.DeleteAccountRequest, v1.DeleteAccountResponse]( + httpClient, + baseURL+AccountServiceDeleteAccountProcedure, + connect.WithSchema(accountServiceDeleteAccountMethodDescriptor), + connect.WithClientOptions(opts...), + ), + setAccountLicense: connect.NewClient[v1.SetAccountLicenseRequest, v1.SetAccountLicenseResponse]( + httpClient, + baseURL+AccountServiceSetAccountLicenseProcedure, + connect.WithSchema(accountServiceSetAccountLicenseMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getAccountLicense: connect.NewClient[v1.GetAccountLicenseRequest, v1.GetAccountLicenseResponse]( + httpClient, + baseURL+AccountServiceGetAccountLicenseProcedure, + connect.WithSchema(accountServiceGetAccountLicenseMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// accountServiceClient implements AccountServiceClient. +type accountServiceClient struct { + createAccount *connect.Client[v1.CreateAccountRequest, v1.CreateAccountResponse] + getAccount *connect.Client[v1.GetAccountRequest, v1.GetAccountResponse] + listAccounts *connect.Client[v1.ListAccountsRequest, v1.ListAccountsResponse] + updateAccount *connect.Client[v1.UpdateAccountRequest, v1.UpdateAccountResponse] + deleteAccount *connect.Client[v1.DeleteAccountRequest, v1.DeleteAccountResponse] + setAccountLicense *connect.Client[v1.SetAccountLicenseRequest, v1.SetAccountLicenseResponse] + getAccountLicense *connect.Client[v1.GetAccountLicenseRequest, v1.GetAccountLicenseResponse] +} + +// CreateAccount calls redpanda.api.aigateway.v1.AccountService.CreateAccount. +func (c *accountServiceClient) CreateAccount(ctx context.Context, req *connect.Request[v1.CreateAccountRequest]) (*connect.Response[v1.CreateAccountResponse], error) { + return c.createAccount.CallUnary(ctx, req) +} + +// GetAccount calls redpanda.api.aigateway.v1.AccountService.GetAccount. +func (c *accountServiceClient) GetAccount(ctx context.Context, req *connect.Request[v1.GetAccountRequest]) (*connect.Response[v1.GetAccountResponse], error) { + return c.getAccount.CallUnary(ctx, req) +} + +// ListAccounts calls redpanda.api.aigateway.v1.AccountService.ListAccounts. +func (c *accountServiceClient) ListAccounts(ctx context.Context, req *connect.Request[v1.ListAccountsRequest]) (*connect.Response[v1.ListAccountsResponse], error) { + return c.listAccounts.CallUnary(ctx, req) +} + +// UpdateAccount calls redpanda.api.aigateway.v1.AccountService.UpdateAccount. +func (c *accountServiceClient) UpdateAccount(ctx context.Context, req *connect.Request[v1.UpdateAccountRequest]) (*connect.Response[v1.UpdateAccountResponse], error) { + return c.updateAccount.CallUnary(ctx, req) +} + +// DeleteAccount calls redpanda.api.aigateway.v1.AccountService.DeleteAccount. +func (c *accountServiceClient) DeleteAccount(ctx context.Context, req *connect.Request[v1.DeleteAccountRequest]) (*connect.Response[v1.DeleteAccountResponse], error) { + return c.deleteAccount.CallUnary(ctx, req) +} + +// SetAccountLicense calls redpanda.api.aigateway.v1.AccountService.SetAccountLicense. +func (c *accountServiceClient) SetAccountLicense(ctx context.Context, req *connect.Request[v1.SetAccountLicenseRequest]) (*connect.Response[v1.SetAccountLicenseResponse], error) { + return c.setAccountLicense.CallUnary(ctx, req) +} + +// GetAccountLicense calls redpanda.api.aigateway.v1.AccountService.GetAccountLicense. +func (c *accountServiceClient) GetAccountLicense(ctx context.Context, req *connect.Request[v1.GetAccountLicenseRequest]) (*connect.Response[v1.GetAccountLicenseResponse], error) { + return c.getAccountLicense.CallUnary(ctx, req) +} + +// AccountServiceHandler is an implementation of the redpanda.api.aigateway.v1.AccountService +// service. +type AccountServiceHandler interface { + // Creates a new account. + CreateAccount(context.Context, *connect.Request[v1.CreateAccountRequest]) (*connect.Response[v1.CreateAccountResponse], error) + // Gets an account by name. + GetAccount(context.Context, *connect.Request[v1.GetAccountRequest]) (*connect.Response[v1.GetAccountResponse], error) + // Lists accounts. + ListAccounts(context.Context, *connect.Request[v1.ListAccountsRequest]) (*connect.Response[v1.ListAccountsResponse], error) + // Updates an account. + UpdateAccount(context.Context, *connect.Request[v1.UpdateAccountRequest]) (*connect.Response[v1.UpdateAccountResponse], error) + // Deletes an account. + DeleteAccount(context.Context, *connect.Request[v1.DeleteAccountRequest]) (*connect.Response[v1.DeleteAccountResponse], error) + // Sets the license key for an account. + // The license key is a JWT token signed by Redpanda. + // This operation will validate the JWT and store it encrypted at rest. + SetAccountLicense(context.Context, *connect.Request[v1.SetAccountLicenseRequest]) (*connect.Response[v1.SetAccountLicenseResponse], error) + // Gets the current license information for an account. + // Returns the decoded license info without the encrypted key. + GetAccountLicense(context.Context, *connect.Request[v1.GetAccountLicenseRequest]) (*connect.Response[v1.GetAccountLicenseResponse], error) +} + +// NewAccountServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAccountServiceHandler(svc AccountServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + accountServiceCreateAccountHandler := connect.NewUnaryHandler( + AccountServiceCreateAccountProcedure, + svc.CreateAccount, + connect.WithSchema(accountServiceCreateAccountMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceGetAccountHandler := connect.NewUnaryHandler( + AccountServiceGetAccountProcedure, + svc.GetAccount, + connect.WithSchema(accountServiceGetAccountMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceListAccountsHandler := connect.NewUnaryHandler( + AccountServiceListAccountsProcedure, + svc.ListAccounts, + connect.WithSchema(accountServiceListAccountsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceUpdateAccountHandler := connect.NewUnaryHandler( + AccountServiceUpdateAccountProcedure, + svc.UpdateAccount, + connect.WithSchema(accountServiceUpdateAccountMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceDeleteAccountHandler := connect.NewUnaryHandler( + AccountServiceDeleteAccountProcedure, + svc.DeleteAccount, + connect.WithSchema(accountServiceDeleteAccountMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceSetAccountLicenseHandler := connect.NewUnaryHandler( + AccountServiceSetAccountLicenseProcedure, + svc.SetAccountLicense, + connect.WithSchema(accountServiceSetAccountLicenseMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + accountServiceGetAccountLicenseHandler := connect.NewUnaryHandler( + AccountServiceGetAccountLicenseProcedure, + svc.GetAccountLicense, + connect.WithSchema(accountServiceGetAccountLicenseMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.AccountService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AccountServiceCreateAccountProcedure: + accountServiceCreateAccountHandler.ServeHTTP(w, r) + case AccountServiceGetAccountProcedure: + accountServiceGetAccountHandler.ServeHTTP(w, r) + case AccountServiceListAccountsProcedure: + accountServiceListAccountsHandler.ServeHTTP(w, r) + case AccountServiceUpdateAccountProcedure: + accountServiceUpdateAccountHandler.ServeHTTP(w, r) + case AccountServiceDeleteAccountProcedure: + accountServiceDeleteAccountHandler.ServeHTTP(w, r) + case AccountServiceSetAccountLicenseProcedure: + accountServiceSetAccountLicenseHandler.ServeHTTP(w, r) + case AccountServiceGetAccountLicenseProcedure: + accountServiceGetAccountLicenseHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAccountServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAccountServiceHandler struct{} + +func (UnimplementedAccountServiceHandler) CreateAccount(context.Context, *connect.Request[v1.CreateAccountRequest]) (*connect.Response[v1.CreateAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.CreateAccount is not implemented")) +} + +func (UnimplementedAccountServiceHandler) GetAccount(context.Context, *connect.Request[v1.GetAccountRequest]) (*connect.Response[v1.GetAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.GetAccount is not implemented")) +} + +func (UnimplementedAccountServiceHandler) ListAccounts(context.Context, *connect.Request[v1.ListAccountsRequest]) (*connect.Response[v1.ListAccountsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.ListAccounts is not implemented")) +} + +func (UnimplementedAccountServiceHandler) UpdateAccount(context.Context, *connect.Request[v1.UpdateAccountRequest]) (*connect.Response[v1.UpdateAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.UpdateAccount is not implemented")) +} + +func (UnimplementedAccountServiceHandler) DeleteAccount(context.Context, *connect.Request[v1.DeleteAccountRequest]) (*connect.Response[v1.DeleteAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.DeleteAccount is not implemented")) +} + +func (UnimplementedAccountServiceHandler) SetAccountLicense(context.Context, *connect.Request[v1.SetAccountLicenseRequest]) (*connect.Response[v1.SetAccountLicenseResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.SetAccountLicense is not implemented")) +} + +func (UnimplementedAccountServiceHandler) GetAccountLicense(context.Context, *connect.Request[v1.GetAccountLicenseRequest]) (*connect.Response[v1.GetAccountLicenseResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AccountService.GetAccountLicense is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.gw.go new file mode 100644 index 0000000000..643d6a1b0e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/account.connect.gw.go @@ -0,0 +1,76 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/account.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// AccountServiceGatewayServer implements the gRPC server API for the AccountService service. +type AccountServiceGatewayServer struct { + v1.UnimplementedAccountServiceServer + createAccount connect_gateway.UnaryHandler[v1.CreateAccountRequest, v1.CreateAccountResponse] + getAccount connect_gateway.UnaryHandler[v1.GetAccountRequest, v1.GetAccountResponse] + listAccounts connect_gateway.UnaryHandler[v1.ListAccountsRequest, v1.ListAccountsResponse] + updateAccount connect_gateway.UnaryHandler[v1.UpdateAccountRequest, v1.UpdateAccountResponse] + deleteAccount connect_gateway.UnaryHandler[v1.DeleteAccountRequest, v1.DeleteAccountResponse] + setAccountLicense connect_gateway.UnaryHandler[v1.SetAccountLicenseRequest, v1.SetAccountLicenseResponse] + getAccountLicense connect_gateway.UnaryHandler[v1.GetAccountLicenseRequest, v1.GetAccountLicenseResponse] +} + +// NewAccountServiceGatewayServer constructs a Connect-Gateway gRPC server for the AccountService +// service. +func NewAccountServiceGatewayServer(svc AccountServiceHandler, opts ...connect_gateway.HandlerOption) *AccountServiceGatewayServer { + return &AccountServiceGatewayServer{ + createAccount: connect_gateway.NewUnaryHandler(AccountServiceCreateAccountProcedure, svc.CreateAccount, opts...), + getAccount: connect_gateway.NewUnaryHandler(AccountServiceGetAccountProcedure, svc.GetAccount, opts...), + listAccounts: connect_gateway.NewUnaryHandler(AccountServiceListAccountsProcedure, svc.ListAccounts, opts...), + updateAccount: connect_gateway.NewUnaryHandler(AccountServiceUpdateAccountProcedure, svc.UpdateAccount, opts...), + deleteAccount: connect_gateway.NewUnaryHandler(AccountServiceDeleteAccountProcedure, svc.DeleteAccount, opts...), + setAccountLicense: connect_gateway.NewUnaryHandler(AccountServiceSetAccountLicenseProcedure, svc.SetAccountLicense, opts...), + getAccountLicense: connect_gateway.NewUnaryHandler(AccountServiceGetAccountLicenseProcedure, svc.GetAccountLicense, opts...), + } +} + +func (s *AccountServiceGatewayServer) CreateAccount(ctx context.Context, req *v1.CreateAccountRequest) (*v1.CreateAccountResponse, error) { + return s.createAccount(ctx, req) +} + +func (s *AccountServiceGatewayServer) GetAccount(ctx context.Context, req *v1.GetAccountRequest) (*v1.GetAccountResponse, error) { + return s.getAccount(ctx, req) +} + +func (s *AccountServiceGatewayServer) ListAccounts(ctx context.Context, req *v1.ListAccountsRequest) (*v1.ListAccountsResponse, error) { + return s.listAccounts(ctx, req) +} + +func (s *AccountServiceGatewayServer) UpdateAccount(ctx context.Context, req *v1.UpdateAccountRequest) (*v1.UpdateAccountResponse, error) { + return s.updateAccount(ctx, req) +} + +func (s *AccountServiceGatewayServer) DeleteAccount(ctx context.Context, req *v1.DeleteAccountRequest) (*v1.DeleteAccountResponse, error) { + return s.deleteAccount(ctx, req) +} + +func (s *AccountServiceGatewayServer) SetAccountLicense(ctx context.Context, req *v1.SetAccountLicenseRequest) (*v1.SetAccountLicenseResponse, error) { + return s.setAccountLicense(ctx, req) +} + +func (s *AccountServiceGatewayServer) GetAccountLicense(ctx context.Context, req *v1.GetAccountLicenseRequest) (*v1.GetAccountLicenseResponse, error) { + return s.getAccountLicense(ctx, req) +} + +// RegisterAccountServiceHandlerGatewayServer registers the Connect handlers for the AccountService +// "svc" to "mux". +func RegisterAccountServiceHandlerGatewayServer(mux *runtime.ServeMux, svc AccountServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterAccountServiceHandlerServer(context.TODO(), mux, NewAccountServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.go new file mode 100644 index 0000000000..25ddbe74dc --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.go @@ -0,0 +1,221 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/analytics.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AnalyticsServiceName is the fully-qualified name of the AnalyticsService service. + AnalyticsServiceName = "redpanda.api.aigateway.v1.AnalyticsService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AnalyticsServiceGetSpendingSummaryProcedure is the fully-qualified name of the AnalyticsService's + // GetSpendingSummary RPC. + AnalyticsServiceGetSpendingSummaryProcedure = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingSummary" + // AnalyticsServiceGetSpendingTimeSeriesProcedure is the fully-qualified name of the + // AnalyticsService's GetSpendingTimeSeries RPC. + AnalyticsServiceGetSpendingTimeSeriesProcedure = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingTimeSeries" + // AnalyticsServiceGetSpendingBreakdownProcedure is the fully-qualified name of the + // AnalyticsService's GetSpendingBreakdown RPC. + AnalyticsServiceGetSpendingBreakdownProcedure = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingBreakdown" + // AnalyticsServiceGetTopSpendersProcedure is the fully-qualified name of the AnalyticsService's + // GetTopSpenders RPC. + AnalyticsServiceGetTopSpendersProcedure = "/redpanda.api.aigateway.v1.AnalyticsService/GetTopSpenders" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + analyticsServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_analytics_proto.Services().ByName("AnalyticsService") + analyticsServiceGetSpendingSummaryMethodDescriptor = analyticsServiceServiceDescriptor.Methods().ByName("GetSpendingSummary") + analyticsServiceGetSpendingTimeSeriesMethodDescriptor = analyticsServiceServiceDescriptor.Methods().ByName("GetSpendingTimeSeries") + analyticsServiceGetSpendingBreakdownMethodDescriptor = analyticsServiceServiceDescriptor.Methods().ByName("GetSpendingBreakdown") + analyticsServiceGetTopSpendersMethodDescriptor = analyticsServiceServiceDescriptor.Methods().ByName("GetTopSpenders") +) + +// AnalyticsServiceClient is a client for the redpanda.api.aigateway.v1.AnalyticsService service. +type AnalyticsServiceClient interface { + // GetSpendingSummary returns high-level spending metrics for the dashboard. + // Includes total cost, requests, tokens, and trends compared to previous period. + GetSpendingSummary(context.Context, *connect.Request[v1.GetSpendingSummaryRequest]) (*connect.Response[v1.GetSpendingSummaryResponse], error) + // GetSpendingTimeSeries returns spending over time for line charts. + // Automatically selects granularity (hour/day/week) based on time range. + GetSpendingTimeSeries(context.Context, *connect.Request[v1.GetSpendingTimeSeriesRequest]) (*connect.Response[v1.GetSpendingTimeSeriesResponse], error) + // GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + // Used for pie charts and bar charts showing distribution. + GetSpendingBreakdown(context.Context, *connect.Request[v1.GetSpendingBreakdownRequest]) (*connect.Response[v1.GetSpendingBreakdownResponse], error) + // GetTopSpenders returns the highest spending entities for a given dimension. + // Used for tables showing top users, teams, organizations, etc. + GetTopSpenders(context.Context, *connect.Request[v1.GetTopSpendersRequest]) (*connect.Response[v1.GetTopSpendersResponse], error) +} + +// NewAnalyticsServiceClient constructs a client for the redpanda.api.aigateway.v1.AnalyticsService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAnalyticsServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AnalyticsServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &analyticsServiceClient{ + getSpendingSummary: connect.NewClient[v1.GetSpendingSummaryRequest, v1.GetSpendingSummaryResponse]( + httpClient, + baseURL+AnalyticsServiceGetSpendingSummaryProcedure, + connect.WithSchema(analyticsServiceGetSpendingSummaryMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getSpendingTimeSeries: connect.NewClient[v1.GetSpendingTimeSeriesRequest, v1.GetSpendingTimeSeriesResponse]( + httpClient, + baseURL+AnalyticsServiceGetSpendingTimeSeriesProcedure, + connect.WithSchema(analyticsServiceGetSpendingTimeSeriesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getSpendingBreakdown: connect.NewClient[v1.GetSpendingBreakdownRequest, v1.GetSpendingBreakdownResponse]( + httpClient, + baseURL+AnalyticsServiceGetSpendingBreakdownProcedure, + connect.WithSchema(analyticsServiceGetSpendingBreakdownMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getTopSpenders: connect.NewClient[v1.GetTopSpendersRequest, v1.GetTopSpendersResponse]( + httpClient, + baseURL+AnalyticsServiceGetTopSpendersProcedure, + connect.WithSchema(analyticsServiceGetTopSpendersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// analyticsServiceClient implements AnalyticsServiceClient. +type analyticsServiceClient struct { + getSpendingSummary *connect.Client[v1.GetSpendingSummaryRequest, v1.GetSpendingSummaryResponse] + getSpendingTimeSeries *connect.Client[v1.GetSpendingTimeSeriesRequest, v1.GetSpendingTimeSeriesResponse] + getSpendingBreakdown *connect.Client[v1.GetSpendingBreakdownRequest, v1.GetSpendingBreakdownResponse] + getTopSpenders *connect.Client[v1.GetTopSpendersRequest, v1.GetTopSpendersResponse] +} + +// GetSpendingSummary calls redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary. +func (c *analyticsServiceClient) GetSpendingSummary(ctx context.Context, req *connect.Request[v1.GetSpendingSummaryRequest]) (*connect.Response[v1.GetSpendingSummaryResponse], error) { + return c.getSpendingSummary.CallUnary(ctx, req) +} + +// GetSpendingTimeSeries calls redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries. +func (c *analyticsServiceClient) GetSpendingTimeSeries(ctx context.Context, req *connect.Request[v1.GetSpendingTimeSeriesRequest]) (*connect.Response[v1.GetSpendingTimeSeriesResponse], error) { + return c.getSpendingTimeSeries.CallUnary(ctx, req) +} + +// GetSpendingBreakdown calls redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown. +func (c *analyticsServiceClient) GetSpendingBreakdown(ctx context.Context, req *connect.Request[v1.GetSpendingBreakdownRequest]) (*connect.Response[v1.GetSpendingBreakdownResponse], error) { + return c.getSpendingBreakdown.CallUnary(ctx, req) +} + +// GetTopSpenders calls redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders. +func (c *analyticsServiceClient) GetTopSpenders(ctx context.Context, req *connect.Request[v1.GetTopSpendersRequest]) (*connect.Response[v1.GetTopSpendersResponse], error) { + return c.getTopSpenders.CallUnary(ctx, req) +} + +// AnalyticsServiceHandler is an implementation of the redpanda.api.aigateway.v1.AnalyticsService +// service. +type AnalyticsServiceHandler interface { + // GetSpendingSummary returns high-level spending metrics for the dashboard. + // Includes total cost, requests, tokens, and trends compared to previous period. + GetSpendingSummary(context.Context, *connect.Request[v1.GetSpendingSummaryRequest]) (*connect.Response[v1.GetSpendingSummaryResponse], error) + // GetSpendingTimeSeries returns spending over time for line charts. + // Automatically selects granularity (hour/day/week) based on time range. + GetSpendingTimeSeries(context.Context, *connect.Request[v1.GetSpendingTimeSeriesRequest]) (*connect.Response[v1.GetSpendingTimeSeriesResponse], error) + // GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + // Used for pie charts and bar charts showing distribution. + GetSpendingBreakdown(context.Context, *connect.Request[v1.GetSpendingBreakdownRequest]) (*connect.Response[v1.GetSpendingBreakdownResponse], error) + // GetTopSpenders returns the highest spending entities for a given dimension. + // Used for tables showing top users, teams, organizations, etc. + GetTopSpenders(context.Context, *connect.Request[v1.GetTopSpendersRequest]) (*connect.Response[v1.GetTopSpendersResponse], error) +} + +// NewAnalyticsServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAnalyticsServiceHandler(svc AnalyticsServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + analyticsServiceGetSpendingSummaryHandler := connect.NewUnaryHandler( + AnalyticsServiceGetSpendingSummaryProcedure, + svc.GetSpendingSummary, + connect.WithSchema(analyticsServiceGetSpendingSummaryMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + analyticsServiceGetSpendingTimeSeriesHandler := connect.NewUnaryHandler( + AnalyticsServiceGetSpendingTimeSeriesProcedure, + svc.GetSpendingTimeSeries, + connect.WithSchema(analyticsServiceGetSpendingTimeSeriesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + analyticsServiceGetSpendingBreakdownHandler := connect.NewUnaryHandler( + AnalyticsServiceGetSpendingBreakdownProcedure, + svc.GetSpendingBreakdown, + connect.WithSchema(analyticsServiceGetSpendingBreakdownMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + analyticsServiceGetTopSpendersHandler := connect.NewUnaryHandler( + AnalyticsServiceGetTopSpendersProcedure, + svc.GetTopSpenders, + connect.WithSchema(analyticsServiceGetTopSpendersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.AnalyticsService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AnalyticsServiceGetSpendingSummaryProcedure: + analyticsServiceGetSpendingSummaryHandler.ServeHTTP(w, r) + case AnalyticsServiceGetSpendingTimeSeriesProcedure: + analyticsServiceGetSpendingTimeSeriesHandler.ServeHTTP(w, r) + case AnalyticsServiceGetSpendingBreakdownProcedure: + analyticsServiceGetSpendingBreakdownHandler.ServeHTTP(w, r) + case AnalyticsServiceGetTopSpendersProcedure: + analyticsServiceGetTopSpendersHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAnalyticsServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAnalyticsServiceHandler struct{} + +func (UnimplementedAnalyticsServiceHandler) GetSpendingSummary(context.Context, *connect.Request[v1.GetSpendingSummaryRequest]) (*connect.Response[v1.GetSpendingSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary is not implemented")) +} + +func (UnimplementedAnalyticsServiceHandler) GetSpendingTimeSeries(context.Context, *connect.Request[v1.GetSpendingTimeSeriesRequest]) (*connect.Response[v1.GetSpendingTimeSeriesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries is not implemented")) +} + +func (UnimplementedAnalyticsServiceHandler) GetSpendingBreakdown(context.Context, *connect.Request[v1.GetSpendingBreakdownRequest]) (*connect.Response[v1.GetSpendingBreakdownResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown is not implemented")) +} + +func (UnimplementedAnalyticsServiceHandler) GetTopSpenders(context.Context, *connect.Request[v1.GetTopSpendersRequest]) (*connect.Response[v1.GetTopSpendersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.gw.go new file mode 100644 index 0000000000..a192d7d255 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/analytics.connect.gw.go @@ -0,0 +1,58 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/analytics.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// AnalyticsServiceGatewayServer implements the gRPC server API for the AnalyticsService service. +type AnalyticsServiceGatewayServer struct { + v1.UnimplementedAnalyticsServiceServer + getSpendingSummary connect_gateway.UnaryHandler[v1.GetSpendingSummaryRequest, v1.GetSpendingSummaryResponse] + getSpendingTimeSeries connect_gateway.UnaryHandler[v1.GetSpendingTimeSeriesRequest, v1.GetSpendingTimeSeriesResponse] + getSpendingBreakdown connect_gateway.UnaryHandler[v1.GetSpendingBreakdownRequest, v1.GetSpendingBreakdownResponse] + getTopSpenders connect_gateway.UnaryHandler[v1.GetTopSpendersRequest, v1.GetTopSpendersResponse] +} + +// NewAnalyticsServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// AnalyticsService service. +func NewAnalyticsServiceGatewayServer(svc AnalyticsServiceHandler, opts ...connect_gateway.HandlerOption) *AnalyticsServiceGatewayServer { + return &AnalyticsServiceGatewayServer{ + getSpendingSummary: connect_gateway.NewUnaryHandler(AnalyticsServiceGetSpendingSummaryProcedure, svc.GetSpendingSummary, opts...), + getSpendingTimeSeries: connect_gateway.NewUnaryHandler(AnalyticsServiceGetSpendingTimeSeriesProcedure, svc.GetSpendingTimeSeries, opts...), + getSpendingBreakdown: connect_gateway.NewUnaryHandler(AnalyticsServiceGetSpendingBreakdownProcedure, svc.GetSpendingBreakdown, opts...), + getTopSpenders: connect_gateway.NewUnaryHandler(AnalyticsServiceGetTopSpendersProcedure, svc.GetTopSpenders, opts...), + } +} + +func (s *AnalyticsServiceGatewayServer) GetSpendingSummary(ctx context.Context, req *v1.GetSpendingSummaryRequest) (*v1.GetSpendingSummaryResponse, error) { + return s.getSpendingSummary(ctx, req) +} + +func (s *AnalyticsServiceGatewayServer) GetSpendingTimeSeries(ctx context.Context, req *v1.GetSpendingTimeSeriesRequest) (*v1.GetSpendingTimeSeriesResponse, error) { + return s.getSpendingTimeSeries(ctx, req) +} + +func (s *AnalyticsServiceGatewayServer) GetSpendingBreakdown(ctx context.Context, req *v1.GetSpendingBreakdownRequest) (*v1.GetSpendingBreakdownResponse, error) { + return s.getSpendingBreakdown(ctx, req) +} + +func (s *AnalyticsServiceGatewayServer) GetTopSpenders(ctx context.Context, req *v1.GetTopSpendersRequest) (*v1.GetTopSpendersResponse, error) { + return s.getTopSpenders(ctx, req) +} + +// RegisterAnalyticsServiceHandlerGatewayServer registers the Connect handlers for the +// AnalyticsService "svc" to "mux". +func RegisterAnalyticsServiceHandlerGatewayServer(mux *runtime.ServeMux, svc AnalyticsServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterAnalyticsServiceHandlerServer(context.TODO(), mux, NewAnalyticsServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.go new file mode 100644 index 0000000000..3cbc0785ad --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.go @@ -0,0 +1,148 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/audit.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AuditServiceName is the fully-qualified name of the AuditService service. + AuditServiceName = "redpanda.api.aigateway.v1.AuditService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AuditServiceListAuditLogsProcedure is the fully-qualified name of the AuditService's + // ListAuditLogs RPC. + AuditServiceListAuditLogsProcedure = "/redpanda.api.aigateway.v1.AuditService/ListAuditLogs" + // AuditServiceGetAuditLogProcedure is the fully-qualified name of the AuditService's GetAuditLog + // RPC. + AuditServiceGetAuditLogProcedure = "/redpanda.api.aigateway.v1.AuditService/GetAuditLog" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + auditServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_audit_proto.Services().ByName("AuditService") + auditServiceListAuditLogsMethodDescriptor = auditServiceServiceDescriptor.Methods().ByName("ListAuditLogs") + auditServiceGetAuditLogMethodDescriptor = auditServiceServiceDescriptor.Methods().ByName("GetAuditLog") +) + +// AuditServiceClient is a client for the redpanda.api.aigateway.v1.AuditService service. +type AuditServiceClient interface { + // ListAuditLogs returns audit log entries for a gateway. + ListAuditLogs(context.Context, *connect.Request[v1.ListAuditLogsRequest]) (*connect.Response[v1.ListAuditLogsResponse], error) + // GetAuditLog returns a single audit log entry. + GetAuditLog(context.Context, *connect.Request[v1.GetAuditLogRequest]) (*connect.Response[v1.GetAuditLogResponse], error) +} + +// NewAuditServiceClient constructs a client for the redpanda.api.aigateway.v1.AuditService service. +// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped +// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAuditServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AuditServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &auditServiceClient{ + listAuditLogs: connect.NewClient[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse]( + httpClient, + baseURL+AuditServiceListAuditLogsProcedure, + connect.WithSchema(auditServiceListAuditLogsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getAuditLog: connect.NewClient[v1.GetAuditLogRequest, v1.GetAuditLogResponse]( + httpClient, + baseURL+AuditServiceGetAuditLogProcedure, + connect.WithSchema(auditServiceGetAuditLogMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// auditServiceClient implements AuditServiceClient. +type auditServiceClient struct { + listAuditLogs *connect.Client[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] + getAuditLog *connect.Client[v1.GetAuditLogRequest, v1.GetAuditLogResponse] +} + +// ListAuditLogs calls redpanda.api.aigateway.v1.AuditService.ListAuditLogs. +func (c *auditServiceClient) ListAuditLogs(ctx context.Context, req *connect.Request[v1.ListAuditLogsRequest]) (*connect.Response[v1.ListAuditLogsResponse], error) { + return c.listAuditLogs.CallUnary(ctx, req) +} + +// GetAuditLog calls redpanda.api.aigateway.v1.AuditService.GetAuditLog. +func (c *auditServiceClient) GetAuditLog(ctx context.Context, req *connect.Request[v1.GetAuditLogRequest]) (*connect.Response[v1.GetAuditLogResponse], error) { + return c.getAuditLog.CallUnary(ctx, req) +} + +// AuditServiceHandler is an implementation of the redpanda.api.aigateway.v1.AuditService service. +type AuditServiceHandler interface { + // ListAuditLogs returns audit log entries for a gateway. + ListAuditLogs(context.Context, *connect.Request[v1.ListAuditLogsRequest]) (*connect.Response[v1.ListAuditLogsResponse], error) + // GetAuditLog returns a single audit log entry. + GetAuditLog(context.Context, *connect.Request[v1.GetAuditLogRequest]) (*connect.Response[v1.GetAuditLogResponse], error) +} + +// NewAuditServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAuditServiceHandler(svc AuditServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + auditServiceListAuditLogsHandler := connect.NewUnaryHandler( + AuditServiceListAuditLogsProcedure, + svc.ListAuditLogs, + connect.WithSchema(auditServiceListAuditLogsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + auditServiceGetAuditLogHandler := connect.NewUnaryHandler( + AuditServiceGetAuditLogProcedure, + svc.GetAuditLog, + connect.WithSchema(auditServiceGetAuditLogMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.AuditService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AuditServiceListAuditLogsProcedure: + auditServiceListAuditLogsHandler.ServeHTTP(w, r) + case AuditServiceGetAuditLogProcedure: + auditServiceGetAuditLogHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAuditServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAuditServiceHandler struct{} + +func (UnimplementedAuditServiceHandler) ListAuditLogs(context.Context, *connect.Request[v1.ListAuditLogsRequest]) (*connect.Response[v1.ListAuditLogsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuditService.ListAuditLogs is not implemented")) +} + +func (UnimplementedAuditServiceHandler) GetAuditLog(context.Context, *connect.Request[v1.GetAuditLogRequest]) (*connect.Response[v1.GetAuditLogResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuditService.GetAuditLog is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.gw.go new file mode 100644 index 0000000000..8c65501af4 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/audit.connect.gw.go @@ -0,0 +1,46 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/audit.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// AuditServiceGatewayServer implements the gRPC server API for the AuditService service. +type AuditServiceGatewayServer struct { + v1.UnimplementedAuditServiceServer + listAuditLogs connect_gateway.UnaryHandler[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] + getAuditLog connect_gateway.UnaryHandler[v1.GetAuditLogRequest, v1.GetAuditLogResponse] +} + +// NewAuditServiceGatewayServer constructs a Connect-Gateway gRPC server for the AuditService +// service. +func NewAuditServiceGatewayServer(svc AuditServiceHandler, opts ...connect_gateway.HandlerOption) *AuditServiceGatewayServer { + return &AuditServiceGatewayServer{ + listAuditLogs: connect_gateway.NewUnaryHandler(AuditServiceListAuditLogsProcedure, svc.ListAuditLogs, opts...), + getAuditLog: connect_gateway.NewUnaryHandler(AuditServiceGetAuditLogProcedure, svc.GetAuditLog, opts...), + } +} + +func (s *AuditServiceGatewayServer) ListAuditLogs(ctx context.Context, req *v1.ListAuditLogsRequest) (*v1.ListAuditLogsResponse, error) { + return s.listAuditLogs(ctx, req) +} + +func (s *AuditServiceGatewayServer) GetAuditLog(ctx context.Context, req *v1.GetAuditLogRequest) (*v1.GetAuditLogResponse, error) { + return s.getAuditLog(ctx, req) +} + +// RegisterAuditServiceHandlerGatewayServer registers the Connect handlers for the AuditService +// "svc" to "mux". +func RegisterAuditServiceHandlerGatewayServer(mux *runtime.ServeMux, svc AuditServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterAuditServiceHandlerServer(context.TODO(), mux, NewAuditServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.go new file mode 100644 index 0000000000..bc77a583eb --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.go @@ -0,0 +1,504 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/auth.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AuthServiceName is the fully-qualified name of the AuthService service. + AuthServiceName = "redpanda.api.aigateway.v1.AuthService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AuthServiceRegisterProcedure is the fully-qualified name of the AuthService's Register RPC. + AuthServiceRegisterProcedure = "/redpanda.api.aigateway.v1.AuthService/Register" + // AuthServiceLoginProcedure is the fully-qualified name of the AuthService's Login RPC. + AuthServiceLoginProcedure = "/redpanda.api.aigateway.v1.AuthService/Login" + // AuthServiceLogoutProcedure is the fully-qualified name of the AuthService's Logout RPC. + AuthServiceLogoutProcedure = "/redpanda.api.aigateway.v1.AuthService/Logout" + // AuthServiceRefreshTokenProcedure is the fully-qualified name of the AuthService's RefreshToken + // RPC. + AuthServiceRefreshTokenProcedure = "/redpanda.api.aigateway.v1.AuthService/RefreshToken" + // AuthServiceRequestPasswordResetProcedure is the fully-qualified name of the AuthService's + // RequestPasswordReset RPC. + AuthServiceRequestPasswordResetProcedure = "/redpanda.api.aigateway.v1.AuthService/RequestPasswordReset" + // AuthServiceResetPasswordProcedure is the fully-qualified name of the AuthService's ResetPassword + // RPC. + AuthServiceResetPasswordProcedure = "/redpanda.api.aigateway.v1.AuthService/ResetPassword" + // AuthServiceChangePasswordProcedure is the fully-qualified name of the AuthService's + // ChangePassword RPC. + AuthServiceChangePasswordProcedure = "/redpanda.api.aigateway.v1.AuthService/ChangePassword" + // AuthServiceVerifyEmailProcedure is the fully-qualified name of the AuthService's VerifyEmail RPC. + AuthServiceVerifyEmailProcedure = "/redpanda.api.aigateway.v1.AuthService/VerifyEmail" + // AuthServiceInviteUserProcedure is the fully-qualified name of the AuthService's InviteUser RPC. + AuthServiceInviteUserProcedure = "/redpanda.api.aigateway.v1.AuthService/InviteUser" + // AuthServiceAcceptInviteProcedure is the fully-qualified name of the AuthService's AcceptInvite + // RPC. + AuthServiceAcceptInviteProcedure = "/redpanda.api.aigateway.v1.AuthService/AcceptInvite" + // AuthServiceGetCurrentUserProcedure is the fully-qualified name of the AuthService's + // GetCurrentUser RPC. + AuthServiceGetCurrentUserProcedure = "/redpanda.api.aigateway.v1.AuthService/GetCurrentUser" + // AuthServiceListInvitesProcedure is the fully-qualified name of the AuthService's ListInvites RPC. + AuthServiceListInvitesProcedure = "/redpanda.api.aigateway.v1.AuthService/ListInvites" + // AuthServiceRevokeInviteProcedure is the fully-qualified name of the AuthService's RevokeInvite + // RPC. + AuthServiceRevokeInviteProcedure = "/redpanda.api.aigateway.v1.AuthService/RevokeInvite" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + authServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_auth_proto.Services().ByName("AuthService") + authServiceRegisterMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("Register") + authServiceLoginMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("Login") + authServiceLogoutMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("Logout") + authServiceRefreshTokenMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("RefreshToken") + authServiceRequestPasswordResetMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("RequestPasswordReset") + authServiceResetPasswordMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("ResetPassword") + authServiceChangePasswordMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("ChangePassword") + authServiceVerifyEmailMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("VerifyEmail") + authServiceInviteUserMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("InviteUser") + authServiceAcceptInviteMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("AcceptInvite") + authServiceGetCurrentUserMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("GetCurrentUser") + authServiceListInvitesMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("ListInvites") + authServiceRevokeInviteMethodDescriptor = authServiceServiceDescriptor.Methods().ByName("RevokeInvite") +) + +// AuthServiceClient is a client for the redpanda.api.aigateway.v1.AuthService service. +type AuthServiceClient interface { + // Registers a new user with email and password. + // Creates a personal organization for the user. + // Sends email verification link. + Register(context.Context, *connect.Request[v1.RegisterRequest]) (*connect.Response[v1.RegisterResponse], error) + // Authenticates a user with email and password. + // Returns session cookie and access token. + Login(context.Context, *connect.Request[v1.LoginRequest]) (*connect.Response[v1.LoginResponse], error) + // Logs out the current user by invalidating their session. + Logout(context.Context, *connect.Request[v1.LogoutRequest]) (*connect.Response[v1.LogoutResponse], error) + // Refreshes the access token using the session cookie. + RefreshToken(context.Context, *connect.Request[v1.RefreshTokenRequest]) (*connect.Response[v1.RefreshTokenResponse], error) + // Requests a password reset email. + // Always returns success to prevent email enumeration. + RequestPasswordReset(context.Context, *connect.Request[v1.RequestPasswordResetRequest]) (*connect.Response[v1.RequestPasswordResetResponse], error) + // Resets password using a reset token. + ResetPassword(context.Context, *connect.Request[v1.ResetPasswordRequest]) (*connect.Response[v1.ResetPasswordResponse], error) + // Changes password for authenticated user. + ChangePassword(context.Context, *connect.Request[v1.ChangePasswordRequest]) (*connect.Response[v1.ChangePasswordResponse], error) + // Verifies email using verification token. + VerifyEmail(context.Context, *connect.Request[v1.VerifyEmailRequest]) (*connect.Response[v1.VerifyEmailResponse], error) + // Invites a user to join an organization. + // Requires admin permissions in the organization. + InviteUser(context.Context, *connect.Request[v1.InviteUserRequest]) (*connect.Response[v1.InviteUserResponse], error) + // Accepts an invitation and creates user account. + AcceptInvite(context.Context, *connect.Request[v1.AcceptInviteRequest]) (*connect.Response[v1.AcceptInviteResponse], error) + // Gets the current authenticated user's info. + GetCurrentUser(context.Context, *connect.Request[v1.GetCurrentUserRequest]) (*connect.Response[v1.GetCurrentUserResponse], error) + // Lists pending invitations for an organization. + ListInvites(context.Context, *connect.Request[v1.ListInvitesRequest]) (*connect.Response[v1.ListInvitesResponse], error) + // Revokes a pending invitation. + RevokeInvite(context.Context, *connect.Request[v1.RevokeInviteRequest]) (*connect.Response[v1.RevokeInviteResponse], error) +} + +// NewAuthServiceClient constructs a client for the redpanda.api.aigateway.v1.AuthService service. +// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped +// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAuthServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AuthServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &authServiceClient{ + register: connect.NewClient[v1.RegisterRequest, v1.RegisterResponse]( + httpClient, + baseURL+AuthServiceRegisterProcedure, + connect.WithSchema(authServiceRegisterMethodDescriptor), + connect.WithClientOptions(opts...), + ), + login: connect.NewClient[v1.LoginRequest, v1.LoginResponse]( + httpClient, + baseURL+AuthServiceLoginProcedure, + connect.WithSchema(authServiceLoginMethodDescriptor), + connect.WithClientOptions(opts...), + ), + logout: connect.NewClient[v1.LogoutRequest, v1.LogoutResponse]( + httpClient, + baseURL+AuthServiceLogoutProcedure, + connect.WithSchema(authServiceLogoutMethodDescriptor), + connect.WithClientOptions(opts...), + ), + refreshToken: connect.NewClient[v1.RefreshTokenRequest, v1.RefreshTokenResponse]( + httpClient, + baseURL+AuthServiceRefreshTokenProcedure, + connect.WithSchema(authServiceRefreshTokenMethodDescriptor), + connect.WithClientOptions(opts...), + ), + requestPasswordReset: connect.NewClient[v1.RequestPasswordResetRequest, v1.RequestPasswordResetResponse]( + httpClient, + baseURL+AuthServiceRequestPasswordResetProcedure, + connect.WithSchema(authServiceRequestPasswordResetMethodDescriptor), + connect.WithClientOptions(opts...), + ), + resetPassword: connect.NewClient[v1.ResetPasswordRequest, v1.ResetPasswordResponse]( + httpClient, + baseURL+AuthServiceResetPasswordProcedure, + connect.WithSchema(authServiceResetPasswordMethodDescriptor), + connect.WithClientOptions(opts...), + ), + changePassword: connect.NewClient[v1.ChangePasswordRequest, v1.ChangePasswordResponse]( + httpClient, + baseURL+AuthServiceChangePasswordProcedure, + connect.WithSchema(authServiceChangePasswordMethodDescriptor), + connect.WithClientOptions(opts...), + ), + verifyEmail: connect.NewClient[v1.VerifyEmailRequest, v1.VerifyEmailResponse]( + httpClient, + baseURL+AuthServiceVerifyEmailProcedure, + connect.WithSchema(authServiceVerifyEmailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + inviteUser: connect.NewClient[v1.InviteUserRequest, v1.InviteUserResponse]( + httpClient, + baseURL+AuthServiceInviteUserProcedure, + connect.WithSchema(authServiceInviteUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + acceptInvite: connect.NewClient[v1.AcceptInviteRequest, v1.AcceptInviteResponse]( + httpClient, + baseURL+AuthServiceAcceptInviteProcedure, + connect.WithSchema(authServiceAcceptInviteMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getCurrentUser: connect.NewClient[v1.GetCurrentUserRequest, v1.GetCurrentUserResponse]( + httpClient, + baseURL+AuthServiceGetCurrentUserProcedure, + connect.WithSchema(authServiceGetCurrentUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listInvites: connect.NewClient[v1.ListInvitesRequest, v1.ListInvitesResponse]( + httpClient, + baseURL+AuthServiceListInvitesProcedure, + connect.WithSchema(authServiceListInvitesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + revokeInvite: connect.NewClient[v1.RevokeInviteRequest, v1.RevokeInviteResponse]( + httpClient, + baseURL+AuthServiceRevokeInviteProcedure, + connect.WithSchema(authServiceRevokeInviteMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// authServiceClient implements AuthServiceClient. +type authServiceClient struct { + register *connect.Client[v1.RegisterRequest, v1.RegisterResponse] + login *connect.Client[v1.LoginRequest, v1.LoginResponse] + logout *connect.Client[v1.LogoutRequest, v1.LogoutResponse] + refreshToken *connect.Client[v1.RefreshTokenRequest, v1.RefreshTokenResponse] + requestPasswordReset *connect.Client[v1.RequestPasswordResetRequest, v1.RequestPasswordResetResponse] + resetPassword *connect.Client[v1.ResetPasswordRequest, v1.ResetPasswordResponse] + changePassword *connect.Client[v1.ChangePasswordRequest, v1.ChangePasswordResponse] + verifyEmail *connect.Client[v1.VerifyEmailRequest, v1.VerifyEmailResponse] + inviteUser *connect.Client[v1.InviteUserRequest, v1.InviteUserResponse] + acceptInvite *connect.Client[v1.AcceptInviteRequest, v1.AcceptInviteResponse] + getCurrentUser *connect.Client[v1.GetCurrentUserRequest, v1.GetCurrentUserResponse] + listInvites *connect.Client[v1.ListInvitesRequest, v1.ListInvitesResponse] + revokeInvite *connect.Client[v1.RevokeInviteRequest, v1.RevokeInviteResponse] +} + +// Register calls redpanda.api.aigateway.v1.AuthService.Register. +func (c *authServiceClient) Register(ctx context.Context, req *connect.Request[v1.RegisterRequest]) (*connect.Response[v1.RegisterResponse], error) { + return c.register.CallUnary(ctx, req) +} + +// Login calls redpanda.api.aigateway.v1.AuthService.Login. +func (c *authServiceClient) Login(ctx context.Context, req *connect.Request[v1.LoginRequest]) (*connect.Response[v1.LoginResponse], error) { + return c.login.CallUnary(ctx, req) +} + +// Logout calls redpanda.api.aigateway.v1.AuthService.Logout. +func (c *authServiceClient) Logout(ctx context.Context, req *connect.Request[v1.LogoutRequest]) (*connect.Response[v1.LogoutResponse], error) { + return c.logout.CallUnary(ctx, req) +} + +// RefreshToken calls redpanda.api.aigateway.v1.AuthService.RefreshToken. +func (c *authServiceClient) RefreshToken(ctx context.Context, req *connect.Request[v1.RefreshTokenRequest]) (*connect.Response[v1.RefreshTokenResponse], error) { + return c.refreshToken.CallUnary(ctx, req) +} + +// RequestPasswordReset calls redpanda.api.aigateway.v1.AuthService.RequestPasswordReset. +func (c *authServiceClient) RequestPasswordReset(ctx context.Context, req *connect.Request[v1.RequestPasswordResetRequest]) (*connect.Response[v1.RequestPasswordResetResponse], error) { + return c.requestPasswordReset.CallUnary(ctx, req) +} + +// ResetPassword calls redpanda.api.aigateway.v1.AuthService.ResetPassword. +func (c *authServiceClient) ResetPassword(ctx context.Context, req *connect.Request[v1.ResetPasswordRequest]) (*connect.Response[v1.ResetPasswordResponse], error) { + return c.resetPassword.CallUnary(ctx, req) +} + +// ChangePassword calls redpanda.api.aigateway.v1.AuthService.ChangePassword. +func (c *authServiceClient) ChangePassword(ctx context.Context, req *connect.Request[v1.ChangePasswordRequest]) (*connect.Response[v1.ChangePasswordResponse], error) { + return c.changePassword.CallUnary(ctx, req) +} + +// VerifyEmail calls redpanda.api.aigateway.v1.AuthService.VerifyEmail. +func (c *authServiceClient) VerifyEmail(ctx context.Context, req *connect.Request[v1.VerifyEmailRequest]) (*connect.Response[v1.VerifyEmailResponse], error) { + return c.verifyEmail.CallUnary(ctx, req) +} + +// InviteUser calls redpanda.api.aigateway.v1.AuthService.InviteUser. +func (c *authServiceClient) InviteUser(ctx context.Context, req *connect.Request[v1.InviteUserRequest]) (*connect.Response[v1.InviteUserResponse], error) { + return c.inviteUser.CallUnary(ctx, req) +} + +// AcceptInvite calls redpanda.api.aigateway.v1.AuthService.AcceptInvite. +func (c *authServiceClient) AcceptInvite(ctx context.Context, req *connect.Request[v1.AcceptInviteRequest]) (*connect.Response[v1.AcceptInviteResponse], error) { + return c.acceptInvite.CallUnary(ctx, req) +} + +// GetCurrentUser calls redpanda.api.aigateway.v1.AuthService.GetCurrentUser. +func (c *authServiceClient) GetCurrentUser(ctx context.Context, req *connect.Request[v1.GetCurrentUserRequest]) (*connect.Response[v1.GetCurrentUserResponse], error) { + return c.getCurrentUser.CallUnary(ctx, req) +} + +// ListInvites calls redpanda.api.aigateway.v1.AuthService.ListInvites. +func (c *authServiceClient) ListInvites(ctx context.Context, req *connect.Request[v1.ListInvitesRequest]) (*connect.Response[v1.ListInvitesResponse], error) { + return c.listInvites.CallUnary(ctx, req) +} + +// RevokeInvite calls redpanda.api.aigateway.v1.AuthService.RevokeInvite. +func (c *authServiceClient) RevokeInvite(ctx context.Context, req *connect.Request[v1.RevokeInviteRequest]) (*connect.Response[v1.RevokeInviteResponse], error) { + return c.revokeInvite.CallUnary(ctx, req) +} + +// AuthServiceHandler is an implementation of the redpanda.api.aigateway.v1.AuthService service. +type AuthServiceHandler interface { + // Registers a new user with email and password. + // Creates a personal organization for the user. + // Sends email verification link. + Register(context.Context, *connect.Request[v1.RegisterRequest]) (*connect.Response[v1.RegisterResponse], error) + // Authenticates a user with email and password. + // Returns session cookie and access token. + Login(context.Context, *connect.Request[v1.LoginRequest]) (*connect.Response[v1.LoginResponse], error) + // Logs out the current user by invalidating their session. + Logout(context.Context, *connect.Request[v1.LogoutRequest]) (*connect.Response[v1.LogoutResponse], error) + // Refreshes the access token using the session cookie. + RefreshToken(context.Context, *connect.Request[v1.RefreshTokenRequest]) (*connect.Response[v1.RefreshTokenResponse], error) + // Requests a password reset email. + // Always returns success to prevent email enumeration. + RequestPasswordReset(context.Context, *connect.Request[v1.RequestPasswordResetRequest]) (*connect.Response[v1.RequestPasswordResetResponse], error) + // Resets password using a reset token. + ResetPassword(context.Context, *connect.Request[v1.ResetPasswordRequest]) (*connect.Response[v1.ResetPasswordResponse], error) + // Changes password for authenticated user. + ChangePassword(context.Context, *connect.Request[v1.ChangePasswordRequest]) (*connect.Response[v1.ChangePasswordResponse], error) + // Verifies email using verification token. + VerifyEmail(context.Context, *connect.Request[v1.VerifyEmailRequest]) (*connect.Response[v1.VerifyEmailResponse], error) + // Invites a user to join an organization. + // Requires admin permissions in the organization. + InviteUser(context.Context, *connect.Request[v1.InviteUserRequest]) (*connect.Response[v1.InviteUserResponse], error) + // Accepts an invitation and creates user account. + AcceptInvite(context.Context, *connect.Request[v1.AcceptInviteRequest]) (*connect.Response[v1.AcceptInviteResponse], error) + // Gets the current authenticated user's info. + GetCurrentUser(context.Context, *connect.Request[v1.GetCurrentUserRequest]) (*connect.Response[v1.GetCurrentUserResponse], error) + // Lists pending invitations for an organization. + ListInvites(context.Context, *connect.Request[v1.ListInvitesRequest]) (*connect.Response[v1.ListInvitesResponse], error) + // Revokes a pending invitation. + RevokeInvite(context.Context, *connect.Request[v1.RevokeInviteRequest]) (*connect.Response[v1.RevokeInviteResponse], error) +} + +// NewAuthServiceHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAuthServiceHandler(svc AuthServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + authServiceRegisterHandler := connect.NewUnaryHandler( + AuthServiceRegisterProcedure, + svc.Register, + connect.WithSchema(authServiceRegisterMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceLoginHandler := connect.NewUnaryHandler( + AuthServiceLoginProcedure, + svc.Login, + connect.WithSchema(authServiceLoginMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceLogoutHandler := connect.NewUnaryHandler( + AuthServiceLogoutProcedure, + svc.Logout, + connect.WithSchema(authServiceLogoutMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceRefreshTokenHandler := connect.NewUnaryHandler( + AuthServiceRefreshTokenProcedure, + svc.RefreshToken, + connect.WithSchema(authServiceRefreshTokenMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceRequestPasswordResetHandler := connect.NewUnaryHandler( + AuthServiceRequestPasswordResetProcedure, + svc.RequestPasswordReset, + connect.WithSchema(authServiceRequestPasswordResetMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceResetPasswordHandler := connect.NewUnaryHandler( + AuthServiceResetPasswordProcedure, + svc.ResetPassword, + connect.WithSchema(authServiceResetPasswordMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceChangePasswordHandler := connect.NewUnaryHandler( + AuthServiceChangePasswordProcedure, + svc.ChangePassword, + connect.WithSchema(authServiceChangePasswordMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceVerifyEmailHandler := connect.NewUnaryHandler( + AuthServiceVerifyEmailProcedure, + svc.VerifyEmail, + connect.WithSchema(authServiceVerifyEmailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceInviteUserHandler := connect.NewUnaryHandler( + AuthServiceInviteUserProcedure, + svc.InviteUser, + connect.WithSchema(authServiceInviteUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceAcceptInviteHandler := connect.NewUnaryHandler( + AuthServiceAcceptInviteProcedure, + svc.AcceptInvite, + connect.WithSchema(authServiceAcceptInviteMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceGetCurrentUserHandler := connect.NewUnaryHandler( + AuthServiceGetCurrentUserProcedure, + svc.GetCurrentUser, + connect.WithSchema(authServiceGetCurrentUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceListInvitesHandler := connect.NewUnaryHandler( + AuthServiceListInvitesProcedure, + svc.ListInvites, + connect.WithSchema(authServiceListInvitesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + authServiceRevokeInviteHandler := connect.NewUnaryHandler( + AuthServiceRevokeInviteProcedure, + svc.RevokeInvite, + connect.WithSchema(authServiceRevokeInviteMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.AuthService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AuthServiceRegisterProcedure: + authServiceRegisterHandler.ServeHTTP(w, r) + case AuthServiceLoginProcedure: + authServiceLoginHandler.ServeHTTP(w, r) + case AuthServiceLogoutProcedure: + authServiceLogoutHandler.ServeHTTP(w, r) + case AuthServiceRefreshTokenProcedure: + authServiceRefreshTokenHandler.ServeHTTP(w, r) + case AuthServiceRequestPasswordResetProcedure: + authServiceRequestPasswordResetHandler.ServeHTTP(w, r) + case AuthServiceResetPasswordProcedure: + authServiceResetPasswordHandler.ServeHTTP(w, r) + case AuthServiceChangePasswordProcedure: + authServiceChangePasswordHandler.ServeHTTP(w, r) + case AuthServiceVerifyEmailProcedure: + authServiceVerifyEmailHandler.ServeHTTP(w, r) + case AuthServiceInviteUserProcedure: + authServiceInviteUserHandler.ServeHTTP(w, r) + case AuthServiceAcceptInviteProcedure: + authServiceAcceptInviteHandler.ServeHTTP(w, r) + case AuthServiceGetCurrentUserProcedure: + authServiceGetCurrentUserHandler.ServeHTTP(w, r) + case AuthServiceListInvitesProcedure: + authServiceListInvitesHandler.ServeHTTP(w, r) + case AuthServiceRevokeInviteProcedure: + authServiceRevokeInviteHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAuthServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAuthServiceHandler struct{} + +func (UnimplementedAuthServiceHandler) Register(context.Context, *connect.Request[v1.RegisterRequest]) (*connect.Response[v1.RegisterResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.Register is not implemented")) +} + +func (UnimplementedAuthServiceHandler) Login(context.Context, *connect.Request[v1.LoginRequest]) (*connect.Response[v1.LoginResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.Login is not implemented")) +} + +func (UnimplementedAuthServiceHandler) Logout(context.Context, *connect.Request[v1.LogoutRequest]) (*connect.Response[v1.LogoutResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.Logout is not implemented")) +} + +func (UnimplementedAuthServiceHandler) RefreshToken(context.Context, *connect.Request[v1.RefreshTokenRequest]) (*connect.Response[v1.RefreshTokenResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.RefreshToken is not implemented")) +} + +func (UnimplementedAuthServiceHandler) RequestPasswordReset(context.Context, *connect.Request[v1.RequestPasswordResetRequest]) (*connect.Response[v1.RequestPasswordResetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.RequestPasswordReset is not implemented")) +} + +func (UnimplementedAuthServiceHandler) ResetPassword(context.Context, *connect.Request[v1.ResetPasswordRequest]) (*connect.Response[v1.ResetPasswordResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.ResetPassword is not implemented")) +} + +func (UnimplementedAuthServiceHandler) ChangePassword(context.Context, *connect.Request[v1.ChangePasswordRequest]) (*connect.Response[v1.ChangePasswordResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.ChangePassword is not implemented")) +} + +func (UnimplementedAuthServiceHandler) VerifyEmail(context.Context, *connect.Request[v1.VerifyEmailRequest]) (*connect.Response[v1.VerifyEmailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.VerifyEmail is not implemented")) +} + +func (UnimplementedAuthServiceHandler) InviteUser(context.Context, *connect.Request[v1.InviteUserRequest]) (*connect.Response[v1.InviteUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.InviteUser is not implemented")) +} + +func (UnimplementedAuthServiceHandler) AcceptInvite(context.Context, *connect.Request[v1.AcceptInviteRequest]) (*connect.Response[v1.AcceptInviteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.AcceptInvite is not implemented")) +} + +func (UnimplementedAuthServiceHandler) GetCurrentUser(context.Context, *connect.Request[v1.GetCurrentUserRequest]) (*connect.Response[v1.GetCurrentUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.GetCurrentUser is not implemented")) +} + +func (UnimplementedAuthServiceHandler) ListInvites(context.Context, *connect.Request[v1.ListInvitesRequest]) (*connect.Response[v1.ListInvitesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.ListInvites is not implemented")) +} + +func (UnimplementedAuthServiceHandler) RevokeInvite(context.Context, *connect.Request[v1.RevokeInviteRequest]) (*connect.Response[v1.RevokeInviteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.AuthService.RevokeInvite is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.gw.go new file mode 100644 index 0000000000..5d9b010850 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/auth.connect.gw.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/auth.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// AuthServiceGatewayServer implements the gRPC server API for the AuthService service. +type AuthServiceGatewayServer struct { + v1.UnimplementedAuthServiceServer + register connect_gateway.UnaryHandler[v1.RegisterRequest, v1.RegisterResponse] + login connect_gateway.UnaryHandler[v1.LoginRequest, v1.LoginResponse] + logout connect_gateway.UnaryHandler[v1.LogoutRequest, v1.LogoutResponse] + refreshToken connect_gateway.UnaryHandler[v1.RefreshTokenRequest, v1.RefreshTokenResponse] + requestPasswordReset connect_gateway.UnaryHandler[v1.RequestPasswordResetRequest, v1.RequestPasswordResetResponse] + resetPassword connect_gateway.UnaryHandler[v1.ResetPasswordRequest, v1.ResetPasswordResponse] + changePassword connect_gateway.UnaryHandler[v1.ChangePasswordRequest, v1.ChangePasswordResponse] + verifyEmail connect_gateway.UnaryHandler[v1.VerifyEmailRequest, v1.VerifyEmailResponse] + inviteUser connect_gateway.UnaryHandler[v1.InviteUserRequest, v1.InviteUserResponse] + acceptInvite connect_gateway.UnaryHandler[v1.AcceptInviteRequest, v1.AcceptInviteResponse] + getCurrentUser connect_gateway.UnaryHandler[v1.GetCurrentUserRequest, v1.GetCurrentUserResponse] + listInvites connect_gateway.UnaryHandler[v1.ListInvitesRequest, v1.ListInvitesResponse] + revokeInvite connect_gateway.UnaryHandler[v1.RevokeInviteRequest, v1.RevokeInviteResponse] +} + +// NewAuthServiceGatewayServer constructs a Connect-Gateway gRPC server for the AuthService service. +func NewAuthServiceGatewayServer(svc AuthServiceHandler, opts ...connect_gateway.HandlerOption) *AuthServiceGatewayServer { + return &AuthServiceGatewayServer{ + register: connect_gateway.NewUnaryHandler(AuthServiceRegisterProcedure, svc.Register, opts...), + login: connect_gateway.NewUnaryHandler(AuthServiceLoginProcedure, svc.Login, opts...), + logout: connect_gateway.NewUnaryHandler(AuthServiceLogoutProcedure, svc.Logout, opts...), + refreshToken: connect_gateway.NewUnaryHandler(AuthServiceRefreshTokenProcedure, svc.RefreshToken, opts...), + requestPasswordReset: connect_gateway.NewUnaryHandler(AuthServiceRequestPasswordResetProcedure, svc.RequestPasswordReset, opts...), + resetPassword: connect_gateway.NewUnaryHandler(AuthServiceResetPasswordProcedure, svc.ResetPassword, opts...), + changePassword: connect_gateway.NewUnaryHandler(AuthServiceChangePasswordProcedure, svc.ChangePassword, opts...), + verifyEmail: connect_gateway.NewUnaryHandler(AuthServiceVerifyEmailProcedure, svc.VerifyEmail, opts...), + inviteUser: connect_gateway.NewUnaryHandler(AuthServiceInviteUserProcedure, svc.InviteUser, opts...), + acceptInvite: connect_gateway.NewUnaryHandler(AuthServiceAcceptInviteProcedure, svc.AcceptInvite, opts...), + getCurrentUser: connect_gateway.NewUnaryHandler(AuthServiceGetCurrentUserProcedure, svc.GetCurrentUser, opts...), + listInvites: connect_gateway.NewUnaryHandler(AuthServiceListInvitesProcedure, svc.ListInvites, opts...), + revokeInvite: connect_gateway.NewUnaryHandler(AuthServiceRevokeInviteProcedure, svc.RevokeInvite, opts...), + } +} + +func (s *AuthServiceGatewayServer) Register(ctx context.Context, req *v1.RegisterRequest) (*v1.RegisterResponse, error) { + return s.register(ctx, req) +} + +func (s *AuthServiceGatewayServer) Login(ctx context.Context, req *v1.LoginRequest) (*v1.LoginResponse, error) { + return s.login(ctx, req) +} + +func (s *AuthServiceGatewayServer) Logout(ctx context.Context, req *v1.LogoutRequest) (*v1.LogoutResponse, error) { + return s.logout(ctx, req) +} + +func (s *AuthServiceGatewayServer) RefreshToken(ctx context.Context, req *v1.RefreshTokenRequest) (*v1.RefreshTokenResponse, error) { + return s.refreshToken(ctx, req) +} + +func (s *AuthServiceGatewayServer) RequestPasswordReset(ctx context.Context, req *v1.RequestPasswordResetRequest) (*v1.RequestPasswordResetResponse, error) { + return s.requestPasswordReset(ctx, req) +} + +func (s *AuthServiceGatewayServer) ResetPassword(ctx context.Context, req *v1.ResetPasswordRequest) (*v1.ResetPasswordResponse, error) { + return s.resetPassword(ctx, req) +} + +func (s *AuthServiceGatewayServer) ChangePassword(ctx context.Context, req *v1.ChangePasswordRequest) (*v1.ChangePasswordResponse, error) { + return s.changePassword(ctx, req) +} + +func (s *AuthServiceGatewayServer) VerifyEmail(ctx context.Context, req *v1.VerifyEmailRequest) (*v1.VerifyEmailResponse, error) { + return s.verifyEmail(ctx, req) +} + +func (s *AuthServiceGatewayServer) InviteUser(ctx context.Context, req *v1.InviteUserRequest) (*v1.InviteUserResponse, error) { + return s.inviteUser(ctx, req) +} + +func (s *AuthServiceGatewayServer) AcceptInvite(ctx context.Context, req *v1.AcceptInviteRequest) (*v1.AcceptInviteResponse, error) { + return s.acceptInvite(ctx, req) +} + +func (s *AuthServiceGatewayServer) GetCurrentUser(ctx context.Context, req *v1.GetCurrentUserRequest) (*v1.GetCurrentUserResponse, error) { + return s.getCurrentUser(ctx, req) +} + +func (s *AuthServiceGatewayServer) ListInvites(ctx context.Context, req *v1.ListInvitesRequest) (*v1.ListInvitesResponse, error) { + return s.listInvites(ctx, req) +} + +func (s *AuthServiceGatewayServer) RevokeInvite(ctx context.Context, req *v1.RevokeInviteRequest) (*v1.RevokeInviteResponse, error) { + return s.revokeInvite(ctx, req) +} + +// RegisterAuthServiceHandlerGatewayServer registers the Connect handlers for the AuthService "svc" +// to "mux". +func RegisterAuthServiceHandlerGatewayServer(mux *runtime.ServeMux, svc AuthServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterAuthServiceHandlerServer(context.TODO(), mux, NewAuthServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.go new file mode 100644 index 0000000000..3931ec6e8c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.go @@ -0,0 +1,247 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/backend_pool.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // BackendPoolServiceName is the fully-qualified name of the BackendPoolService service. + BackendPoolServiceName = "redpanda.api.aigateway.v1.BackendPoolService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // BackendPoolServiceCreateBackendPoolProcedure is the fully-qualified name of the + // BackendPoolService's CreateBackendPool RPC. + BackendPoolServiceCreateBackendPoolProcedure = "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool" + // BackendPoolServiceGetBackendPoolProcedure is the fully-qualified name of the BackendPoolService's + // GetBackendPool RPC. + BackendPoolServiceGetBackendPoolProcedure = "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool" + // BackendPoolServiceListBackendPoolsProcedure is the fully-qualified name of the + // BackendPoolService's ListBackendPools RPC. + BackendPoolServiceListBackendPoolsProcedure = "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools" + // BackendPoolServiceUpdateBackendPoolProcedure is the fully-qualified name of the + // BackendPoolService's UpdateBackendPool RPC. + BackendPoolServiceUpdateBackendPoolProcedure = "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool" + // BackendPoolServiceDeleteBackendPoolProcedure is the fully-qualified name of the + // BackendPoolService's DeleteBackendPool RPC. + BackendPoolServiceDeleteBackendPoolProcedure = "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + backendPoolServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_backend_pool_proto.Services().ByName("BackendPoolService") + backendPoolServiceCreateBackendPoolMethodDescriptor = backendPoolServiceServiceDescriptor.Methods().ByName("CreateBackendPool") + backendPoolServiceGetBackendPoolMethodDescriptor = backendPoolServiceServiceDescriptor.Methods().ByName("GetBackendPool") + backendPoolServiceListBackendPoolsMethodDescriptor = backendPoolServiceServiceDescriptor.Methods().ByName("ListBackendPools") + backendPoolServiceUpdateBackendPoolMethodDescriptor = backendPoolServiceServiceDescriptor.Methods().ByName("UpdateBackendPool") + backendPoolServiceDeleteBackendPoolMethodDescriptor = backendPoolServiceServiceDescriptor.Methods().ByName("DeleteBackendPool") +) + +// BackendPoolServiceClient is a client for the redpanda.api.aigateway.v1.BackendPoolService +// service. +type BackendPoolServiceClient interface { + // Creates a new backend pool. + CreateBackendPool(context.Context, *connect.Request[v1.CreateBackendPoolRequest]) (*connect.Response[v1.CreateBackendPoolResponse], error) + // Gets a backend pool. + GetBackendPool(context.Context, *connect.Request[v1.GetBackendPoolRequest]) (*connect.Response[v1.GetBackendPoolResponse], error) + // Lists backend pools. + ListBackendPools(context.Context, *connect.Request[v1.ListBackendPoolsRequest]) (*connect.Response[v1.ListBackendPoolsResponse], error) + // Updates a backend pool. + UpdateBackendPool(context.Context, *connect.Request[v1.UpdateBackendPoolRequest]) (*connect.Response[v1.UpdateBackendPoolResponse], error) + // Deletes a backend pool. + DeleteBackendPool(context.Context, *connect.Request[v1.DeleteBackendPoolRequest]) (*connect.Response[v1.DeleteBackendPoolResponse], error) +} + +// NewBackendPoolServiceClient constructs a client for the +// redpanda.api.aigateway.v1.BackendPoolService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewBackendPoolServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) BackendPoolServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &backendPoolServiceClient{ + createBackendPool: connect.NewClient[v1.CreateBackendPoolRequest, v1.CreateBackendPoolResponse]( + httpClient, + baseURL+BackendPoolServiceCreateBackendPoolProcedure, + connect.WithSchema(backendPoolServiceCreateBackendPoolMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getBackendPool: connect.NewClient[v1.GetBackendPoolRequest, v1.GetBackendPoolResponse]( + httpClient, + baseURL+BackendPoolServiceGetBackendPoolProcedure, + connect.WithSchema(backendPoolServiceGetBackendPoolMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listBackendPools: connect.NewClient[v1.ListBackendPoolsRequest, v1.ListBackendPoolsResponse]( + httpClient, + baseURL+BackendPoolServiceListBackendPoolsProcedure, + connect.WithSchema(backendPoolServiceListBackendPoolsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateBackendPool: connect.NewClient[v1.UpdateBackendPoolRequest, v1.UpdateBackendPoolResponse]( + httpClient, + baseURL+BackendPoolServiceUpdateBackendPoolProcedure, + connect.WithSchema(backendPoolServiceUpdateBackendPoolMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteBackendPool: connect.NewClient[v1.DeleteBackendPoolRequest, v1.DeleteBackendPoolResponse]( + httpClient, + baseURL+BackendPoolServiceDeleteBackendPoolProcedure, + connect.WithSchema(backendPoolServiceDeleteBackendPoolMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// backendPoolServiceClient implements BackendPoolServiceClient. +type backendPoolServiceClient struct { + createBackendPool *connect.Client[v1.CreateBackendPoolRequest, v1.CreateBackendPoolResponse] + getBackendPool *connect.Client[v1.GetBackendPoolRequest, v1.GetBackendPoolResponse] + listBackendPools *connect.Client[v1.ListBackendPoolsRequest, v1.ListBackendPoolsResponse] + updateBackendPool *connect.Client[v1.UpdateBackendPoolRequest, v1.UpdateBackendPoolResponse] + deleteBackendPool *connect.Client[v1.DeleteBackendPoolRequest, v1.DeleteBackendPoolResponse] +} + +// CreateBackendPool calls redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool. +func (c *backendPoolServiceClient) CreateBackendPool(ctx context.Context, req *connect.Request[v1.CreateBackendPoolRequest]) (*connect.Response[v1.CreateBackendPoolResponse], error) { + return c.createBackendPool.CallUnary(ctx, req) +} + +// GetBackendPool calls redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool. +func (c *backendPoolServiceClient) GetBackendPool(ctx context.Context, req *connect.Request[v1.GetBackendPoolRequest]) (*connect.Response[v1.GetBackendPoolResponse], error) { + return c.getBackendPool.CallUnary(ctx, req) +} + +// ListBackendPools calls redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools. +func (c *backendPoolServiceClient) ListBackendPools(ctx context.Context, req *connect.Request[v1.ListBackendPoolsRequest]) (*connect.Response[v1.ListBackendPoolsResponse], error) { + return c.listBackendPools.CallUnary(ctx, req) +} + +// UpdateBackendPool calls redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool. +func (c *backendPoolServiceClient) UpdateBackendPool(ctx context.Context, req *connect.Request[v1.UpdateBackendPoolRequest]) (*connect.Response[v1.UpdateBackendPoolResponse], error) { + return c.updateBackendPool.CallUnary(ctx, req) +} + +// DeleteBackendPool calls redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool. +func (c *backendPoolServiceClient) DeleteBackendPool(ctx context.Context, req *connect.Request[v1.DeleteBackendPoolRequest]) (*connect.Response[v1.DeleteBackendPoolResponse], error) { + return c.deleteBackendPool.CallUnary(ctx, req) +} + +// BackendPoolServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.BackendPoolService service. +type BackendPoolServiceHandler interface { + // Creates a new backend pool. + CreateBackendPool(context.Context, *connect.Request[v1.CreateBackendPoolRequest]) (*connect.Response[v1.CreateBackendPoolResponse], error) + // Gets a backend pool. + GetBackendPool(context.Context, *connect.Request[v1.GetBackendPoolRequest]) (*connect.Response[v1.GetBackendPoolResponse], error) + // Lists backend pools. + ListBackendPools(context.Context, *connect.Request[v1.ListBackendPoolsRequest]) (*connect.Response[v1.ListBackendPoolsResponse], error) + // Updates a backend pool. + UpdateBackendPool(context.Context, *connect.Request[v1.UpdateBackendPoolRequest]) (*connect.Response[v1.UpdateBackendPoolResponse], error) + // Deletes a backend pool. + DeleteBackendPool(context.Context, *connect.Request[v1.DeleteBackendPoolRequest]) (*connect.Response[v1.DeleteBackendPoolResponse], error) +} + +// NewBackendPoolServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewBackendPoolServiceHandler(svc BackendPoolServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + backendPoolServiceCreateBackendPoolHandler := connect.NewUnaryHandler( + BackendPoolServiceCreateBackendPoolProcedure, + svc.CreateBackendPool, + connect.WithSchema(backendPoolServiceCreateBackendPoolMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + backendPoolServiceGetBackendPoolHandler := connect.NewUnaryHandler( + BackendPoolServiceGetBackendPoolProcedure, + svc.GetBackendPool, + connect.WithSchema(backendPoolServiceGetBackendPoolMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + backendPoolServiceListBackendPoolsHandler := connect.NewUnaryHandler( + BackendPoolServiceListBackendPoolsProcedure, + svc.ListBackendPools, + connect.WithSchema(backendPoolServiceListBackendPoolsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + backendPoolServiceUpdateBackendPoolHandler := connect.NewUnaryHandler( + BackendPoolServiceUpdateBackendPoolProcedure, + svc.UpdateBackendPool, + connect.WithSchema(backendPoolServiceUpdateBackendPoolMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + backendPoolServiceDeleteBackendPoolHandler := connect.NewUnaryHandler( + BackendPoolServiceDeleteBackendPoolProcedure, + svc.DeleteBackendPool, + connect.WithSchema(backendPoolServiceDeleteBackendPoolMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.BackendPoolService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case BackendPoolServiceCreateBackendPoolProcedure: + backendPoolServiceCreateBackendPoolHandler.ServeHTTP(w, r) + case BackendPoolServiceGetBackendPoolProcedure: + backendPoolServiceGetBackendPoolHandler.ServeHTTP(w, r) + case BackendPoolServiceListBackendPoolsProcedure: + backendPoolServiceListBackendPoolsHandler.ServeHTTP(w, r) + case BackendPoolServiceUpdateBackendPoolProcedure: + backendPoolServiceUpdateBackendPoolHandler.ServeHTTP(w, r) + case BackendPoolServiceDeleteBackendPoolProcedure: + backendPoolServiceDeleteBackendPoolHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedBackendPoolServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedBackendPoolServiceHandler struct{} + +func (UnimplementedBackendPoolServiceHandler) CreateBackendPool(context.Context, *connect.Request[v1.CreateBackendPoolRequest]) (*connect.Response[v1.CreateBackendPoolResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool is not implemented")) +} + +func (UnimplementedBackendPoolServiceHandler) GetBackendPool(context.Context, *connect.Request[v1.GetBackendPoolRequest]) (*connect.Response[v1.GetBackendPoolResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool is not implemented")) +} + +func (UnimplementedBackendPoolServiceHandler) ListBackendPools(context.Context, *connect.Request[v1.ListBackendPoolsRequest]) (*connect.Response[v1.ListBackendPoolsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools is not implemented")) +} + +func (UnimplementedBackendPoolServiceHandler) UpdateBackendPool(context.Context, *connect.Request[v1.UpdateBackendPoolRequest]) (*connect.Response[v1.UpdateBackendPoolResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool is not implemented")) +} + +func (UnimplementedBackendPoolServiceHandler) DeleteBackendPool(context.Context, *connect.Request[v1.DeleteBackendPoolRequest]) (*connect.Response[v1.DeleteBackendPoolResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.gw.go new file mode 100644 index 0000000000..95bd0b2f56 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/backend_pool.connect.gw.go @@ -0,0 +1,65 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/backend_pool.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// BackendPoolServiceGatewayServer implements the gRPC server API for the BackendPoolService +// service. +type BackendPoolServiceGatewayServer struct { + v1.UnimplementedBackendPoolServiceServer + createBackendPool connect_gateway.UnaryHandler[v1.CreateBackendPoolRequest, v1.CreateBackendPoolResponse] + getBackendPool connect_gateway.UnaryHandler[v1.GetBackendPoolRequest, v1.GetBackendPoolResponse] + listBackendPools connect_gateway.UnaryHandler[v1.ListBackendPoolsRequest, v1.ListBackendPoolsResponse] + updateBackendPool connect_gateway.UnaryHandler[v1.UpdateBackendPoolRequest, v1.UpdateBackendPoolResponse] + deleteBackendPool connect_gateway.UnaryHandler[v1.DeleteBackendPoolRequest, v1.DeleteBackendPoolResponse] +} + +// NewBackendPoolServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// BackendPoolService service. +func NewBackendPoolServiceGatewayServer(svc BackendPoolServiceHandler, opts ...connect_gateway.HandlerOption) *BackendPoolServiceGatewayServer { + return &BackendPoolServiceGatewayServer{ + createBackendPool: connect_gateway.NewUnaryHandler(BackendPoolServiceCreateBackendPoolProcedure, svc.CreateBackendPool, opts...), + getBackendPool: connect_gateway.NewUnaryHandler(BackendPoolServiceGetBackendPoolProcedure, svc.GetBackendPool, opts...), + listBackendPools: connect_gateway.NewUnaryHandler(BackendPoolServiceListBackendPoolsProcedure, svc.ListBackendPools, opts...), + updateBackendPool: connect_gateway.NewUnaryHandler(BackendPoolServiceUpdateBackendPoolProcedure, svc.UpdateBackendPool, opts...), + deleteBackendPool: connect_gateway.NewUnaryHandler(BackendPoolServiceDeleteBackendPoolProcedure, svc.DeleteBackendPool, opts...), + } +} + +func (s *BackendPoolServiceGatewayServer) CreateBackendPool(ctx context.Context, req *v1.CreateBackendPoolRequest) (*v1.CreateBackendPoolResponse, error) { + return s.createBackendPool(ctx, req) +} + +func (s *BackendPoolServiceGatewayServer) GetBackendPool(ctx context.Context, req *v1.GetBackendPoolRequest) (*v1.GetBackendPoolResponse, error) { + return s.getBackendPool(ctx, req) +} + +func (s *BackendPoolServiceGatewayServer) ListBackendPools(ctx context.Context, req *v1.ListBackendPoolsRequest) (*v1.ListBackendPoolsResponse, error) { + return s.listBackendPools(ctx, req) +} + +func (s *BackendPoolServiceGatewayServer) UpdateBackendPool(ctx context.Context, req *v1.UpdateBackendPoolRequest) (*v1.UpdateBackendPoolResponse, error) { + return s.updateBackendPool(ctx, req) +} + +func (s *BackendPoolServiceGatewayServer) DeleteBackendPool(ctx context.Context, req *v1.DeleteBackendPoolRequest) (*v1.DeleteBackendPoolResponse, error) { + return s.deleteBackendPool(ctx, req) +} + +// RegisterBackendPoolServiceHandlerGatewayServer registers the Connect handlers for the +// BackendPoolService "svc" to "mux". +func RegisterBackendPoolServiceHandlerGatewayServer(mux *runtime.ServeMux, svc BackendPoolServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterBackendPoolServiceHandlerServer(context.TODO(), mux, NewBackendPoolServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.go new file mode 100644 index 0000000000..bf0b9fce57 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.go @@ -0,0 +1,340 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/config.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // ConfigServiceName is the fully-qualified name of the ConfigService service. + ConfigServiceName = "redpanda.api.aigateway.v1.ConfigService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // ConfigServiceStageConfigurationProcedure is the fully-qualified name of the ConfigService's + // StageConfiguration RPC. + ConfigServiceStageConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration" + // ConfigServicePublishConfigurationProcedure is the fully-qualified name of the ConfigService's + // PublishConfiguration RPC. + ConfigServicePublishConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration" + // ConfigServiceDeployConfigurationProcedure is the fully-qualified name of the ConfigService's + // DeployConfiguration RPC. + ConfigServiceDeployConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration" + // ConfigServiceReleaseConfigurationProcedure is the fully-qualified name of the ConfigService's + // ReleaseConfiguration RPC. + ConfigServiceReleaseConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration" + // ConfigServiceRollbackConfigurationProcedure is the fully-qualified name of the ConfigService's + // RollbackConfiguration RPC. + ConfigServiceRollbackConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration" + // ConfigServiceGetConfigurationProcedure is the fully-qualified name of the ConfigService's + // GetConfiguration RPC. + ConfigServiceGetConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration" + // ConfigServiceListConfigurationsProcedure is the fully-qualified name of the ConfigService's + // ListConfigurations RPC. + ConfigServiceListConfigurationsProcedure = "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations" + // ConfigServiceGetActiveConfigurationProcedure is the fully-qualified name of the ConfigService's + // GetActiveConfiguration RPC. + ConfigServiceGetActiveConfigurationProcedure = "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + configServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_config_proto.Services().ByName("ConfigService") + configServiceStageConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("StageConfiguration") + configServicePublishConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("PublishConfiguration") + configServiceDeployConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("DeployConfiguration") + configServiceReleaseConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("ReleaseConfiguration") + configServiceRollbackConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("RollbackConfiguration") + configServiceGetConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("GetConfiguration") + configServiceListConfigurationsMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("ListConfigurations") + configServiceGetActiveConfigurationMethodDescriptor = configServiceServiceDescriptor.Methods().ByName("GetActiveConfiguration") +) + +// ConfigServiceClient is a client for the redpanda.api.aigateway.v1.ConfigService service. +type ConfigServiceClient interface { + // Stages a configuration (assembles entities, validates, stores immutably) + StageConfiguration(context.Context, *connect.Request[v1.StageConfigurationRequest]) (*connect.Response[v1.StageConfigurationResponse], error) + // Publishes a staged configuration (packages and distributes) + PublishConfiguration(context.Context, *connect.Request[v1.PublishConfigurationRequest]) (*connect.Response[v1.PublishConfigurationResponse], error) + // Deploys a published configuration (places near gateway instances) + DeployConfiguration(context.Context, *connect.Request[v1.DeployConfigurationRequest]) (*connect.Response[v1.DeployConfigurationResponse], error) + // Releases a deployed configuration (activates it) + ReleaseConfiguration(context.Context, *connect.Request[v1.ReleaseConfigurationRequest]) (*connect.Response[v1.ReleaseConfigurationResponse], error) + // Rolls back to a previous configuration + RollbackConfiguration(context.Context, *connect.Request[v1.RollbackConfigurationRequest]) (*connect.Response[v1.RollbackConfigurationResponse], error) + // Gets a configuration + GetConfiguration(context.Context, *connect.Request[v1.GetConfigurationRequest]) (*connect.Response[v1.GetConfigurationResponse], error) + // Lists configurations + ListConfigurations(context.Context, *connect.Request[v1.ListConfigurationsRequest]) (*connect.Response[v1.ListConfigurationsResponse], error) + // Gets the currently active configuration + GetActiveConfiguration(context.Context, *connect.Request[v1.GetActiveConfigurationRequest]) (*connect.Response[v1.GetActiveConfigurationResponse], error) +} + +// NewConfigServiceClient constructs a client for the redpanda.api.aigateway.v1.ConfigService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewConfigServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ConfigServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &configServiceClient{ + stageConfiguration: connect.NewClient[v1.StageConfigurationRequest, v1.StageConfigurationResponse]( + httpClient, + baseURL+ConfigServiceStageConfigurationProcedure, + connect.WithSchema(configServiceStageConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + publishConfiguration: connect.NewClient[v1.PublishConfigurationRequest, v1.PublishConfigurationResponse]( + httpClient, + baseURL+ConfigServicePublishConfigurationProcedure, + connect.WithSchema(configServicePublishConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deployConfiguration: connect.NewClient[v1.DeployConfigurationRequest, v1.DeployConfigurationResponse]( + httpClient, + baseURL+ConfigServiceDeployConfigurationProcedure, + connect.WithSchema(configServiceDeployConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + releaseConfiguration: connect.NewClient[v1.ReleaseConfigurationRequest, v1.ReleaseConfigurationResponse]( + httpClient, + baseURL+ConfigServiceReleaseConfigurationProcedure, + connect.WithSchema(configServiceReleaseConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + rollbackConfiguration: connect.NewClient[v1.RollbackConfigurationRequest, v1.RollbackConfigurationResponse]( + httpClient, + baseURL+ConfigServiceRollbackConfigurationProcedure, + connect.WithSchema(configServiceRollbackConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getConfiguration: connect.NewClient[v1.GetConfigurationRequest, v1.GetConfigurationResponse]( + httpClient, + baseURL+ConfigServiceGetConfigurationProcedure, + connect.WithSchema(configServiceGetConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listConfigurations: connect.NewClient[v1.ListConfigurationsRequest, v1.ListConfigurationsResponse]( + httpClient, + baseURL+ConfigServiceListConfigurationsProcedure, + connect.WithSchema(configServiceListConfigurationsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getActiveConfiguration: connect.NewClient[v1.GetActiveConfigurationRequest, v1.GetActiveConfigurationResponse]( + httpClient, + baseURL+ConfigServiceGetActiveConfigurationProcedure, + connect.WithSchema(configServiceGetActiveConfigurationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// configServiceClient implements ConfigServiceClient. +type configServiceClient struct { + stageConfiguration *connect.Client[v1.StageConfigurationRequest, v1.StageConfigurationResponse] + publishConfiguration *connect.Client[v1.PublishConfigurationRequest, v1.PublishConfigurationResponse] + deployConfiguration *connect.Client[v1.DeployConfigurationRequest, v1.DeployConfigurationResponse] + releaseConfiguration *connect.Client[v1.ReleaseConfigurationRequest, v1.ReleaseConfigurationResponse] + rollbackConfiguration *connect.Client[v1.RollbackConfigurationRequest, v1.RollbackConfigurationResponse] + getConfiguration *connect.Client[v1.GetConfigurationRequest, v1.GetConfigurationResponse] + listConfigurations *connect.Client[v1.ListConfigurationsRequest, v1.ListConfigurationsResponse] + getActiveConfiguration *connect.Client[v1.GetActiveConfigurationRequest, v1.GetActiveConfigurationResponse] +} + +// StageConfiguration calls redpanda.api.aigateway.v1.ConfigService.StageConfiguration. +func (c *configServiceClient) StageConfiguration(ctx context.Context, req *connect.Request[v1.StageConfigurationRequest]) (*connect.Response[v1.StageConfigurationResponse], error) { + return c.stageConfiguration.CallUnary(ctx, req) +} + +// PublishConfiguration calls redpanda.api.aigateway.v1.ConfigService.PublishConfiguration. +func (c *configServiceClient) PublishConfiguration(ctx context.Context, req *connect.Request[v1.PublishConfigurationRequest]) (*connect.Response[v1.PublishConfigurationResponse], error) { + return c.publishConfiguration.CallUnary(ctx, req) +} + +// DeployConfiguration calls redpanda.api.aigateway.v1.ConfigService.DeployConfiguration. +func (c *configServiceClient) DeployConfiguration(ctx context.Context, req *connect.Request[v1.DeployConfigurationRequest]) (*connect.Response[v1.DeployConfigurationResponse], error) { + return c.deployConfiguration.CallUnary(ctx, req) +} + +// ReleaseConfiguration calls redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration. +func (c *configServiceClient) ReleaseConfiguration(ctx context.Context, req *connect.Request[v1.ReleaseConfigurationRequest]) (*connect.Response[v1.ReleaseConfigurationResponse], error) { + return c.releaseConfiguration.CallUnary(ctx, req) +} + +// RollbackConfiguration calls redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration. +func (c *configServiceClient) RollbackConfiguration(ctx context.Context, req *connect.Request[v1.RollbackConfigurationRequest]) (*connect.Response[v1.RollbackConfigurationResponse], error) { + return c.rollbackConfiguration.CallUnary(ctx, req) +} + +// GetConfiguration calls redpanda.api.aigateway.v1.ConfigService.GetConfiguration. +func (c *configServiceClient) GetConfiguration(ctx context.Context, req *connect.Request[v1.GetConfigurationRequest]) (*connect.Response[v1.GetConfigurationResponse], error) { + return c.getConfiguration.CallUnary(ctx, req) +} + +// ListConfigurations calls redpanda.api.aigateway.v1.ConfigService.ListConfigurations. +func (c *configServiceClient) ListConfigurations(ctx context.Context, req *connect.Request[v1.ListConfigurationsRequest]) (*connect.Response[v1.ListConfigurationsResponse], error) { + return c.listConfigurations.CallUnary(ctx, req) +} + +// GetActiveConfiguration calls redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration. +func (c *configServiceClient) GetActiveConfiguration(ctx context.Context, req *connect.Request[v1.GetActiveConfigurationRequest]) (*connect.Response[v1.GetActiveConfigurationResponse], error) { + return c.getActiveConfiguration.CallUnary(ctx, req) +} + +// ConfigServiceHandler is an implementation of the redpanda.api.aigateway.v1.ConfigService service. +type ConfigServiceHandler interface { + // Stages a configuration (assembles entities, validates, stores immutably) + StageConfiguration(context.Context, *connect.Request[v1.StageConfigurationRequest]) (*connect.Response[v1.StageConfigurationResponse], error) + // Publishes a staged configuration (packages and distributes) + PublishConfiguration(context.Context, *connect.Request[v1.PublishConfigurationRequest]) (*connect.Response[v1.PublishConfigurationResponse], error) + // Deploys a published configuration (places near gateway instances) + DeployConfiguration(context.Context, *connect.Request[v1.DeployConfigurationRequest]) (*connect.Response[v1.DeployConfigurationResponse], error) + // Releases a deployed configuration (activates it) + ReleaseConfiguration(context.Context, *connect.Request[v1.ReleaseConfigurationRequest]) (*connect.Response[v1.ReleaseConfigurationResponse], error) + // Rolls back to a previous configuration + RollbackConfiguration(context.Context, *connect.Request[v1.RollbackConfigurationRequest]) (*connect.Response[v1.RollbackConfigurationResponse], error) + // Gets a configuration + GetConfiguration(context.Context, *connect.Request[v1.GetConfigurationRequest]) (*connect.Response[v1.GetConfigurationResponse], error) + // Lists configurations + ListConfigurations(context.Context, *connect.Request[v1.ListConfigurationsRequest]) (*connect.Response[v1.ListConfigurationsResponse], error) + // Gets the currently active configuration + GetActiveConfiguration(context.Context, *connect.Request[v1.GetActiveConfigurationRequest]) (*connect.Response[v1.GetActiveConfigurationResponse], error) +} + +// NewConfigServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewConfigServiceHandler(svc ConfigServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + configServiceStageConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceStageConfigurationProcedure, + svc.StageConfiguration, + connect.WithSchema(configServiceStageConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServicePublishConfigurationHandler := connect.NewUnaryHandler( + ConfigServicePublishConfigurationProcedure, + svc.PublishConfiguration, + connect.WithSchema(configServicePublishConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceDeployConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceDeployConfigurationProcedure, + svc.DeployConfiguration, + connect.WithSchema(configServiceDeployConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceReleaseConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceReleaseConfigurationProcedure, + svc.ReleaseConfiguration, + connect.WithSchema(configServiceReleaseConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceRollbackConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceRollbackConfigurationProcedure, + svc.RollbackConfiguration, + connect.WithSchema(configServiceRollbackConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceGetConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceGetConfigurationProcedure, + svc.GetConfiguration, + connect.WithSchema(configServiceGetConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceListConfigurationsHandler := connect.NewUnaryHandler( + ConfigServiceListConfigurationsProcedure, + svc.ListConfigurations, + connect.WithSchema(configServiceListConfigurationsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + configServiceGetActiveConfigurationHandler := connect.NewUnaryHandler( + ConfigServiceGetActiveConfigurationProcedure, + svc.GetActiveConfiguration, + connect.WithSchema(configServiceGetActiveConfigurationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.ConfigService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case ConfigServiceStageConfigurationProcedure: + configServiceStageConfigurationHandler.ServeHTTP(w, r) + case ConfigServicePublishConfigurationProcedure: + configServicePublishConfigurationHandler.ServeHTTP(w, r) + case ConfigServiceDeployConfigurationProcedure: + configServiceDeployConfigurationHandler.ServeHTTP(w, r) + case ConfigServiceReleaseConfigurationProcedure: + configServiceReleaseConfigurationHandler.ServeHTTP(w, r) + case ConfigServiceRollbackConfigurationProcedure: + configServiceRollbackConfigurationHandler.ServeHTTP(w, r) + case ConfigServiceGetConfigurationProcedure: + configServiceGetConfigurationHandler.ServeHTTP(w, r) + case ConfigServiceListConfigurationsProcedure: + configServiceListConfigurationsHandler.ServeHTTP(w, r) + case ConfigServiceGetActiveConfigurationProcedure: + configServiceGetActiveConfigurationHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedConfigServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedConfigServiceHandler struct{} + +func (UnimplementedConfigServiceHandler) StageConfiguration(context.Context, *connect.Request[v1.StageConfigurationRequest]) (*connect.Response[v1.StageConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.StageConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) PublishConfiguration(context.Context, *connect.Request[v1.PublishConfigurationRequest]) (*connect.Response[v1.PublishConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.PublishConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) DeployConfiguration(context.Context, *connect.Request[v1.DeployConfigurationRequest]) (*connect.Response[v1.DeployConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.DeployConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) ReleaseConfiguration(context.Context, *connect.Request[v1.ReleaseConfigurationRequest]) (*connect.Response[v1.ReleaseConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) RollbackConfiguration(context.Context, *connect.Request[v1.RollbackConfigurationRequest]) (*connect.Response[v1.RollbackConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) GetConfiguration(context.Context, *connect.Request[v1.GetConfigurationRequest]) (*connect.Response[v1.GetConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.GetConfiguration is not implemented")) +} + +func (UnimplementedConfigServiceHandler) ListConfigurations(context.Context, *connect.Request[v1.ListConfigurationsRequest]) (*connect.Response[v1.ListConfigurationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.ListConfigurations is not implemented")) +} + +func (UnimplementedConfigServiceHandler) GetActiveConfiguration(context.Context, *connect.Request[v1.GetActiveConfigurationRequest]) (*connect.Response[v1.GetActiveConfigurationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.gw.go new file mode 100644 index 0000000000..980fbeeb66 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/config.connect.gw.go @@ -0,0 +1,82 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/config.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// ConfigServiceGatewayServer implements the gRPC server API for the ConfigService service. +type ConfigServiceGatewayServer struct { + v1.UnimplementedConfigServiceServer + stageConfiguration connect_gateway.UnaryHandler[v1.StageConfigurationRequest, v1.StageConfigurationResponse] + publishConfiguration connect_gateway.UnaryHandler[v1.PublishConfigurationRequest, v1.PublishConfigurationResponse] + deployConfiguration connect_gateway.UnaryHandler[v1.DeployConfigurationRequest, v1.DeployConfigurationResponse] + releaseConfiguration connect_gateway.UnaryHandler[v1.ReleaseConfigurationRequest, v1.ReleaseConfigurationResponse] + rollbackConfiguration connect_gateway.UnaryHandler[v1.RollbackConfigurationRequest, v1.RollbackConfigurationResponse] + getConfiguration connect_gateway.UnaryHandler[v1.GetConfigurationRequest, v1.GetConfigurationResponse] + listConfigurations connect_gateway.UnaryHandler[v1.ListConfigurationsRequest, v1.ListConfigurationsResponse] + getActiveConfiguration connect_gateway.UnaryHandler[v1.GetActiveConfigurationRequest, v1.GetActiveConfigurationResponse] +} + +// NewConfigServiceGatewayServer constructs a Connect-Gateway gRPC server for the ConfigService +// service. +func NewConfigServiceGatewayServer(svc ConfigServiceHandler, opts ...connect_gateway.HandlerOption) *ConfigServiceGatewayServer { + return &ConfigServiceGatewayServer{ + stageConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceStageConfigurationProcedure, svc.StageConfiguration, opts...), + publishConfiguration: connect_gateway.NewUnaryHandler(ConfigServicePublishConfigurationProcedure, svc.PublishConfiguration, opts...), + deployConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceDeployConfigurationProcedure, svc.DeployConfiguration, opts...), + releaseConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceReleaseConfigurationProcedure, svc.ReleaseConfiguration, opts...), + rollbackConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceRollbackConfigurationProcedure, svc.RollbackConfiguration, opts...), + getConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceGetConfigurationProcedure, svc.GetConfiguration, opts...), + listConfigurations: connect_gateway.NewUnaryHandler(ConfigServiceListConfigurationsProcedure, svc.ListConfigurations, opts...), + getActiveConfiguration: connect_gateway.NewUnaryHandler(ConfigServiceGetActiveConfigurationProcedure, svc.GetActiveConfiguration, opts...), + } +} + +func (s *ConfigServiceGatewayServer) StageConfiguration(ctx context.Context, req *v1.StageConfigurationRequest) (*v1.StageConfigurationResponse, error) { + return s.stageConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) PublishConfiguration(ctx context.Context, req *v1.PublishConfigurationRequest) (*v1.PublishConfigurationResponse, error) { + return s.publishConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) DeployConfiguration(ctx context.Context, req *v1.DeployConfigurationRequest) (*v1.DeployConfigurationResponse, error) { + return s.deployConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) ReleaseConfiguration(ctx context.Context, req *v1.ReleaseConfigurationRequest) (*v1.ReleaseConfigurationResponse, error) { + return s.releaseConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) RollbackConfiguration(ctx context.Context, req *v1.RollbackConfigurationRequest) (*v1.RollbackConfigurationResponse, error) { + return s.rollbackConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) GetConfiguration(ctx context.Context, req *v1.GetConfigurationRequest) (*v1.GetConfigurationResponse, error) { + return s.getConfiguration(ctx, req) +} + +func (s *ConfigServiceGatewayServer) ListConfigurations(ctx context.Context, req *v1.ListConfigurationsRequest) (*v1.ListConfigurationsResponse, error) { + return s.listConfigurations(ctx, req) +} + +func (s *ConfigServiceGatewayServer) GetActiveConfiguration(ctx context.Context, req *v1.GetActiveConfigurationRequest) (*v1.GetActiveConfigurationResponse, error) { + return s.getActiveConfiguration(ctx, req) +} + +// RegisterConfigServiceHandlerGatewayServer registers the Connect handlers for the ConfigService +// "svc" to "mux". +func RegisterConfigServiceHandlerGatewayServer(mux *runtime.ServeMux, svc ConfigServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterConfigServiceHandlerServer(context.TODO(), mux, NewConfigServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.go new file mode 100644 index 0000000000..0acf0909f3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.go @@ -0,0 +1,245 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/gateway.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // GatewayServiceName is the fully-qualified name of the GatewayService service. + GatewayServiceName = "redpanda.api.aigateway.v1.GatewayService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // GatewayServiceCreateGatewayProcedure is the fully-qualified name of the GatewayService's + // CreateGateway RPC. + GatewayServiceCreateGatewayProcedure = "/redpanda.api.aigateway.v1.GatewayService/CreateGateway" + // GatewayServiceGetGatewayProcedure is the fully-qualified name of the GatewayService's GetGateway + // RPC. + GatewayServiceGetGatewayProcedure = "/redpanda.api.aigateway.v1.GatewayService/GetGateway" + // GatewayServiceListGatewaysProcedure is the fully-qualified name of the GatewayService's + // ListGateways RPC. + GatewayServiceListGatewaysProcedure = "/redpanda.api.aigateway.v1.GatewayService/ListGateways" + // GatewayServiceUpdateGatewayProcedure is the fully-qualified name of the GatewayService's + // UpdateGateway RPC. + GatewayServiceUpdateGatewayProcedure = "/redpanda.api.aigateway.v1.GatewayService/UpdateGateway" + // GatewayServiceDeleteGatewayProcedure is the fully-qualified name of the GatewayService's + // DeleteGateway RPC. + GatewayServiceDeleteGatewayProcedure = "/redpanda.api.aigateway.v1.GatewayService/DeleteGateway" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + gatewayServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_gateway_proto.Services().ByName("GatewayService") + gatewayServiceCreateGatewayMethodDescriptor = gatewayServiceServiceDescriptor.Methods().ByName("CreateGateway") + gatewayServiceGetGatewayMethodDescriptor = gatewayServiceServiceDescriptor.Methods().ByName("GetGateway") + gatewayServiceListGatewaysMethodDescriptor = gatewayServiceServiceDescriptor.Methods().ByName("ListGateways") + gatewayServiceUpdateGatewayMethodDescriptor = gatewayServiceServiceDescriptor.Methods().ByName("UpdateGateway") + gatewayServiceDeleteGatewayMethodDescriptor = gatewayServiceServiceDescriptor.Methods().ByName("DeleteGateway") +) + +// GatewayServiceClient is a client for the redpanda.api.aigateway.v1.GatewayService service. +type GatewayServiceClient interface { + // Creates a new gateway. + CreateGateway(context.Context, *connect.Request[v1.CreateGatewayRequest]) (*connect.Response[v1.CreateGatewayResponse], error) + // Gets a gateway by name. + GetGateway(context.Context, *connect.Request[v1.GetGatewayRequest]) (*connect.Response[v1.GetGatewayResponse], error) + // Lists gateways. + ListGateways(context.Context, *connect.Request[v1.ListGatewaysRequest]) (*connect.Response[v1.ListGatewaysResponse], error) + // Updates a gateway. + UpdateGateway(context.Context, *connect.Request[v1.UpdateGatewayRequest]) (*connect.Response[v1.UpdateGatewayResponse], error) + // Deletes a gateway. + DeleteGateway(context.Context, *connect.Request[v1.DeleteGatewayRequest]) (*connect.Response[v1.DeleteGatewayResponse], error) +} + +// NewGatewayServiceClient constructs a client for the redpanda.api.aigateway.v1.GatewayService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewGatewayServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) GatewayServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &gatewayServiceClient{ + createGateway: connect.NewClient[v1.CreateGatewayRequest, v1.CreateGatewayResponse]( + httpClient, + baseURL+GatewayServiceCreateGatewayProcedure, + connect.WithSchema(gatewayServiceCreateGatewayMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getGateway: connect.NewClient[v1.GetGatewayRequest, v1.GetGatewayResponse]( + httpClient, + baseURL+GatewayServiceGetGatewayProcedure, + connect.WithSchema(gatewayServiceGetGatewayMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listGateways: connect.NewClient[v1.ListGatewaysRequest, v1.ListGatewaysResponse]( + httpClient, + baseURL+GatewayServiceListGatewaysProcedure, + connect.WithSchema(gatewayServiceListGatewaysMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateGateway: connect.NewClient[v1.UpdateGatewayRequest, v1.UpdateGatewayResponse]( + httpClient, + baseURL+GatewayServiceUpdateGatewayProcedure, + connect.WithSchema(gatewayServiceUpdateGatewayMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteGateway: connect.NewClient[v1.DeleteGatewayRequest, v1.DeleteGatewayResponse]( + httpClient, + baseURL+GatewayServiceDeleteGatewayProcedure, + connect.WithSchema(gatewayServiceDeleteGatewayMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// gatewayServiceClient implements GatewayServiceClient. +type gatewayServiceClient struct { + createGateway *connect.Client[v1.CreateGatewayRequest, v1.CreateGatewayResponse] + getGateway *connect.Client[v1.GetGatewayRequest, v1.GetGatewayResponse] + listGateways *connect.Client[v1.ListGatewaysRequest, v1.ListGatewaysResponse] + updateGateway *connect.Client[v1.UpdateGatewayRequest, v1.UpdateGatewayResponse] + deleteGateway *connect.Client[v1.DeleteGatewayRequest, v1.DeleteGatewayResponse] +} + +// CreateGateway calls redpanda.api.aigateway.v1.GatewayService.CreateGateway. +func (c *gatewayServiceClient) CreateGateway(ctx context.Context, req *connect.Request[v1.CreateGatewayRequest]) (*connect.Response[v1.CreateGatewayResponse], error) { + return c.createGateway.CallUnary(ctx, req) +} + +// GetGateway calls redpanda.api.aigateway.v1.GatewayService.GetGateway. +func (c *gatewayServiceClient) GetGateway(ctx context.Context, req *connect.Request[v1.GetGatewayRequest]) (*connect.Response[v1.GetGatewayResponse], error) { + return c.getGateway.CallUnary(ctx, req) +} + +// ListGateways calls redpanda.api.aigateway.v1.GatewayService.ListGateways. +func (c *gatewayServiceClient) ListGateways(ctx context.Context, req *connect.Request[v1.ListGatewaysRequest]) (*connect.Response[v1.ListGatewaysResponse], error) { + return c.listGateways.CallUnary(ctx, req) +} + +// UpdateGateway calls redpanda.api.aigateway.v1.GatewayService.UpdateGateway. +func (c *gatewayServiceClient) UpdateGateway(ctx context.Context, req *connect.Request[v1.UpdateGatewayRequest]) (*connect.Response[v1.UpdateGatewayResponse], error) { + return c.updateGateway.CallUnary(ctx, req) +} + +// DeleteGateway calls redpanda.api.aigateway.v1.GatewayService.DeleteGateway. +func (c *gatewayServiceClient) DeleteGateway(ctx context.Context, req *connect.Request[v1.DeleteGatewayRequest]) (*connect.Response[v1.DeleteGatewayResponse], error) { + return c.deleteGateway.CallUnary(ctx, req) +} + +// GatewayServiceHandler is an implementation of the redpanda.api.aigateway.v1.GatewayService +// service. +type GatewayServiceHandler interface { + // Creates a new gateway. + CreateGateway(context.Context, *connect.Request[v1.CreateGatewayRequest]) (*connect.Response[v1.CreateGatewayResponse], error) + // Gets a gateway by name. + GetGateway(context.Context, *connect.Request[v1.GetGatewayRequest]) (*connect.Response[v1.GetGatewayResponse], error) + // Lists gateways. + ListGateways(context.Context, *connect.Request[v1.ListGatewaysRequest]) (*connect.Response[v1.ListGatewaysResponse], error) + // Updates a gateway. + UpdateGateway(context.Context, *connect.Request[v1.UpdateGatewayRequest]) (*connect.Response[v1.UpdateGatewayResponse], error) + // Deletes a gateway. + DeleteGateway(context.Context, *connect.Request[v1.DeleteGatewayRequest]) (*connect.Response[v1.DeleteGatewayResponse], error) +} + +// NewGatewayServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewGatewayServiceHandler(svc GatewayServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + gatewayServiceCreateGatewayHandler := connect.NewUnaryHandler( + GatewayServiceCreateGatewayProcedure, + svc.CreateGateway, + connect.WithSchema(gatewayServiceCreateGatewayMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + gatewayServiceGetGatewayHandler := connect.NewUnaryHandler( + GatewayServiceGetGatewayProcedure, + svc.GetGateway, + connect.WithSchema(gatewayServiceGetGatewayMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + gatewayServiceListGatewaysHandler := connect.NewUnaryHandler( + GatewayServiceListGatewaysProcedure, + svc.ListGateways, + connect.WithSchema(gatewayServiceListGatewaysMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + gatewayServiceUpdateGatewayHandler := connect.NewUnaryHandler( + GatewayServiceUpdateGatewayProcedure, + svc.UpdateGateway, + connect.WithSchema(gatewayServiceUpdateGatewayMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + gatewayServiceDeleteGatewayHandler := connect.NewUnaryHandler( + GatewayServiceDeleteGatewayProcedure, + svc.DeleteGateway, + connect.WithSchema(gatewayServiceDeleteGatewayMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.GatewayService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case GatewayServiceCreateGatewayProcedure: + gatewayServiceCreateGatewayHandler.ServeHTTP(w, r) + case GatewayServiceGetGatewayProcedure: + gatewayServiceGetGatewayHandler.ServeHTTP(w, r) + case GatewayServiceListGatewaysProcedure: + gatewayServiceListGatewaysHandler.ServeHTTP(w, r) + case GatewayServiceUpdateGatewayProcedure: + gatewayServiceUpdateGatewayHandler.ServeHTTP(w, r) + case GatewayServiceDeleteGatewayProcedure: + gatewayServiceDeleteGatewayHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedGatewayServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedGatewayServiceHandler struct{} + +func (UnimplementedGatewayServiceHandler) CreateGateway(context.Context, *connect.Request[v1.CreateGatewayRequest]) (*connect.Response[v1.CreateGatewayResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayService.CreateGateway is not implemented")) +} + +func (UnimplementedGatewayServiceHandler) GetGateway(context.Context, *connect.Request[v1.GetGatewayRequest]) (*connect.Response[v1.GetGatewayResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayService.GetGateway is not implemented")) +} + +func (UnimplementedGatewayServiceHandler) ListGateways(context.Context, *connect.Request[v1.ListGatewaysRequest]) (*connect.Response[v1.ListGatewaysResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayService.ListGateways is not implemented")) +} + +func (UnimplementedGatewayServiceHandler) UpdateGateway(context.Context, *connect.Request[v1.UpdateGatewayRequest]) (*connect.Response[v1.UpdateGatewayResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayService.UpdateGateway is not implemented")) +} + +func (UnimplementedGatewayServiceHandler) DeleteGateway(context.Context, *connect.Request[v1.DeleteGatewayRequest]) (*connect.Response[v1.DeleteGatewayResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayService.DeleteGateway is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.gw.go new file mode 100644 index 0000000000..0877b3017f --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway.connect.gw.go @@ -0,0 +1,64 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/gateway.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// GatewayServiceGatewayServer implements the gRPC server API for the GatewayService service. +type GatewayServiceGatewayServer struct { + v1.UnimplementedGatewayServiceServer + createGateway connect_gateway.UnaryHandler[v1.CreateGatewayRequest, v1.CreateGatewayResponse] + getGateway connect_gateway.UnaryHandler[v1.GetGatewayRequest, v1.GetGatewayResponse] + listGateways connect_gateway.UnaryHandler[v1.ListGatewaysRequest, v1.ListGatewaysResponse] + updateGateway connect_gateway.UnaryHandler[v1.UpdateGatewayRequest, v1.UpdateGatewayResponse] + deleteGateway connect_gateway.UnaryHandler[v1.DeleteGatewayRequest, v1.DeleteGatewayResponse] +} + +// NewGatewayServiceGatewayServer constructs a Connect-Gateway gRPC server for the GatewayService +// service. +func NewGatewayServiceGatewayServer(svc GatewayServiceHandler, opts ...connect_gateway.HandlerOption) *GatewayServiceGatewayServer { + return &GatewayServiceGatewayServer{ + createGateway: connect_gateway.NewUnaryHandler(GatewayServiceCreateGatewayProcedure, svc.CreateGateway, opts...), + getGateway: connect_gateway.NewUnaryHandler(GatewayServiceGetGatewayProcedure, svc.GetGateway, opts...), + listGateways: connect_gateway.NewUnaryHandler(GatewayServiceListGatewaysProcedure, svc.ListGateways, opts...), + updateGateway: connect_gateway.NewUnaryHandler(GatewayServiceUpdateGatewayProcedure, svc.UpdateGateway, opts...), + deleteGateway: connect_gateway.NewUnaryHandler(GatewayServiceDeleteGatewayProcedure, svc.DeleteGateway, opts...), + } +} + +func (s *GatewayServiceGatewayServer) CreateGateway(ctx context.Context, req *v1.CreateGatewayRequest) (*v1.CreateGatewayResponse, error) { + return s.createGateway(ctx, req) +} + +func (s *GatewayServiceGatewayServer) GetGateway(ctx context.Context, req *v1.GetGatewayRequest) (*v1.GetGatewayResponse, error) { + return s.getGateway(ctx, req) +} + +func (s *GatewayServiceGatewayServer) ListGateways(ctx context.Context, req *v1.ListGatewaysRequest) (*v1.ListGatewaysResponse, error) { + return s.listGateways(ctx, req) +} + +func (s *GatewayServiceGatewayServer) UpdateGateway(ctx context.Context, req *v1.UpdateGatewayRequest) (*v1.UpdateGatewayResponse, error) { + return s.updateGateway(ctx, req) +} + +func (s *GatewayServiceGatewayServer) DeleteGateway(ctx context.Context, req *v1.DeleteGatewayRequest) (*v1.DeleteGatewayResponse, error) { + return s.deleteGateway(ctx, req) +} + +// RegisterGatewayServiceHandlerGatewayServer registers the Connect handlers for the GatewayService +// "svc" to "mux". +func RegisterGatewayServiceHandlerGatewayServer(mux *runtime.ServeMux, svc GatewayServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterGatewayServiceHandlerServer(context.TODO(), mux, NewGatewayServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.go new file mode 100644 index 0000000000..7f177777e9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.go @@ -0,0 +1,177 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/gateway_config.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // GatewayConfigServiceName is the fully-qualified name of the GatewayConfigService service. + GatewayConfigServiceName = "redpanda.api.aigateway.v1.GatewayConfigService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // GatewayConfigServiceStreamConfigProcedure is the fully-qualified name of the + // GatewayConfigService's StreamConfig RPC. + GatewayConfigServiceStreamConfigProcedure = "/redpanda.api.aigateway.v1.GatewayConfigService/StreamConfig" + // GatewayConfigServiceFetchConfigProcedure is the fully-qualified name of the + // GatewayConfigService's FetchConfig RPC. + GatewayConfigServiceFetchConfigProcedure = "/redpanda.api.aigateway.v1.GatewayConfigService/FetchConfig" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + gatewayConfigServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_gateway_config_proto.Services().ByName("GatewayConfigService") + gatewayConfigServiceStreamConfigMethodDescriptor = gatewayConfigServiceServiceDescriptor.Methods().ByName("StreamConfig") + gatewayConfigServiceFetchConfigMethodDescriptor = gatewayConfigServiceServiceDescriptor.Methods().ByName("FetchConfig") +) + +// GatewayConfigServiceClient is a client for the redpanda.api.aigateway.v1.GatewayConfigService +// service. +type GatewayConfigServiceClient interface { + // StreamConfig establishes a bidirectional stream for configuration updates. + // + // Flow: + // 1. Gateway sends StreamConfigRequest with node info and optional last_version + // 2. Control plane sends initial StreamConfigResponse with full snapshot (if no version) + // or delta updates since last_version + // 3. Gateway sends ACK with received version + // 4. Control plane streams delta updates as resources change + // 5. Gateway ACKs each update + // + // On reconnection, gateway sends last successfully applied version to resume + // from where it left off. + StreamConfig(context.Context) *connect.BidiStreamForClient[v1.StreamConfigRequest, v1.StreamConfigResponse] + // FetchConfig retrieves the current configuration snapshot. + // Use this for simple polling-based updates or initial bootstrap. + // For real-time updates, prefer StreamConfig. + FetchConfig(context.Context, *connect.Request[v1.FetchConfigRequest]) (*connect.Response[v1.FetchConfigResponse], error) +} + +// NewGatewayConfigServiceClient constructs a client for the +// redpanda.api.aigateway.v1.GatewayConfigService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewGatewayConfigServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) GatewayConfigServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &gatewayConfigServiceClient{ + streamConfig: connect.NewClient[v1.StreamConfigRequest, v1.StreamConfigResponse]( + httpClient, + baseURL+GatewayConfigServiceStreamConfigProcedure, + connect.WithSchema(gatewayConfigServiceStreamConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + fetchConfig: connect.NewClient[v1.FetchConfigRequest, v1.FetchConfigResponse]( + httpClient, + baseURL+GatewayConfigServiceFetchConfigProcedure, + connect.WithSchema(gatewayConfigServiceFetchConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// gatewayConfigServiceClient implements GatewayConfigServiceClient. +type gatewayConfigServiceClient struct { + streamConfig *connect.Client[v1.StreamConfigRequest, v1.StreamConfigResponse] + fetchConfig *connect.Client[v1.FetchConfigRequest, v1.FetchConfigResponse] +} + +// StreamConfig calls redpanda.api.aigateway.v1.GatewayConfigService.StreamConfig. +func (c *gatewayConfigServiceClient) StreamConfig(ctx context.Context) *connect.BidiStreamForClient[v1.StreamConfigRequest, v1.StreamConfigResponse] { + return c.streamConfig.CallBidiStream(ctx) +} + +// FetchConfig calls redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig. +func (c *gatewayConfigServiceClient) FetchConfig(ctx context.Context, req *connect.Request[v1.FetchConfigRequest]) (*connect.Response[v1.FetchConfigResponse], error) { + return c.fetchConfig.CallUnary(ctx, req) +} + +// GatewayConfigServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.GatewayConfigService service. +type GatewayConfigServiceHandler interface { + // StreamConfig establishes a bidirectional stream for configuration updates. + // + // Flow: + // 1. Gateway sends StreamConfigRequest with node info and optional last_version + // 2. Control plane sends initial StreamConfigResponse with full snapshot (if no version) + // or delta updates since last_version + // 3. Gateway sends ACK with received version + // 4. Control plane streams delta updates as resources change + // 5. Gateway ACKs each update + // + // On reconnection, gateway sends last successfully applied version to resume + // from where it left off. + StreamConfig(context.Context, *connect.BidiStream[v1.StreamConfigRequest, v1.StreamConfigResponse]) error + // FetchConfig retrieves the current configuration snapshot. + // Use this for simple polling-based updates or initial bootstrap. + // For real-time updates, prefer StreamConfig. + FetchConfig(context.Context, *connect.Request[v1.FetchConfigRequest]) (*connect.Response[v1.FetchConfigResponse], error) +} + +// NewGatewayConfigServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewGatewayConfigServiceHandler(svc GatewayConfigServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + gatewayConfigServiceStreamConfigHandler := connect.NewBidiStreamHandler( + GatewayConfigServiceStreamConfigProcedure, + svc.StreamConfig, + connect.WithSchema(gatewayConfigServiceStreamConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + gatewayConfigServiceFetchConfigHandler := connect.NewUnaryHandler( + GatewayConfigServiceFetchConfigProcedure, + svc.FetchConfig, + connect.WithSchema(gatewayConfigServiceFetchConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.GatewayConfigService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case GatewayConfigServiceStreamConfigProcedure: + gatewayConfigServiceStreamConfigHandler.ServeHTTP(w, r) + case GatewayConfigServiceFetchConfigProcedure: + gatewayConfigServiceFetchConfigHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedGatewayConfigServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedGatewayConfigServiceHandler struct{} + +func (UnimplementedGatewayConfigServiceHandler) StreamConfig(context.Context, *connect.BidiStream[v1.StreamConfigRequest, v1.StreamConfigResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayConfigService.StreamConfig is not implemented")) +} + +func (UnimplementedGatewayConfigServiceHandler) FetchConfig(context.Context, *connect.Request[v1.FetchConfigRequest]) (*connect.Response[v1.FetchConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.gw.go new file mode 100644 index 0000000000..7c6e6c4ab8 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/gateway_config.connect.gw.go @@ -0,0 +1,47 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/gateway_config.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// GatewayConfigServiceGatewayServer implements the gRPC server API for the GatewayConfigService +// service. +type GatewayConfigServiceGatewayServer struct { + v1.UnimplementedGatewayConfigServiceServer + fetchConfig connect_gateway.UnaryHandler[v1.FetchConfigRequest, v1.FetchConfigResponse] +} + +// NewGatewayConfigServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// GatewayConfigService service. +func NewGatewayConfigServiceGatewayServer(svc GatewayConfigServiceHandler, opts ...connect_gateway.HandlerOption) *GatewayConfigServiceGatewayServer { + return &GatewayConfigServiceGatewayServer{ + fetchConfig: connect_gateway.NewUnaryHandler(GatewayConfigServiceFetchConfigProcedure, svc.FetchConfig, opts...), + } +} + +func (s *GatewayConfigServiceGatewayServer) StreamConfig(v1.GatewayConfigService_StreamConfigServer) error { + return status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") +} + +func (s *GatewayConfigServiceGatewayServer) FetchConfig(ctx context.Context, req *v1.FetchConfigRequest) (*v1.FetchConfigResponse, error) { + return s.fetchConfig(ctx, req) +} + +// RegisterGatewayConfigServiceHandlerGatewayServer registers the Connect handlers for the +// GatewayConfigService "svc" to "mux". +func RegisterGatewayConfigServiceHandlerGatewayServer(mux *runtime.ServeMux, svc GatewayConfigServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterGatewayConfigServiceHandlerServer(context.TODO(), mux, NewGatewayConfigServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.go new file mode 100644 index 0000000000..70f67280d3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.go @@ -0,0 +1,235 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/guardrail.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // GuardrailServiceName is the fully-qualified name of the GuardrailService service. + GuardrailServiceName = "redpanda.api.aigateway.v1.GuardrailService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // GuardrailServiceCreateGuardrailProcedure is the fully-qualified name of the GuardrailService's + // CreateGuardrail RPC. + GuardrailServiceCreateGuardrailProcedure = "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail" + // GuardrailServiceGetGuardrailProcedure is the fully-qualified name of the GuardrailService's + // GetGuardrail RPC. + GuardrailServiceGetGuardrailProcedure = "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail" + // GuardrailServiceListGuardrailsProcedure is the fully-qualified name of the GuardrailService's + // ListGuardrails RPC. + GuardrailServiceListGuardrailsProcedure = "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails" + // GuardrailServiceUpdateGuardrailProcedure is the fully-qualified name of the GuardrailService's + // UpdateGuardrail RPC. + GuardrailServiceUpdateGuardrailProcedure = "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail" + // GuardrailServiceDeleteGuardrailProcedure is the fully-qualified name of the GuardrailService's + // DeleteGuardrail RPC. + GuardrailServiceDeleteGuardrailProcedure = "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + guardrailServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_guardrail_proto.Services().ByName("GuardrailService") + guardrailServiceCreateGuardrailMethodDescriptor = guardrailServiceServiceDescriptor.Methods().ByName("CreateGuardrail") + guardrailServiceGetGuardrailMethodDescriptor = guardrailServiceServiceDescriptor.Methods().ByName("GetGuardrail") + guardrailServiceListGuardrailsMethodDescriptor = guardrailServiceServiceDescriptor.Methods().ByName("ListGuardrails") + guardrailServiceUpdateGuardrailMethodDescriptor = guardrailServiceServiceDescriptor.Methods().ByName("UpdateGuardrail") + guardrailServiceDeleteGuardrailMethodDescriptor = guardrailServiceServiceDescriptor.Methods().ByName("DeleteGuardrail") +) + +// GuardrailServiceClient is a client for the redpanda.api.aigateway.v1.GuardrailService service. +type GuardrailServiceClient interface { + CreateGuardrail(context.Context, *connect.Request[v1.CreateGuardrailRequest]) (*connect.Response[v1.CreateGuardrailResponse], error) + GetGuardrail(context.Context, *connect.Request[v1.GetGuardrailRequest]) (*connect.Response[v1.GetGuardrailResponse], error) + ListGuardrails(context.Context, *connect.Request[v1.ListGuardrailsRequest]) (*connect.Response[v1.ListGuardrailsResponse], error) + UpdateGuardrail(context.Context, *connect.Request[v1.UpdateGuardrailRequest]) (*connect.Response[v1.UpdateGuardrailResponse], error) + DeleteGuardrail(context.Context, *connect.Request[v1.DeleteGuardrailRequest]) (*connect.Response[v1.DeleteGuardrailResponse], error) +} + +// NewGuardrailServiceClient constructs a client for the redpanda.api.aigateway.v1.GuardrailService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewGuardrailServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) GuardrailServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &guardrailServiceClient{ + createGuardrail: connect.NewClient[v1.CreateGuardrailRequest, v1.CreateGuardrailResponse]( + httpClient, + baseURL+GuardrailServiceCreateGuardrailProcedure, + connect.WithSchema(guardrailServiceCreateGuardrailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getGuardrail: connect.NewClient[v1.GetGuardrailRequest, v1.GetGuardrailResponse]( + httpClient, + baseURL+GuardrailServiceGetGuardrailProcedure, + connect.WithSchema(guardrailServiceGetGuardrailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listGuardrails: connect.NewClient[v1.ListGuardrailsRequest, v1.ListGuardrailsResponse]( + httpClient, + baseURL+GuardrailServiceListGuardrailsProcedure, + connect.WithSchema(guardrailServiceListGuardrailsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateGuardrail: connect.NewClient[v1.UpdateGuardrailRequest, v1.UpdateGuardrailResponse]( + httpClient, + baseURL+GuardrailServiceUpdateGuardrailProcedure, + connect.WithSchema(guardrailServiceUpdateGuardrailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteGuardrail: connect.NewClient[v1.DeleteGuardrailRequest, v1.DeleteGuardrailResponse]( + httpClient, + baseURL+GuardrailServiceDeleteGuardrailProcedure, + connect.WithSchema(guardrailServiceDeleteGuardrailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// guardrailServiceClient implements GuardrailServiceClient. +type guardrailServiceClient struct { + createGuardrail *connect.Client[v1.CreateGuardrailRequest, v1.CreateGuardrailResponse] + getGuardrail *connect.Client[v1.GetGuardrailRequest, v1.GetGuardrailResponse] + listGuardrails *connect.Client[v1.ListGuardrailsRequest, v1.ListGuardrailsResponse] + updateGuardrail *connect.Client[v1.UpdateGuardrailRequest, v1.UpdateGuardrailResponse] + deleteGuardrail *connect.Client[v1.DeleteGuardrailRequest, v1.DeleteGuardrailResponse] +} + +// CreateGuardrail calls redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail. +func (c *guardrailServiceClient) CreateGuardrail(ctx context.Context, req *connect.Request[v1.CreateGuardrailRequest]) (*connect.Response[v1.CreateGuardrailResponse], error) { + return c.createGuardrail.CallUnary(ctx, req) +} + +// GetGuardrail calls redpanda.api.aigateway.v1.GuardrailService.GetGuardrail. +func (c *guardrailServiceClient) GetGuardrail(ctx context.Context, req *connect.Request[v1.GetGuardrailRequest]) (*connect.Response[v1.GetGuardrailResponse], error) { + return c.getGuardrail.CallUnary(ctx, req) +} + +// ListGuardrails calls redpanda.api.aigateway.v1.GuardrailService.ListGuardrails. +func (c *guardrailServiceClient) ListGuardrails(ctx context.Context, req *connect.Request[v1.ListGuardrailsRequest]) (*connect.Response[v1.ListGuardrailsResponse], error) { + return c.listGuardrails.CallUnary(ctx, req) +} + +// UpdateGuardrail calls redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail. +func (c *guardrailServiceClient) UpdateGuardrail(ctx context.Context, req *connect.Request[v1.UpdateGuardrailRequest]) (*connect.Response[v1.UpdateGuardrailResponse], error) { + return c.updateGuardrail.CallUnary(ctx, req) +} + +// DeleteGuardrail calls redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail. +func (c *guardrailServiceClient) DeleteGuardrail(ctx context.Context, req *connect.Request[v1.DeleteGuardrailRequest]) (*connect.Response[v1.DeleteGuardrailResponse], error) { + return c.deleteGuardrail.CallUnary(ctx, req) +} + +// GuardrailServiceHandler is an implementation of the redpanda.api.aigateway.v1.GuardrailService +// service. +type GuardrailServiceHandler interface { + CreateGuardrail(context.Context, *connect.Request[v1.CreateGuardrailRequest]) (*connect.Response[v1.CreateGuardrailResponse], error) + GetGuardrail(context.Context, *connect.Request[v1.GetGuardrailRequest]) (*connect.Response[v1.GetGuardrailResponse], error) + ListGuardrails(context.Context, *connect.Request[v1.ListGuardrailsRequest]) (*connect.Response[v1.ListGuardrailsResponse], error) + UpdateGuardrail(context.Context, *connect.Request[v1.UpdateGuardrailRequest]) (*connect.Response[v1.UpdateGuardrailResponse], error) + DeleteGuardrail(context.Context, *connect.Request[v1.DeleteGuardrailRequest]) (*connect.Response[v1.DeleteGuardrailResponse], error) +} + +// NewGuardrailServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewGuardrailServiceHandler(svc GuardrailServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + guardrailServiceCreateGuardrailHandler := connect.NewUnaryHandler( + GuardrailServiceCreateGuardrailProcedure, + svc.CreateGuardrail, + connect.WithSchema(guardrailServiceCreateGuardrailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + guardrailServiceGetGuardrailHandler := connect.NewUnaryHandler( + GuardrailServiceGetGuardrailProcedure, + svc.GetGuardrail, + connect.WithSchema(guardrailServiceGetGuardrailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + guardrailServiceListGuardrailsHandler := connect.NewUnaryHandler( + GuardrailServiceListGuardrailsProcedure, + svc.ListGuardrails, + connect.WithSchema(guardrailServiceListGuardrailsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + guardrailServiceUpdateGuardrailHandler := connect.NewUnaryHandler( + GuardrailServiceUpdateGuardrailProcedure, + svc.UpdateGuardrail, + connect.WithSchema(guardrailServiceUpdateGuardrailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + guardrailServiceDeleteGuardrailHandler := connect.NewUnaryHandler( + GuardrailServiceDeleteGuardrailProcedure, + svc.DeleteGuardrail, + connect.WithSchema(guardrailServiceDeleteGuardrailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.GuardrailService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case GuardrailServiceCreateGuardrailProcedure: + guardrailServiceCreateGuardrailHandler.ServeHTTP(w, r) + case GuardrailServiceGetGuardrailProcedure: + guardrailServiceGetGuardrailHandler.ServeHTTP(w, r) + case GuardrailServiceListGuardrailsProcedure: + guardrailServiceListGuardrailsHandler.ServeHTTP(w, r) + case GuardrailServiceUpdateGuardrailProcedure: + guardrailServiceUpdateGuardrailHandler.ServeHTTP(w, r) + case GuardrailServiceDeleteGuardrailProcedure: + guardrailServiceDeleteGuardrailHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedGuardrailServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedGuardrailServiceHandler struct{} + +func (UnimplementedGuardrailServiceHandler) CreateGuardrail(context.Context, *connect.Request[v1.CreateGuardrailRequest]) (*connect.Response[v1.CreateGuardrailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail is not implemented")) +} + +func (UnimplementedGuardrailServiceHandler) GetGuardrail(context.Context, *connect.Request[v1.GetGuardrailRequest]) (*connect.Response[v1.GetGuardrailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GuardrailService.GetGuardrail is not implemented")) +} + +func (UnimplementedGuardrailServiceHandler) ListGuardrails(context.Context, *connect.Request[v1.ListGuardrailsRequest]) (*connect.Response[v1.ListGuardrailsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GuardrailService.ListGuardrails is not implemented")) +} + +func (UnimplementedGuardrailServiceHandler) UpdateGuardrail(context.Context, *connect.Request[v1.UpdateGuardrailRequest]) (*connect.Response[v1.UpdateGuardrailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail is not implemented")) +} + +func (UnimplementedGuardrailServiceHandler) DeleteGuardrail(context.Context, *connect.Request[v1.DeleteGuardrailRequest]) (*connect.Response[v1.DeleteGuardrailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.gw.go new file mode 100644 index 0000000000..c434291272 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/guardrail.connect.gw.go @@ -0,0 +1,64 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/guardrail.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// GuardrailServiceGatewayServer implements the gRPC server API for the GuardrailService service. +type GuardrailServiceGatewayServer struct { + v1.UnimplementedGuardrailServiceServer + createGuardrail connect_gateway.UnaryHandler[v1.CreateGuardrailRequest, v1.CreateGuardrailResponse] + getGuardrail connect_gateway.UnaryHandler[v1.GetGuardrailRequest, v1.GetGuardrailResponse] + listGuardrails connect_gateway.UnaryHandler[v1.ListGuardrailsRequest, v1.ListGuardrailsResponse] + updateGuardrail connect_gateway.UnaryHandler[v1.UpdateGuardrailRequest, v1.UpdateGuardrailResponse] + deleteGuardrail connect_gateway.UnaryHandler[v1.DeleteGuardrailRequest, v1.DeleteGuardrailResponse] +} + +// NewGuardrailServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// GuardrailService service. +func NewGuardrailServiceGatewayServer(svc GuardrailServiceHandler, opts ...connect_gateway.HandlerOption) *GuardrailServiceGatewayServer { + return &GuardrailServiceGatewayServer{ + createGuardrail: connect_gateway.NewUnaryHandler(GuardrailServiceCreateGuardrailProcedure, svc.CreateGuardrail, opts...), + getGuardrail: connect_gateway.NewUnaryHandler(GuardrailServiceGetGuardrailProcedure, svc.GetGuardrail, opts...), + listGuardrails: connect_gateway.NewUnaryHandler(GuardrailServiceListGuardrailsProcedure, svc.ListGuardrails, opts...), + updateGuardrail: connect_gateway.NewUnaryHandler(GuardrailServiceUpdateGuardrailProcedure, svc.UpdateGuardrail, opts...), + deleteGuardrail: connect_gateway.NewUnaryHandler(GuardrailServiceDeleteGuardrailProcedure, svc.DeleteGuardrail, opts...), + } +} + +func (s *GuardrailServiceGatewayServer) CreateGuardrail(ctx context.Context, req *v1.CreateGuardrailRequest) (*v1.CreateGuardrailResponse, error) { + return s.createGuardrail(ctx, req) +} + +func (s *GuardrailServiceGatewayServer) GetGuardrail(ctx context.Context, req *v1.GetGuardrailRequest) (*v1.GetGuardrailResponse, error) { + return s.getGuardrail(ctx, req) +} + +func (s *GuardrailServiceGatewayServer) ListGuardrails(ctx context.Context, req *v1.ListGuardrailsRequest) (*v1.ListGuardrailsResponse, error) { + return s.listGuardrails(ctx, req) +} + +func (s *GuardrailServiceGatewayServer) UpdateGuardrail(ctx context.Context, req *v1.UpdateGuardrailRequest) (*v1.UpdateGuardrailResponse, error) { + return s.updateGuardrail(ctx, req) +} + +func (s *GuardrailServiceGatewayServer) DeleteGuardrail(ctx context.Context, req *v1.DeleteGuardrailRequest) (*v1.DeleteGuardrailResponse, error) { + return s.deleteGuardrail(ctx, req) +} + +// RegisterGuardrailServiceHandlerGatewayServer registers the Connect handlers for the +// GuardrailService "svc" to "mux". +func RegisterGuardrailServiceHandlerGatewayServer(mux *runtime.ServeMux, svc GuardrailServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterGuardrailServiceHandlerServer(context.TODO(), mux, NewGuardrailServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.go new file mode 100644 index 0000000000..3234baf8db --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.go @@ -0,0 +1,247 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/iam_settings.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // IAMSettingsServiceName is the fully-qualified name of the IAMSettingsService service. + IAMSettingsServiceName = "redpanda.api.aigateway.v1.IAMSettingsService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // IAMSettingsServiceGetIAMSettingProcedure is the fully-qualified name of the IAMSettingsService's + // GetIAMSetting RPC. + IAMSettingsServiceGetIAMSettingProcedure = "/redpanda.api.aigateway.v1.IAMSettingsService/GetIAMSetting" + // IAMSettingsServiceListIAMSettingsProcedure is the fully-qualified name of the + // IAMSettingsService's ListIAMSettings RPC. + IAMSettingsServiceListIAMSettingsProcedure = "/redpanda.api.aigateway.v1.IAMSettingsService/ListIAMSettings" + // IAMSettingsServiceUpdateIAMSettingProcedure is the fully-qualified name of the + // IAMSettingsService's UpdateIAMSetting RPC. + IAMSettingsServiceUpdateIAMSettingProcedure = "/redpanda.api.aigateway.v1.IAMSettingsService/UpdateIAMSetting" + // IAMSettingsServiceBatchUpdateIAMSettingsProcedure is the fully-qualified name of the + // IAMSettingsService's BatchUpdateIAMSettings RPC. + IAMSettingsServiceBatchUpdateIAMSettingsProcedure = "/redpanda.api.aigateway.v1.IAMSettingsService/BatchUpdateIAMSettings" + // IAMSettingsServiceDeleteIAMSettingProcedure is the fully-qualified name of the + // IAMSettingsService's DeleteIAMSetting RPC. + IAMSettingsServiceDeleteIAMSettingProcedure = "/redpanda.api.aigateway.v1.IAMSettingsService/DeleteIAMSetting" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + iAMSettingsServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_iam_settings_proto.Services().ByName("IAMSettingsService") + iAMSettingsServiceGetIAMSettingMethodDescriptor = iAMSettingsServiceServiceDescriptor.Methods().ByName("GetIAMSetting") + iAMSettingsServiceListIAMSettingsMethodDescriptor = iAMSettingsServiceServiceDescriptor.Methods().ByName("ListIAMSettings") + iAMSettingsServiceUpdateIAMSettingMethodDescriptor = iAMSettingsServiceServiceDescriptor.Methods().ByName("UpdateIAMSetting") + iAMSettingsServiceBatchUpdateIAMSettingsMethodDescriptor = iAMSettingsServiceServiceDescriptor.Methods().ByName("BatchUpdateIAMSettings") + iAMSettingsServiceDeleteIAMSettingMethodDescriptor = iAMSettingsServiceServiceDescriptor.Methods().ByName("DeleteIAMSetting") +) + +// IAMSettingsServiceClient is a client for the redpanda.api.aigateway.v1.IAMSettingsService +// service. +type IAMSettingsServiceClient interface { + // Gets a specific IAM setting by key. + GetIAMSetting(context.Context, *connect.Request[v1.GetIAMSettingRequest]) (*connect.Response[v1.GetIAMSettingResponse], error) + // Lists IAM settings, optionally filtered by category. + ListIAMSettings(context.Context, *connect.Request[v1.ListIAMSettingsRequest]) (*connect.Response[v1.ListIAMSettingsResponse], error) + // Updates an IAM setting. + UpdateIAMSetting(context.Context, *connect.Request[v1.UpdateIAMSettingRequest]) (*connect.Response[v1.UpdateIAMSettingResponse], error) + // Batch updates multiple IAM settings. + BatchUpdateIAMSettings(context.Context, *connect.Request[v1.BatchUpdateIAMSettingsRequest]) (*connect.Response[v1.BatchUpdateIAMSettingsResponse], error) + // Deletes an IAM setting (resets to default). + DeleteIAMSetting(context.Context, *connect.Request[v1.DeleteIAMSettingRequest]) (*connect.Response[v1.DeleteIAMSettingResponse], error) +} + +// NewIAMSettingsServiceClient constructs a client for the +// redpanda.api.aigateway.v1.IAMSettingsService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewIAMSettingsServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) IAMSettingsServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &iAMSettingsServiceClient{ + getIAMSetting: connect.NewClient[v1.GetIAMSettingRequest, v1.GetIAMSettingResponse]( + httpClient, + baseURL+IAMSettingsServiceGetIAMSettingProcedure, + connect.WithSchema(iAMSettingsServiceGetIAMSettingMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listIAMSettings: connect.NewClient[v1.ListIAMSettingsRequest, v1.ListIAMSettingsResponse]( + httpClient, + baseURL+IAMSettingsServiceListIAMSettingsProcedure, + connect.WithSchema(iAMSettingsServiceListIAMSettingsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateIAMSetting: connect.NewClient[v1.UpdateIAMSettingRequest, v1.UpdateIAMSettingResponse]( + httpClient, + baseURL+IAMSettingsServiceUpdateIAMSettingProcedure, + connect.WithSchema(iAMSettingsServiceUpdateIAMSettingMethodDescriptor), + connect.WithClientOptions(opts...), + ), + batchUpdateIAMSettings: connect.NewClient[v1.BatchUpdateIAMSettingsRequest, v1.BatchUpdateIAMSettingsResponse]( + httpClient, + baseURL+IAMSettingsServiceBatchUpdateIAMSettingsProcedure, + connect.WithSchema(iAMSettingsServiceBatchUpdateIAMSettingsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteIAMSetting: connect.NewClient[v1.DeleteIAMSettingRequest, v1.DeleteIAMSettingResponse]( + httpClient, + baseURL+IAMSettingsServiceDeleteIAMSettingProcedure, + connect.WithSchema(iAMSettingsServiceDeleteIAMSettingMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// iAMSettingsServiceClient implements IAMSettingsServiceClient. +type iAMSettingsServiceClient struct { + getIAMSetting *connect.Client[v1.GetIAMSettingRequest, v1.GetIAMSettingResponse] + listIAMSettings *connect.Client[v1.ListIAMSettingsRequest, v1.ListIAMSettingsResponse] + updateIAMSetting *connect.Client[v1.UpdateIAMSettingRequest, v1.UpdateIAMSettingResponse] + batchUpdateIAMSettings *connect.Client[v1.BatchUpdateIAMSettingsRequest, v1.BatchUpdateIAMSettingsResponse] + deleteIAMSetting *connect.Client[v1.DeleteIAMSettingRequest, v1.DeleteIAMSettingResponse] +} + +// GetIAMSetting calls redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting. +func (c *iAMSettingsServiceClient) GetIAMSetting(ctx context.Context, req *connect.Request[v1.GetIAMSettingRequest]) (*connect.Response[v1.GetIAMSettingResponse], error) { + return c.getIAMSetting.CallUnary(ctx, req) +} + +// ListIAMSettings calls redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings. +func (c *iAMSettingsServiceClient) ListIAMSettings(ctx context.Context, req *connect.Request[v1.ListIAMSettingsRequest]) (*connect.Response[v1.ListIAMSettingsResponse], error) { + return c.listIAMSettings.CallUnary(ctx, req) +} + +// UpdateIAMSetting calls redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting. +func (c *iAMSettingsServiceClient) UpdateIAMSetting(ctx context.Context, req *connect.Request[v1.UpdateIAMSettingRequest]) (*connect.Response[v1.UpdateIAMSettingResponse], error) { + return c.updateIAMSetting.CallUnary(ctx, req) +} + +// BatchUpdateIAMSettings calls redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings. +func (c *iAMSettingsServiceClient) BatchUpdateIAMSettings(ctx context.Context, req *connect.Request[v1.BatchUpdateIAMSettingsRequest]) (*connect.Response[v1.BatchUpdateIAMSettingsResponse], error) { + return c.batchUpdateIAMSettings.CallUnary(ctx, req) +} + +// DeleteIAMSetting calls redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting. +func (c *iAMSettingsServiceClient) DeleteIAMSetting(ctx context.Context, req *connect.Request[v1.DeleteIAMSettingRequest]) (*connect.Response[v1.DeleteIAMSettingResponse], error) { + return c.deleteIAMSetting.CallUnary(ctx, req) +} + +// IAMSettingsServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.IAMSettingsService service. +type IAMSettingsServiceHandler interface { + // Gets a specific IAM setting by key. + GetIAMSetting(context.Context, *connect.Request[v1.GetIAMSettingRequest]) (*connect.Response[v1.GetIAMSettingResponse], error) + // Lists IAM settings, optionally filtered by category. + ListIAMSettings(context.Context, *connect.Request[v1.ListIAMSettingsRequest]) (*connect.Response[v1.ListIAMSettingsResponse], error) + // Updates an IAM setting. + UpdateIAMSetting(context.Context, *connect.Request[v1.UpdateIAMSettingRequest]) (*connect.Response[v1.UpdateIAMSettingResponse], error) + // Batch updates multiple IAM settings. + BatchUpdateIAMSettings(context.Context, *connect.Request[v1.BatchUpdateIAMSettingsRequest]) (*connect.Response[v1.BatchUpdateIAMSettingsResponse], error) + // Deletes an IAM setting (resets to default). + DeleteIAMSetting(context.Context, *connect.Request[v1.DeleteIAMSettingRequest]) (*connect.Response[v1.DeleteIAMSettingResponse], error) +} + +// NewIAMSettingsServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewIAMSettingsServiceHandler(svc IAMSettingsServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + iAMSettingsServiceGetIAMSettingHandler := connect.NewUnaryHandler( + IAMSettingsServiceGetIAMSettingProcedure, + svc.GetIAMSetting, + connect.WithSchema(iAMSettingsServiceGetIAMSettingMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + iAMSettingsServiceListIAMSettingsHandler := connect.NewUnaryHandler( + IAMSettingsServiceListIAMSettingsProcedure, + svc.ListIAMSettings, + connect.WithSchema(iAMSettingsServiceListIAMSettingsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + iAMSettingsServiceUpdateIAMSettingHandler := connect.NewUnaryHandler( + IAMSettingsServiceUpdateIAMSettingProcedure, + svc.UpdateIAMSetting, + connect.WithSchema(iAMSettingsServiceUpdateIAMSettingMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + iAMSettingsServiceBatchUpdateIAMSettingsHandler := connect.NewUnaryHandler( + IAMSettingsServiceBatchUpdateIAMSettingsProcedure, + svc.BatchUpdateIAMSettings, + connect.WithSchema(iAMSettingsServiceBatchUpdateIAMSettingsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + iAMSettingsServiceDeleteIAMSettingHandler := connect.NewUnaryHandler( + IAMSettingsServiceDeleteIAMSettingProcedure, + svc.DeleteIAMSetting, + connect.WithSchema(iAMSettingsServiceDeleteIAMSettingMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.IAMSettingsService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case IAMSettingsServiceGetIAMSettingProcedure: + iAMSettingsServiceGetIAMSettingHandler.ServeHTTP(w, r) + case IAMSettingsServiceListIAMSettingsProcedure: + iAMSettingsServiceListIAMSettingsHandler.ServeHTTP(w, r) + case IAMSettingsServiceUpdateIAMSettingProcedure: + iAMSettingsServiceUpdateIAMSettingHandler.ServeHTTP(w, r) + case IAMSettingsServiceBatchUpdateIAMSettingsProcedure: + iAMSettingsServiceBatchUpdateIAMSettingsHandler.ServeHTTP(w, r) + case IAMSettingsServiceDeleteIAMSettingProcedure: + iAMSettingsServiceDeleteIAMSettingHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedIAMSettingsServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedIAMSettingsServiceHandler struct{} + +func (UnimplementedIAMSettingsServiceHandler) GetIAMSetting(context.Context, *connect.Request[v1.GetIAMSettingRequest]) (*connect.Response[v1.GetIAMSettingResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting is not implemented")) +} + +func (UnimplementedIAMSettingsServiceHandler) ListIAMSettings(context.Context, *connect.Request[v1.ListIAMSettingsRequest]) (*connect.Response[v1.ListIAMSettingsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings is not implemented")) +} + +func (UnimplementedIAMSettingsServiceHandler) UpdateIAMSetting(context.Context, *connect.Request[v1.UpdateIAMSettingRequest]) (*connect.Response[v1.UpdateIAMSettingResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting is not implemented")) +} + +func (UnimplementedIAMSettingsServiceHandler) BatchUpdateIAMSettings(context.Context, *connect.Request[v1.BatchUpdateIAMSettingsRequest]) (*connect.Response[v1.BatchUpdateIAMSettingsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings is not implemented")) +} + +func (UnimplementedIAMSettingsServiceHandler) DeleteIAMSetting(context.Context, *connect.Request[v1.DeleteIAMSettingRequest]) (*connect.Response[v1.DeleteIAMSettingResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.gw.go new file mode 100644 index 0000000000..6c284a99c9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/iam_settings.connect.gw.go @@ -0,0 +1,65 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/iam_settings.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// IAMSettingsServiceGatewayServer implements the gRPC server API for the IAMSettingsService +// service. +type IAMSettingsServiceGatewayServer struct { + v1.UnimplementedIAMSettingsServiceServer + getIAMSetting connect_gateway.UnaryHandler[v1.GetIAMSettingRequest, v1.GetIAMSettingResponse] + listIAMSettings connect_gateway.UnaryHandler[v1.ListIAMSettingsRequest, v1.ListIAMSettingsResponse] + updateIAMSetting connect_gateway.UnaryHandler[v1.UpdateIAMSettingRequest, v1.UpdateIAMSettingResponse] + batchUpdateIAMSettings connect_gateway.UnaryHandler[v1.BatchUpdateIAMSettingsRequest, v1.BatchUpdateIAMSettingsResponse] + deleteIAMSetting connect_gateway.UnaryHandler[v1.DeleteIAMSettingRequest, v1.DeleteIAMSettingResponse] +} + +// NewIAMSettingsServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// IAMSettingsService service. +func NewIAMSettingsServiceGatewayServer(svc IAMSettingsServiceHandler, opts ...connect_gateway.HandlerOption) *IAMSettingsServiceGatewayServer { + return &IAMSettingsServiceGatewayServer{ + getIAMSetting: connect_gateway.NewUnaryHandler(IAMSettingsServiceGetIAMSettingProcedure, svc.GetIAMSetting, opts...), + listIAMSettings: connect_gateway.NewUnaryHandler(IAMSettingsServiceListIAMSettingsProcedure, svc.ListIAMSettings, opts...), + updateIAMSetting: connect_gateway.NewUnaryHandler(IAMSettingsServiceUpdateIAMSettingProcedure, svc.UpdateIAMSetting, opts...), + batchUpdateIAMSettings: connect_gateway.NewUnaryHandler(IAMSettingsServiceBatchUpdateIAMSettingsProcedure, svc.BatchUpdateIAMSettings, opts...), + deleteIAMSetting: connect_gateway.NewUnaryHandler(IAMSettingsServiceDeleteIAMSettingProcedure, svc.DeleteIAMSetting, opts...), + } +} + +func (s *IAMSettingsServiceGatewayServer) GetIAMSetting(ctx context.Context, req *v1.GetIAMSettingRequest) (*v1.GetIAMSettingResponse, error) { + return s.getIAMSetting(ctx, req) +} + +func (s *IAMSettingsServiceGatewayServer) ListIAMSettings(ctx context.Context, req *v1.ListIAMSettingsRequest) (*v1.ListIAMSettingsResponse, error) { + return s.listIAMSettings(ctx, req) +} + +func (s *IAMSettingsServiceGatewayServer) UpdateIAMSetting(ctx context.Context, req *v1.UpdateIAMSettingRequest) (*v1.UpdateIAMSettingResponse, error) { + return s.updateIAMSetting(ctx, req) +} + +func (s *IAMSettingsServiceGatewayServer) BatchUpdateIAMSettings(ctx context.Context, req *v1.BatchUpdateIAMSettingsRequest) (*v1.BatchUpdateIAMSettingsResponse, error) { + return s.batchUpdateIAMSettings(ctx, req) +} + +func (s *IAMSettingsServiceGatewayServer) DeleteIAMSetting(ctx context.Context, req *v1.DeleteIAMSettingRequest) (*v1.DeleteIAMSettingResponse, error) { + return s.deleteIAMSetting(ctx, req) +} + +// RegisterIAMSettingsServiceHandlerGatewayServer registers the Connect handlers for the +// IAMSettingsService "svc" to "mux". +func RegisterIAMSettingsServiceHandlerGatewayServer(mux *runtime.ServeMux, svc IAMSettingsServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterIAMSettingsServiceHandlerServer(context.TODO(), mux, NewIAMSettingsServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.go new file mode 100644 index 0000000000..61f21fb7bd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.go @@ -0,0 +1,117 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/mcp_tools.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // MCPToolsServiceName is the fully-qualified name of the MCPToolsService service. + MCPToolsServiceName = "redpanda.api.aigateway.v1.MCPToolsService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // MCPToolsServiceListMCPToolsProcedure is the fully-qualified name of the MCPToolsService's + // ListMCPTools RPC. + MCPToolsServiceListMCPToolsProcedure = "/redpanda.api.aigateway.v1.MCPToolsService/ListMCPTools" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + mCPToolsServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_mcp_tools_proto.Services().ByName("MCPToolsService") + mCPToolsServiceListMCPToolsMethodDescriptor = mCPToolsServiceServiceDescriptor.Methods().ByName("ListMCPTools") +) + +// MCPToolsServiceClient is a client for the redpanda.api.aigateway.v1.MCPToolsService service. +type MCPToolsServiceClient interface { + // ListMCPTools returns the list of tools available in a gateway + ListMCPTools(context.Context, *connect.Request[v1.ListMCPToolsRequest]) (*connect.Response[v1.ListMCPToolsResponse], error) +} + +// NewMCPToolsServiceClient constructs a client for the redpanda.api.aigateway.v1.MCPToolsService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewMCPToolsServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) MCPToolsServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &mCPToolsServiceClient{ + listMCPTools: connect.NewClient[v1.ListMCPToolsRequest, v1.ListMCPToolsResponse]( + httpClient, + baseURL+MCPToolsServiceListMCPToolsProcedure, + connect.WithSchema(mCPToolsServiceListMCPToolsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// mCPToolsServiceClient implements MCPToolsServiceClient. +type mCPToolsServiceClient struct { + listMCPTools *connect.Client[v1.ListMCPToolsRequest, v1.ListMCPToolsResponse] +} + +// ListMCPTools calls redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools. +func (c *mCPToolsServiceClient) ListMCPTools(ctx context.Context, req *connect.Request[v1.ListMCPToolsRequest]) (*connect.Response[v1.ListMCPToolsResponse], error) { + return c.listMCPTools.CallUnary(ctx, req) +} + +// MCPToolsServiceHandler is an implementation of the redpanda.api.aigateway.v1.MCPToolsService +// service. +type MCPToolsServiceHandler interface { + // ListMCPTools returns the list of tools available in a gateway + ListMCPTools(context.Context, *connect.Request[v1.ListMCPToolsRequest]) (*connect.Response[v1.ListMCPToolsResponse], error) +} + +// NewMCPToolsServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewMCPToolsServiceHandler(svc MCPToolsServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + mCPToolsServiceListMCPToolsHandler := connect.NewUnaryHandler( + MCPToolsServiceListMCPToolsProcedure, + svc.ListMCPTools, + connect.WithSchema(mCPToolsServiceListMCPToolsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.MCPToolsService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case MCPToolsServiceListMCPToolsProcedure: + mCPToolsServiceListMCPToolsHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedMCPToolsServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedMCPToolsServiceHandler struct{} + +func (UnimplementedMCPToolsServiceHandler) ListMCPTools(context.Context, *connect.Request[v1.ListMCPToolsRequest]) (*connect.Response[v1.ListMCPToolsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.gw.go new file mode 100644 index 0000000000..045a09f4fb --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/mcp_tools.connect.gw.go @@ -0,0 +1,40 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/mcp_tools.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// MCPToolsServiceGatewayServer implements the gRPC server API for the MCPToolsService service. +type MCPToolsServiceGatewayServer struct { + v1.UnimplementedMCPToolsServiceServer + listMCPTools connect_gateway.UnaryHandler[v1.ListMCPToolsRequest, v1.ListMCPToolsResponse] +} + +// NewMCPToolsServiceGatewayServer constructs a Connect-Gateway gRPC server for the MCPToolsService +// service. +func NewMCPToolsServiceGatewayServer(svc MCPToolsServiceHandler, opts ...connect_gateway.HandlerOption) *MCPToolsServiceGatewayServer { + return &MCPToolsServiceGatewayServer{ + listMCPTools: connect_gateway.NewUnaryHandler(MCPToolsServiceListMCPToolsProcedure, svc.ListMCPTools, opts...), + } +} + +func (s *MCPToolsServiceGatewayServer) ListMCPTools(ctx context.Context, req *v1.ListMCPToolsRequest) (*v1.ListMCPToolsResponse, error) { + return s.listMCPTools(ctx, req) +} + +// RegisterMCPToolsServiceHandlerGatewayServer registers the Connect handlers for the +// MCPToolsService "svc" to "mux". +func RegisterMCPToolsServiceHandlerGatewayServer(mux *runtime.ServeMux, svc MCPToolsServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterMCPToolsServiceHandlerServer(context.TODO(), mux, NewMCPToolsServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.go new file mode 100644 index 0000000000..dcc4c780de --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.go @@ -0,0 +1,241 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/model_providers.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // ModelProvidersServiceName is the fully-qualified name of the ModelProvidersService service. + ModelProvidersServiceName = "redpanda.api.aigateway.v1.ModelProvidersService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // ModelProvidersServiceGetModelProviderProcedure is the fully-qualified name of the + // ModelProvidersService's GetModelProvider RPC. + ModelProvidersServiceGetModelProviderProcedure = "/redpanda.api.aigateway.v1.ModelProvidersService/GetModelProvider" + // ModelProvidersServiceListModelProvidersProcedure is the fully-qualified name of the + // ModelProvidersService's ListModelProviders RPC. + ModelProvidersServiceListModelProvidersProcedure = "/redpanda.api.aigateway.v1.ModelProvidersService/ListModelProviders" + // ModelProvidersServiceUpdateModelProviderProcedure is the fully-qualified name of the + // ModelProvidersService's UpdateModelProvider RPC. + ModelProvidersServiceUpdateModelProviderProcedure = "/redpanda.api.aigateway.v1.ModelProvidersService/UpdateModelProvider" + // ModelProvidersServiceEnableModelProviderProcedure is the fully-qualified name of the + // ModelProvidersService's EnableModelProvider RPC. + ModelProvidersServiceEnableModelProviderProcedure = "/redpanda.api.aigateway.v1.ModelProvidersService/EnableModelProvider" + // ModelProvidersServiceDisableModelProviderProcedure is the fully-qualified name of the + // ModelProvidersService's DisableModelProvider RPC. + ModelProvidersServiceDisableModelProviderProcedure = "/redpanda.api.aigateway.v1.ModelProvidersService/DisableModelProvider" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + modelProvidersServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_model_providers_proto.Services().ByName("ModelProvidersService") + modelProvidersServiceGetModelProviderMethodDescriptor = modelProvidersServiceServiceDescriptor.Methods().ByName("GetModelProvider") + modelProvidersServiceListModelProvidersMethodDescriptor = modelProvidersServiceServiceDescriptor.Methods().ByName("ListModelProviders") + modelProvidersServiceUpdateModelProviderMethodDescriptor = modelProvidersServiceServiceDescriptor.Methods().ByName("UpdateModelProvider") + modelProvidersServiceEnableModelProviderMethodDescriptor = modelProvidersServiceServiceDescriptor.Methods().ByName("EnableModelProvider") + modelProvidersServiceDisableModelProviderMethodDescriptor = modelProvidersServiceServiceDescriptor.Methods().ByName("DisableModelProvider") +) + +// ModelProvidersServiceClient is a client for the redpanda.api.aigateway.v1.ModelProvidersService +// service. +type ModelProvidersServiceClient interface { + GetModelProvider(context.Context, *connect.Request[v1.GetModelProviderRequest]) (*connect.Response[v1.GetModelProviderResponse], error) + ListModelProviders(context.Context, *connect.Request[v1.ListModelProvidersRequest]) (*connect.Response[v1.ListModelProvidersResponse], error) + UpdateModelProvider(context.Context, *connect.Request[v1.UpdateModelProviderRequest]) (*connect.Response[v1.UpdateModelProviderResponse], error) + // Enable a provider for routing (does NOT auto-enable its models) + EnableModelProvider(context.Context, *connect.Request[v1.EnableModelProviderRequest]) (*connect.Response[v1.EnableModelProviderResponse], error) + // Disable a provider (cascade-disables ALL its models) + DisableModelProvider(context.Context, *connect.Request[v1.DisableModelProviderRequest]) (*connect.Response[v1.DisableModelProviderResponse], error) +} + +// NewModelProvidersServiceClient constructs a client for the +// redpanda.api.aigateway.v1.ModelProvidersService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewModelProvidersServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ModelProvidersServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &modelProvidersServiceClient{ + getModelProvider: connect.NewClient[v1.GetModelProviderRequest, v1.GetModelProviderResponse]( + httpClient, + baseURL+ModelProvidersServiceGetModelProviderProcedure, + connect.WithSchema(modelProvidersServiceGetModelProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listModelProviders: connect.NewClient[v1.ListModelProvidersRequest, v1.ListModelProvidersResponse]( + httpClient, + baseURL+ModelProvidersServiceListModelProvidersProcedure, + connect.WithSchema(modelProvidersServiceListModelProvidersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateModelProvider: connect.NewClient[v1.UpdateModelProviderRequest, v1.UpdateModelProviderResponse]( + httpClient, + baseURL+ModelProvidersServiceUpdateModelProviderProcedure, + connect.WithSchema(modelProvidersServiceUpdateModelProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + enableModelProvider: connect.NewClient[v1.EnableModelProviderRequest, v1.EnableModelProviderResponse]( + httpClient, + baseURL+ModelProvidersServiceEnableModelProviderProcedure, + connect.WithSchema(modelProvidersServiceEnableModelProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + disableModelProvider: connect.NewClient[v1.DisableModelProviderRequest, v1.DisableModelProviderResponse]( + httpClient, + baseURL+ModelProvidersServiceDisableModelProviderProcedure, + connect.WithSchema(modelProvidersServiceDisableModelProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// modelProvidersServiceClient implements ModelProvidersServiceClient. +type modelProvidersServiceClient struct { + getModelProvider *connect.Client[v1.GetModelProviderRequest, v1.GetModelProviderResponse] + listModelProviders *connect.Client[v1.ListModelProvidersRequest, v1.ListModelProvidersResponse] + updateModelProvider *connect.Client[v1.UpdateModelProviderRequest, v1.UpdateModelProviderResponse] + enableModelProvider *connect.Client[v1.EnableModelProviderRequest, v1.EnableModelProviderResponse] + disableModelProvider *connect.Client[v1.DisableModelProviderRequest, v1.DisableModelProviderResponse] +} + +// GetModelProvider calls redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider. +func (c *modelProvidersServiceClient) GetModelProvider(ctx context.Context, req *connect.Request[v1.GetModelProviderRequest]) (*connect.Response[v1.GetModelProviderResponse], error) { + return c.getModelProvider.CallUnary(ctx, req) +} + +// ListModelProviders calls redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders. +func (c *modelProvidersServiceClient) ListModelProviders(ctx context.Context, req *connect.Request[v1.ListModelProvidersRequest]) (*connect.Response[v1.ListModelProvidersResponse], error) { + return c.listModelProviders.CallUnary(ctx, req) +} + +// UpdateModelProvider calls redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider. +func (c *modelProvidersServiceClient) UpdateModelProvider(ctx context.Context, req *connect.Request[v1.UpdateModelProviderRequest]) (*connect.Response[v1.UpdateModelProviderResponse], error) { + return c.updateModelProvider.CallUnary(ctx, req) +} + +// EnableModelProvider calls redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider. +func (c *modelProvidersServiceClient) EnableModelProvider(ctx context.Context, req *connect.Request[v1.EnableModelProviderRequest]) (*connect.Response[v1.EnableModelProviderResponse], error) { + return c.enableModelProvider.CallUnary(ctx, req) +} + +// DisableModelProvider calls redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider. +func (c *modelProvidersServiceClient) DisableModelProvider(ctx context.Context, req *connect.Request[v1.DisableModelProviderRequest]) (*connect.Response[v1.DisableModelProviderResponse], error) { + return c.disableModelProvider.CallUnary(ctx, req) +} + +// ModelProvidersServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.ModelProvidersService service. +type ModelProvidersServiceHandler interface { + GetModelProvider(context.Context, *connect.Request[v1.GetModelProviderRequest]) (*connect.Response[v1.GetModelProviderResponse], error) + ListModelProviders(context.Context, *connect.Request[v1.ListModelProvidersRequest]) (*connect.Response[v1.ListModelProvidersResponse], error) + UpdateModelProvider(context.Context, *connect.Request[v1.UpdateModelProviderRequest]) (*connect.Response[v1.UpdateModelProviderResponse], error) + // Enable a provider for routing (does NOT auto-enable its models) + EnableModelProvider(context.Context, *connect.Request[v1.EnableModelProviderRequest]) (*connect.Response[v1.EnableModelProviderResponse], error) + // Disable a provider (cascade-disables ALL its models) + DisableModelProvider(context.Context, *connect.Request[v1.DisableModelProviderRequest]) (*connect.Response[v1.DisableModelProviderResponse], error) +} + +// NewModelProvidersServiceHandler builds an HTTP handler from the service implementation. It +// returns the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewModelProvidersServiceHandler(svc ModelProvidersServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + modelProvidersServiceGetModelProviderHandler := connect.NewUnaryHandler( + ModelProvidersServiceGetModelProviderProcedure, + svc.GetModelProvider, + connect.WithSchema(modelProvidersServiceGetModelProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelProvidersServiceListModelProvidersHandler := connect.NewUnaryHandler( + ModelProvidersServiceListModelProvidersProcedure, + svc.ListModelProviders, + connect.WithSchema(modelProvidersServiceListModelProvidersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelProvidersServiceUpdateModelProviderHandler := connect.NewUnaryHandler( + ModelProvidersServiceUpdateModelProviderProcedure, + svc.UpdateModelProvider, + connect.WithSchema(modelProvidersServiceUpdateModelProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelProvidersServiceEnableModelProviderHandler := connect.NewUnaryHandler( + ModelProvidersServiceEnableModelProviderProcedure, + svc.EnableModelProvider, + connect.WithSchema(modelProvidersServiceEnableModelProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelProvidersServiceDisableModelProviderHandler := connect.NewUnaryHandler( + ModelProvidersServiceDisableModelProviderProcedure, + svc.DisableModelProvider, + connect.WithSchema(modelProvidersServiceDisableModelProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.ModelProvidersService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case ModelProvidersServiceGetModelProviderProcedure: + modelProvidersServiceGetModelProviderHandler.ServeHTTP(w, r) + case ModelProvidersServiceListModelProvidersProcedure: + modelProvidersServiceListModelProvidersHandler.ServeHTTP(w, r) + case ModelProvidersServiceUpdateModelProviderProcedure: + modelProvidersServiceUpdateModelProviderHandler.ServeHTTP(w, r) + case ModelProvidersServiceEnableModelProviderProcedure: + modelProvidersServiceEnableModelProviderHandler.ServeHTTP(w, r) + case ModelProvidersServiceDisableModelProviderProcedure: + modelProvidersServiceDisableModelProviderHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedModelProvidersServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedModelProvidersServiceHandler struct{} + +func (UnimplementedModelProvidersServiceHandler) GetModelProvider(context.Context, *connect.Request[v1.GetModelProviderRequest]) (*connect.Response[v1.GetModelProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider is not implemented")) +} + +func (UnimplementedModelProvidersServiceHandler) ListModelProviders(context.Context, *connect.Request[v1.ListModelProvidersRequest]) (*connect.Response[v1.ListModelProvidersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders is not implemented")) +} + +func (UnimplementedModelProvidersServiceHandler) UpdateModelProvider(context.Context, *connect.Request[v1.UpdateModelProviderRequest]) (*connect.Response[v1.UpdateModelProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider is not implemented")) +} + +func (UnimplementedModelProvidersServiceHandler) EnableModelProvider(context.Context, *connect.Request[v1.EnableModelProviderRequest]) (*connect.Response[v1.EnableModelProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider is not implemented")) +} + +func (UnimplementedModelProvidersServiceHandler) DisableModelProvider(context.Context, *connect.Request[v1.DisableModelProviderRequest]) (*connect.Response[v1.DisableModelProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.gw.go new file mode 100644 index 0000000000..e8881df87e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/model_providers.connect.gw.go @@ -0,0 +1,65 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/model_providers.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// ModelProvidersServiceGatewayServer implements the gRPC server API for the ModelProvidersService +// service. +type ModelProvidersServiceGatewayServer struct { + v1.UnimplementedModelProvidersServiceServer + getModelProvider connect_gateway.UnaryHandler[v1.GetModelProviderRequest, v1.GetModelProviderResponse] + listModelProviders connect_gateway.UnaryHandler[v1.ListModelProvidersRequest, v1.ListModelProvidersResponse] + updateModelProvider connect_gateway.UnaryHandler[v1.UpdateModelProviderRequest, v1.UpdateModelProviderResponse] + enableModelProvider connect_gateway.UnaryHandler[v1.EnableModelProviderRequest, v1.EnableModelProviderResponse] + disableModelProvider connect_gateway.UnaryHandler[v1.DisableModelProviderRequest, v1.DisableModelProviderResponse] +} + +// NewModelProvidersServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// ModelProvidersService service. +func NewModelProvidersServiceGatewayServer(svc ModelProvidersServiceHandler, opts ...connect_gateway.HandlerOption) *ModelProvidersServiceGatewayServer { + return &ModelProvidersServiceGatewayServer{ + getModelProvider: connect_gateway.NewUnaryHandler(ModelProvidersServiceGetModelProviderProcedure, svc.GetModelProvider, opts...), + listModelProviders: connect_gateway.NewUnaryHandler(ModelProvidersServiceListModelProvidersProcedure, svc.ListModelProviders, opts...), + updateModelProvider: connect_gateway.NewUnaryHandler(ModelProvidersServiceUpdateModelProviderProcedure, svc.UpdateModelProvider, opts...), + enableModelProvider: connect_gateway.NewUnaryHandler(ModelProvidersServiceEnableModelProviderProcedure, svc.EnableModelProvider, opts...), + disableModelProvider: connect_gateway.NewUnaryHandler(ModelProvidersServiceDisableModelProviderProcedure, svc.DisableModelProvider, opts...), + } +} + +func (s *ModelProvidersServiceGatewayServer) GetModelProvider(ctx context.Context, req *v1.GetModelProviderRequest) (*v1.GetModelProviderResponse, error) { + return s.getModelProvider(ctx, req) +} + +func (s *ModelProvidersServiceGatewayServer) ListModelProviders(ctx context.Context, req *v1.ListModelProvidersRequest) (*v1.ListModelProvidersResponse, error) { + return s.listModelProviders(ctx, req) +} + +func (s *ModelProvidersServiceGatewayServer) UpdateModelProvider(ctx context.Context, req *v1.UpdateModelProviderRequest) (*v1.UpdateModelProviderResponse, error) { + return s.updateModelProvider(ctx, req) +} + +func (s *ModelProvidersServiceGatewayServer) EnableModelProvider(ctx context.Context, req *v1.EnableModelProviderRequest) (*v1.EnableModelProviderResponse, error) { + return s.enableModelProvider(ctx, req) +} + +func (s *ModelProvidersServiceGatewayServer) DisableModelProvider(ctx context.Context, req *v1.DisableModelProviderRequest) (*v1.DisableModelProviderResponse, error) { + return s.disableModelProvider(ctx, req) +} + +// RegisterModelProvidersServiceHandlerGatewayServer registers the Connect handlers for the +// ModelProvidersService "svc" to "mux". +func RegisterModelProvidersServiceHandlerGatewayServer(mux *runtime.ServeMux, svc ModelProvidersServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterModelProvidersServiceHandlerServer(context.TODO(), mux, NewModelProvidersServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.go new file mode 100644 index 0000000000..946f34571f --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.go @@ -0,0 +1,329 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/models.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // ModelsServiceName is the fully-qualified name of the ModelsService service. + ModelsServiceName = "redpanda.api.aigateway.v1.ModelsService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // ModelsServiceCreateModelProcedure is the fully-qualified name of the ModelsService's CreateModel + // RPC. + ModelsServiceCreateModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/CreateModel" + // ModelsServiceGetModelProcedure is the fully-qualified name of the ModelsService's GetModel RPC. + ModelsServiceGetModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/GetModel" + // ModelsServiceListModelsProcedure is the fully-qualified name of the ModelsService's ListModels + // RPC. + ModelsServiceListModelsProcedure = "/redpanda.api.aigateway.v1.ModelsService/ListModels" + // ModelsServiceUpdateModelProcedure is the fully-qualified name of the ModelsService's UpdateModel + // RPC. + ModelsServiceUpdateModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/UpdateModel" + // ModelsServiceDeleteModelProcedure is the fully-qualified name of the ModelsService's DeleteModel + // RPC. + ModelsServiceDeleteModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/DeleteModel" + // ModelsServiceEnableModelProcedure is the fully-qualified name of the ModelsService's EnableModel + // RPC. + ModelsServiceEnableModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/EnableModel" + // ModelsServiceDisableModelProcedure is the fully-qualified name of the ModelsService's + // DisableModel RPC. + ModelsServiceDisableModelProcedure = "/redpanda.api.aigateway.v1.ModelsService/DisableModel" + // ModelsServiceListDisabledModelsProcedure is the fully-qualified name of the ModelsService's + // ListDisabledModels RPC. + ModelsServiceListDisabledModelsProcedure = "/redpanda.api.aigateway.v1.ModelsService/ListDisabledModels" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + modelsServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_models_proto.Services().ByName("ModelsService") + modelsServiceCreateModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("CreateModel") + modelsServiceGetModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("GetModel") + modelsServiceListModelsMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("ListModels") + modelsServiceUpdateModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("UpdateModel") + modelsServiceDeleteModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("DeleteModel") + modelsServiceEnableModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("EnableModel") + modelsServiceDisableModelMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("DisableModel") + modelsServiceListDisabledModelsMethodDescriptor = modelsServiceServiceDescriptor.Methods().ByName("ListDisabledModels") +) + +// ModelsServiceClient is a client for the redpanda.api.aigateway.v1.ModelsService service. +type ModelsServiceClient interface { + CreateModel(context.Context, *connect.Request[v1.CreateModelRequest]) (*connect.Response[v1.CreateModelResponse], error) + GetModel(context.Context, *connect.Request[v1.GetModelRequest]) (*connect.Response[v1.GetModelResponse], error) + ListModels(context.Context, *connect.Request[v1.ListModelsRequest]) (*connect.Response[v1.ListModelsResponse], error) + UpdateModel(context.Context, *connect.Request[v1.UpdateModelRequest]) (*connect.Response[v1.UpdateModelResponse], error) + DeleteModel(context.Context, *connect.Request[v1.DeleteModelRequest]) (*connect.Response[v1.DeleteModelResponse], error) + // Enable a model for routing + EnableModel(context.Context, *connect.Request[v1.EnableModelRequest]) (*connect.Response[v1.EnableModelResponse], error) + // Disable a model (generates 0 req/s rate limit) + DisableModel(context.Context, *connect.Request[v1.DisableModelRequest]) (*connect.Response[v1.DisableModelResponse], error) + // List all disabled models (for generating rate limit rules) + ListDisabledModels(context.Context, *connect.Request[v1.ListDisabledModelsRequest]) (*connect.Response[v1.ListDisabledModelsResponse], error) +} + +// NewModelsServiceClient constructs a client for the redpanda.api.aigateway.v1.ModelsService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewModelsServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ModelsServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &modelsServiceClient{ + createModel: connect.NewClient[v1.CreateModelRequest, v1.CreateModelResponse]( + httpClient, + baseURL+ModelsServiceCreateModelProcedure, + connect.WithSchema(modelsServiceCreateModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getModel: connect.NewClient[v1.GetModelRequest, v1.GetModelResponse]( + httpClient, + baseURL+ModelsServiceGetModelProcedure, + connect.WithSchema(modelsServiceGetModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listModels: connect.NewClient[v1.ListModelsRequest, v1.ListModelsResponse]( + httpClient, + baseURL+ModelsServiceListModelsProcedure, + connect.WithSchema(modelsServiceListModelsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateModel: connect.NewClient[v1.UpdateModelRequest, v1.UpdateModelResponse]( + httpClient, + baseURL+ModelsServiceUpdateModelProcedure, + connect.WithSchema(modelsServiceUpdateModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteModel: connect.NewClient[v1.DeleteModelRequest, v1.DeleteModelResponse]( + httpClient, + baseURL+ModelsServiceDeleteModelProcedure, + connect.WithSchema(modelsServiceDeleteModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + enableModel: connect.NewClient[v1.EnableModelRequest, v1.EnableModelResponse]( + httpClient, + baseURL+ModelsServiceEnableModelProcedure, + connect.WithSchema(modelsServiceEnableModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + disableModel: connect.NewClient[v1.DisableModelRequest, v1.DisableModelResponse]( + httpClient, + baseURL+ModelsServiceDisableModelProcedure, + connect.WithSchema(modelsServiceDisableModelMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listDisabledModels: connect.NewClient[v1.ListDisabledModelsRequest, v1.ListDisabledModelsResponse]( + httpClient, + baseURL+ModelsServiceListDisabledModelsProcedure, + connect.WithSchema(modelsServiceListDisabledModelsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// modelsServiceClient implements ModelsServiceClient. +type modelsServiceClient struct { + createModel *connect.Client[v1.CreateModelRequest, v1.CreateModelResponse] + getModel *connect.Client[v1.GetModelRequest, v1.GetModelResponse] + listModels *connect.Client[v1.ListModelsRequest, v1.ListModelsResponse] + updateModel *connect.Client[v1.UpdateModelRequest, v1.UpdateModelResponse] + deleteModel *connect.Client[v1.DeleteModelRequest, v1.DeleteModelResponse] + enableModel *connect.Client[v1.EnableModelRequest, v1.EnableModelResponse] + disableModel *connect.Client[v1.DisableModelRequest, v1.DisableModelResponse] + listDisabledModels *connect.Client[v1.ListDisabledModelsRequest, v1.ListDisabledModelsResponse] +} + +// CreateModel calls redpanda.api.aigateway.v1.ModelsService.CreateModel. +func (c *modelsServiceClient) CreateModel(ctx context.Context, req *connect.Request[v1.CreateModelRequest]) (*connect.Response[v1.CreateModelResponse], error) { + return c.createModel.CallUnary(ctx, req) +} + +// GetModel calls redpanda.api.aigateway.v1.ModelsService.GetModel. +func (c *modelsServiceClient) GetModel(ctx context.Context, req *connect.Request[v1.GetModelRequest]) (*connect.Response[v1.GetModelResponse], error) { + return c.getModel.CallUnary(ctx, req) +} + +// ListModels calls redpanda.api.aigateway.v1.ModelsService.ListModels. +func (c *modelsServiceClient) ListModels(ctx context.Context, req *connect.Request[v1.ListModelsRequest]) (*connect.Response[v1.ListModelsResponse], error) { + return c.listModels.CallUnary(ctx, req) +} + +// UpdateModel calls redpanda.api.aigateway.v1.ModelsService.UpdateModel. +func (c *modelsServiceClient) UpdateModel(ctx context.Context, req *connect.Request[v1.UpdateModelRequest]) (*connect.Response[v1.UpdateModelResponse], error) { + return c.updateModel.CallUnary(ctx, req) +} + +// DeleteModel calls redpanda.api.aigateway.v1.ModelsService.DeleteModel. +func (c *modelsServiceClient) DeleteModel(ctx context.Context, req *connect.Request[v1.DeleteModelRequest]) (*connect.Response[v1.DeleteModelResponse], error) { + return c.deleteModel.CallUnary(ctx, req) +} + +// EnableModel calls redpanda.api.aigateway.v1.ModelsService.EnableModel. +func (c *modelsServiceClient) EnableModel(ctx context.Context, req *connect.Request[v1.EnableModelRequest]) (*connect.Response[v1.EnableModelResponse], error) { + return c.enableModel.CallUnary(ctx, req) +} + +// DisableModel calls redpanda.api.aigateway.v1.ModelsService.DisableModel. +func (c *modelsServiceClient) DisableModel(ctx context.Context, req *connect.Request[v1.DisableModelRequest]) (*connect.Response[v1.DisableModelResponse], error) { + return c.disableModel.CallUnary(ctx, req) +} + +// ListDisabledModels calls redpanda.api.aigateway.v1.ModelsService.ListDisabledModels. +func (c *modelsServiceClient) ListDisabledModels(ctx context.Context, req *connect.Request[v1.ListDisabledModelsRequest]) (*connect.Response[v1.ListDisabledModelsResponse], error) { + return c.listDisabledModels.CallUnary(ctx, req) +} + +// ModelsServiceHandler is an implementation of the redpanda.api.aigateway.v1.ModelsService service. +type ModelsServiceHandler interface { + CreateModel(context.Context, *connect.Request[v1.CreateModelRequest]) (*connect.Response[v1.CreateModelResponse], error) + GetModel(context.Context, *connect.Request[v1.GetModelRequest]) (*connect.Response[v1.GetModelResponse], error) + ListModels(context.Context, *connect.Request[v1.ListModelsRequest]) (*connect.Response[v1.ListModelsResponse], error) + UpdateModel(context.Context, *connect.Request[v1.UpdateModelRequest]) (*connect.Response[v1.UpdateModelResponse], error) + DeleteModel(context.Context, *connect.Request[v1.DeleteModelRequest]) (*connect.Response[v1.DeleteModelResponse], error) + // Enable a model for routing + EnableModel(context.Context, *connect.Request[v1.EnableModelRequest]) (*connect.Response[v1.EnableModelResponse], error) + // Disable a model (generates 0 req/s rate limit) + DisableModel(context.Context, *connect.Request[v1.DisableModelRequest]) (*connect.Response[v1.DisableModelResponse], error) + // List all disabled models (for generating rate limit rules) + ListDisabledModels(context.Context, *connect.Request[v1.ListDisabledModelsRequest]) (*connect.Response[v1.ListDisabledModelsResponse], error) +} + +// NewModelsServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewModelsServiceHandler(svc ModelsServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + modelsServiceCreateModelHandler := connect.NewUnaryHandler( + ModelsServiceCreateModelProcedure, + svc.CreateModel, + connect.WithSchema(modelsServiceCreateModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceGetModelHandler := connect.NewUnaryHandler( + ModelsServiceGetModelProcedure, + svc.GetModel, + connect.WithSchema(modelsServiceGetModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceListModelsHandler := connect.NewUnaryHandler( + ModelsServiceListModelsProcedure, + svc.ListModels, + connect.WithSchema(modelsServiceListModelsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceUpdateModelHandler := connect.NewUnaryHandler( + ModelsServiceUpdateModelProcedure, + svc.UpdateModel, + connect.WithSchema(modelsServiceUpdateModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceDeleteModelHandler := connect.NewUnaryHandler( + ModelsServiceDeleteModelProcedure, + svc.DeleteModel, + connect.WithSchema(modelsServiceDeleteModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceEnableModelHandler := connect.NewUnaryHandler( + ModelsServiceEnableModelProcedure, + svc.EnableModel, + connect.WithSchema(modelsServiceEnableModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceDisableModelHandler := connect.NewUnaryHandler( + ModelsServiceDisableModelProcedure, + svc.DisableModel, + connect.WithSchema(modelsServiceDisableModelMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelsServiceListDisabledModelsHandler := connect.NewUnaryHandler( + ModelsServiceListDisabledModelsProcedure, + svc.ListDisabledModels, + connect.WithSchema(modelsServiceListDisabledModelsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.ModelsService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case ModelsServiceCreateModelProcedure: + modelsServiceCreateModelHandler.ServeHTTP(w, r) + case ModelsServiceGetModelProcedure: + modelsServiceGetModelHandler.ServeHTTP(w, r) + case ModelsServiceListModelsProcedure: + modelsServiceListModelsHandler.ServeHTTP(w, r) + case ModelsServiceUpdateModelProcedure: + modelsServiceUpdateModelHandler.ServeHTTP(w, r) + case ModelsServiceDeleteModelProcedure: + modelsServiceDeleteModelHandler.ServeHTTP(w, r) + case ModelsServiceEnableModelProcedure: + modelsServiceEnableModelHandler.ServeHTTP(w, r) + case ModelsServiceDisableModelProcedure: + modelsServiceDisableModelHandler.ServeHTTP(w, r) + case ModelsServiceListDisabledModelsProcedure: + modelsServiceListDisabledModelsHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedModelsServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedModelsServiceHandler struct{} + +func (UnimplementedModelsServiceHandler) CreateModel(context.Context, *connect.Request[v1.CreateModelRequest]) (*connect.Response[v1.CreateModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.CreateModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) GetModel(context.Context, *connect.Request[v1.GetModelRequest]) (*connect.Response[v1.GetModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.GetModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) ListModels(context.Context, *connect.Request[v1.ListModelsRequest]) (*connect.Response[v1.ListModelsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.ListModels is not implemented")) +} + +func (UnimplementedModelsServiceHandler) UpdateModel(context.Context, *connect.Request[v1.UpdateModelRequest]) (*connect.Response[v1.UpdateModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.UpdateModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) DeleteModel(context.Context, *connect.Request[v1.DeleteModelRequest]) (*connect.Response[v1.DeleteModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.DeleteModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) EnableModel(context.Context, *connect.Request[v1.EnableModelRequest]) (*connect.Response[v1.EnableModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.EnableModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) DisableModel(context.Context, *connect.Request[v1.DisableModelRequest]) (*connect.Response[v1.DisableModelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.DisableModel is not implemented")) +} + +func (UnimplementedModelsServiceHandler) ListDisabledModels(context.Context, *connect.Request[v1.ListDisabledModelsRequest]) (*connect.Response[v1.ListDisabledModelsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelsService.ListDisabledModels is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.gw.go new file mode 100644 index 0000000000..45382a5f33 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/models.connect.gw.go @@ -0,0 +1,82 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/models.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// ModelsServiceGatewayServer implements the gRPC server API for the ModelsService service. +type ModelsServiceGatewayServer struct { + v1.UnimplementedModelsServiceServer + createModel connect_gateway.UnaryHandler[v1.CreateModelRequest, v1.CreateModelResponse] + getModel connect_gateway.UnaryHandler[v1.GetModelRequest, v1.GetModelResponse] + listModels connect_gateway.UnaryHandler[v1.ListModelsRequest, v1.ListModelsResponse] + updateModel connect_gateway.UnaryHandler[v1.UpdateModelRequest, v1.UpdateModelResponse] + deleteModel connect_gateway.UnaryHandler[v1.DeleteModelRequest, v1.DeleteModelResponse] + enableModel connect_gateway.UnaryHandler[v1.EnableModelRequest, v1.EnableModelResponse] + disableModel connect_gateway.UnaryHandler[v1.DisableModelRequest, v1.DisableModelResponse] + listDisabledModels connect_gateway.UnaryHandler[v1.ListDisabledModelsRequest, v1.ListDisabledModelsResponse] +} + +// NewModelsServiceGatewayServer constructs a Connect-Gateway gRPC server for the ModelsService +// service. +func NewModelsServiceGatewayServer(svc ModelsServiceHandler, opts ...connect_gateway.HandlerOption) *ModelsServiceGatewayServer { + return &ModelsServiceGatewayServer{ + createModel: connect_gateway.NewUnaryHandler(ModelsServiceCreateModelProcedure, svc.CreateModel, opts...), + getModel: connect_gateway.NewUnaryHandler(ModelsServiceGetModelProcedure, svc.GetModel, opts...), + listModels: connect_gateway.NewUnaryHandler(ModelsServiceListModelsProcedure, svc.ListModels, opts...), + updateModel: connect_gateway.NewUnaryHandler(ModelsServiceUpdateModelProcedure, svc.UpdateModel, opts...), + deleteModel: connect_gateway.NewUnaryHandler(ModelsServiceDeleteModelProcedure, svc.DeleteModel, opts...), + enableModel: connect_gateway.NewUnaryHandler(ModelsServiceEnableModelProcedure, svc.EnableModel, opts...), + disableModel: connect_gateway.NewUnaryHandler(ModelsServiceDisableModelProcedure, svc.DisableModel, opts...), + listDisabledModels: connect_gateway.NewUnaryHandler(ModelsServiceListDisabledModelsProcedure, svc.ListDisabledModels, opts...), + } +} + +func (s *ModelsServiceGatewayServer) CreateModel(ctx context.Context, req *v1.CreateModelRequest) (*v1.CreateModelResponse, error) { + return s.createModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) GetModel(ctx context.Context, req *v1.GetModelRequest) (*v1.GetModelResponse, error) { + return s.getModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) ListModels(ctx context.Context, req *v1.ListModelsRequest) (*v1.ListModelsResponse, error) { + return s.listModels(ctx, req) +} + +func (s *ModelsServiceGatewayServer) UpdateModel(ctx context.Context, req *v1.UpdateModelRequest) (*v1.UpdateModelResponse, error) { + return s.updateModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) DeleteModel(ctx context.Context, req *v1.DeleteModelRequest) (*v1.DeleteModelResponse, error) { + return s.deleteModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) EnableModel(ctx context.Context, req *v1.EnableModelRequest) (*v1.EnableModelResponse, error) { + return s.enableModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) DisableModel(ctx context.Context, req *v1.DisableModelRequest) (*v1.DisableModelResponse, error) { + return s.disableModel(ctx, req) +} + +func (s *ModelsServiceGatewayServer) ListDisabledModels(ctx context.Context, req *v1.ListDisabledModelsRequest) (*v1.ListDisabledModelsResponse, error) { + return s.listDisabledModels(ctx, req) +} + +// RegisterModelsServiceHandlerGatewayServer registers the Connect handlers for the ModelsService +// "svc" to "mux". +func RegisterModelsServiceHandlerGatewayServer(mux *runtime.ServeMux, svc ModelsServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterModelsServiceHandlerServer(context.TODO(), mux, NewModelsServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.go new file mode 100644 index 0000000000..3a8bf90e49 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.go @@ -0,0 +1,353 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/oauth2_client.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // OAuth2ClientServiceName is the fully-qualified name of the OAuth2ClientService service. + OAuth2ClientServiceName = "redpanda.api.aigateway.v1.OAuth2ClientService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // OAuth2ClientServiceCreateOAuth2ClientProcedure is the fully-qualified name of the + // OAuth2ClientService's CreateOAuth2Client RPC. + OAuth2ClientServiceCreateOAuth2ClientProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/CreateOAuth2Client" + // OAuth2ClientServiceGetOAuth2ClientProcedure is the fully-qualified name of the + // OAuth2ClientService's GetOAuth2Client RPC. + OAuth2ClientServiceGetOAuth2ClientProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/GetOAuth2Client" + // OAuth2ClientServiceListOAuth2ClientsProcedure is the fully-qualified name of the + // OAuth2ClientService's ListOAuth2Clients RPC. + OAuth2ClientServiceListOAuth2ClientsProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/ListOAuth2Clients" + // OAuth2ClientServiceUpdateOAuth2ClientProcedure is the fully-qualified name of the + // OAuth2ClientService's UpdateOAuth2Client RPC. + OAuth2ClientServiceUpdateOAuth2ClientProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/UpdateOAuth2Client" + // OAuth2ClientServiceDeleteOAuth2ClientProcedure is the fully-qualified name of the + // OAuth2ClientService's DeleteOAuth2Client RPC. + OAuth2ClientServiceDeleteOAuth2ClientProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/DeleteOAuth2Client" + // OAuth2ClientServiceRotateOAuth2ClientSecretProcedure is the fully-qualified name of the + // OAuth2ClientService's RotateOAuth2ClientSecret RPC. + OAuth2ClientServiceRotateOAuth2ClientSecretProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/RotateOAuth2ClientSecret" + // OAuth2ClientServiceDisableOAuth2ClientProcedure is the fully-qualified name of the + // OAuth2ClientService's DisableOAuth2Client RPC. + OAuth2ClientServiceDisableOAuth2ClientProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/DisableOAuth2Client" + // OAuth2ClientServiceValidateClientCredentialsProcedure is the fully-qualified name of the + // OAuth2ClientService's ValidateClientCredentials RPC. + OAuth2ClientServiceValidateClientCredentialsProcedure = "/redpanda.api.aigateway.v1.OAuth2ClientService/ValidateClientCredentials" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + oAuth2ClientServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_oauth2_client_proto.Services().ByName("OAuth2ClientService") + oAuth2ClientServiceCreateOAuth2ClientMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("CreateOAuth2Client") + oAuth2ClientServiceGetOAuth2ClientMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("GetOAuth2Client") + oAuth2ClientServiceListOAuth2ClientsMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("ListOAuth2Clients") + oAuth2ClientServiceUpdateOAuth2ClientMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("UpdateOAuth2Client") + oAuth2ClientServiceDeleteOAuth2ClientMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("DeleteOAuth2Client") + oAuth2ClientServiceRotateOAuth2ClientSecretMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("RotateOAuth2ClientSecret") + oAuth2ClientServiceDisableOAuth2ClientMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("DisableOAuth2Client") + oAuth2ClientServiceValidateClientCredentialsMethodDescriptor = oAuth2ClientServiceServiceDescriptor.Methods().ByName("ValidateClientCredentials") +) + +// OAuth2ClientServiceClient is a client for the redpanda.api.aigateway.v1.OAuth2ClientService +// service. +type OAuth2ClientServiceClient interface { + // Creates a new OAuth2 client. + // Returns the client with plaintext secret (only returned on creation). + CreateOAuth2Client(context.Context, *connect.Request[v1.CreateOAuth2ClientRequest]) (*connect.Response[v1.CreateOAuth2ClientResponse], error) + // Gets an OAuth2 client by name. + // Note: The client_secret is never returned after creation. + GetOAuth2Client(context.Context, *connect.Request[v1.GetOAuth2ClientRequest]) (*connect.Response[v1.GetOAuth2ClientResponse], error) + // Lists OAuth2 clients. + ListOAuth2Clients(context.Context, *connect.Request[v1.ListOAuth2ClientsRequest]) (*connect.Response[v1.ListOAuth2ClientsResponse], error) + // Updates an OAuth2 client. + UpdateOAuth2Client(context.Context, *connect.Request[v1.UpdateOAuth2ClientRequest]) (*connect.Response[v1.UpdateOAuth2ClientResponse], error) + // Deletes an OAuth2 client. + DeleteOAuth2Client(context.Context, *connect.Request[v1.DeleteOAuth2ClientRequest]) (*connect.Response[v1.DeleteOAuth2ClientResponse], error) + // Rotates an OAuth2 client's secret. + // Returns the new plaintext secret (only returned during rotation). + RotateOAuth2ClientSecret(context.Context, *connect.Request[v1.RotateOAuth2ClientSecretRequest]) (*connect.Response[v1.RotateOAuth2ClientSecretResponse], error) + // Disables an OAuth2 client (soft delete). + DisableOAuth2Client(context.Context, *connect.Request[v1.DisableOAuth2ClientRequest]) (*connect.Response[v1.DisableOAuth2ClientResponse], error) + // Validates OAuth2 client credentials. + // Used for authenticating client_credentials grant requests. + ValidateClientCredentials(context.Context, *connect.Request[v1.ValidateClientCredentialsRequest]) (*connect.Response[v1.ValidateClientCredentialsResponse], error) +} + +// NewOAuth2ClientServiceClient constructs a client for the +// redpanda.api.aigateway.v1.OAuth2ClientService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewOAuth2ClientServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) OAuth2ClientServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &oAuth2ClientServiceClient{ + createOAuth2Client: connect.NewClient[v1.CreateOAuth2ClientRequest, v1.CreateOAuth2ClientResponse]( + httpClient, + baseURL+OAuth2ClientServiceCreateOAuth2ClientProcedure, + connect.WithSchema(oAuth2ClientServiceCreateOAuth2ClientMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getOAuth2Client: connect.NewClient[v1.GetOAuth2ClientRequest, v1.GetOAuth2ClientResponse]( + httpClient, + baseURL+OAuth2ClientServiceGetOAuth2ClientProcedure, + connect.WithSchema(oAuth2ClientServiceGetOAuth2ClientMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listOAuth2Clients: connect.NewClient[v1.ListOAuth2ClientsRequest, v1.ListOAuth2ClientsResponse]( + httpClient, + baseURL+OAuth2ClientServiceListOAuth2ClientsProcedure, + connect.WithSchema(oAuth2ClientServiceListOAuth2ClientsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateOAuth2Client: connect.NewClient[v1.UpdateOAuth2ClientRequest, v1.UpdateOAuth2ClientResponse]( + httpClient, + baseURL+OAuth2ClientServiceUpdateOAuth2ClientProcedure, + connect.WithSchema(oAuth2ClientServiceUpdateOAuth2ClientMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteOAuth2Client: connect.NewClient[v1.DeleteOAuth2ClientRequest, v1.DeleteOAuth2ClientResponse]( + httpClient, + baseURL+OAuth2ClientServiceDeleteOAuth2ClientProcedure, + connect.WithSchema(oAuth2ClientServiceDeleteOAuth2ClientMethodDescriptor), + connect.WithClientOptions(opts...), + ), + rotateOAuth2ClientSecret: connect.NewClient[v1.RotateOAuth2ClientSecretRequest, v1.RotateOAuth2ClientSecretResponse]( + httpClient, + baseURL+OAuth2ClientServiceRotateOAuth2ClientSecretProcedure, + connect.WithSchema(oAuth2ClientServiceRotateOAuth2ClientSecretMethodDescriptor), + connect.WithClientOptions(opts...), + ), + disableOAuth2Client: connect.NewClient[v1.DisableOAuth2ClientRequest, v1.DisableOAuth2ClientResponse]( + httpClient, + baseURL+OAuth2ClientServiceDisableOAuth2ClientProcedure, + connect.WithSchema(oAuth2ClientServiceDisableOAuth2ClientMethodDescriptor), + connect.WithClientOptions(opts...), + ), + validateClientCredentials: connect.NewClient[v1.ValidateClientCredentialsRequest, v1.ValidateClientCredentialsResponse]( + httpClient, + baseURL+OAuth2ClientServiceValidateClientCredentialsProcedure, + connect.WithSchema(oAuth2ClientServiceValidateClientCredentialsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// oAuth2ClientServiceClient implements OAuth2ClientServiceClient. +type oAuth2ClientServiceClient struct { + createOAuth2Client *connect.Client[v1.CreateOAuth2ClientRequest, v1.CreateOAuth2ClientResponse] + getOAuth2Client *connect.Client[v1.GetOAuth2ClientRequest, v1.GetOAuth2ClientResponse] + listOAuth2Clients *connect.Client[v1.ListOAuth2ClientsRequest, v1.ListOAuth2ClientsResponse] + updateOAuth2Client *connect.Client[v1.UpdateOAuth2ClientRequest, v1.UpdateOAuth2ClientResponse] + deleteOAuth2Client *connect.Client[v1.DeleteOAuth2ClientRequest, v1.DeleteOAuth2ClientResponse] + rotateOAuth2ClientSecret *connect.Client[v1.RotateOAuth2ClientSecretRequest, v1.RotateOAuth2ClientSecretResponse] + disableOAuth2Client *connect.Client[v1.DisableOAuth2ClientRequest, v1.DisableOAuth2ClientResponse] + validateClientCredentials *connect.Client[v1.ValidateClientCredentialsRequest, v1.ValidateClientCredentialsResponse] +} + +// CreateOAuth2Client calls redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client. +func (c *oAuth2ClientServiceClient) CreateOAuth2Client(ctx context.Context, req *connect.Request[v1.CreateOAuth2ClientRequest]) (*connect.Response[v1.CreateOAuth2ClientResponse], error) { + return c.createOAuth2Client.CallUnary(ctx, req) +} + +// GetOAuth2Client calls redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client. +func (c *oAuth2ClientServiceClient) GetOAuth2Client(ctx context.Context, req *connect.Request[v1.GetOAuth2ClientRequest]) (*connect.Response[v1.GetOAuth2ClientResponse], error) { + return c.getOAuth2Client.CallUnary(ctx, req) +} + +// ListOAuth2Clients calls redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients. +func (c *oAuth2ClientServiceClient) ListOAuth2Clients(ctx context.Context, req *connect.Request[v1.ListOAuth2ClientsRequest]) (*connect.Response[v1.ListOAuth2ClientsResponse], error) { + return c.listOAuth2Clients.CallUnary(ctx, req) +} + +// UpdateOAuth2Client calls redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client. +func (c *oAuth2ClientServiceClient) UpdateOAuth2Client(ctx context.Context, req *connect.Request[v1.UpdateOAuth2ClientRequest]) (*connect.Response[v1.UpdateOAuth2ClientResponse], error) { + return c.updateOAuth2Client.CallUnary(ctx, req) +} + +// DeleteOAuth2Client calls redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client. +func (c *oAuth2ClientServiceClient) DeleteOAuth2Client(ctx context.Context, req *connect.Request[v1.DeleteOAuth2ClientRequest]) (*connect.Response[v1.DeleteOAuth2ClientResponse], error) { + return c.deleteOAuth2Client.CallUnary(ctx, req) +} + +// RotateOAuth2ClientSecret calls +// redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret. +func (c *oAuth2ClientServiceClient) RotateOAuth2ClientSecret(ctx context.Context, req *connect.Request[v1.RotateOAuth2ClientSecretRequest]) (*connect.Response[v1.RotateOAuth2ClientSecretResponse], error) { + return c.rotateOAuth2ClientSecret.CallUnary(ctx, req) +} + +// DisableOAuth2Client calls redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client. +func (c *oAuth2ClientServiceClient) DisableOAuth2Client(ctx context.Context, req *connect.Request[v1.DisableOAuth2ClientRequest]) (*connect.Response[v1.DisableOAuth2ClientResponse], error) { + return c.disableOAuth2Client.CallUnary(ctx, req) +} + +// ValidateClientCredentials calls +// redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials. +func (c *oAuth2ClientServiceClient) ValidateClientCredentials(ctx context.Context, req *connect.Request[v1.ValidateClientCredentialsRequest]) (*connect.Response[v1.ValidateClientCredentialsResponse], error) { + return c.validateClientCredentials.CallUnary(ctx, req) +} + +// OAuth2ClientServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.OAuth2ClientService service. +type OAuth2ClientServiceHandler interface { + // Creates a new OAuth2 client. + // Returns the client with plaintext secret (only returned on creation). + CreateOAuth2Client(context.Context, *connect.Request[v1.CreateOAuth2ClientRequest]) (*connect.Response[v1.CreateOAuth2ClientResponse], error) + // Gets an OAuth2 client by name. + // Note: The client_secret is never returned after creation. + GetOAuth2Client(context.Context, *connect.Request[v1.GetOAuth2ClientRequest]) (*connect.Response[v1.GetOAuth2ClientResponse], error) + // Lists OAuth2 clients. + ListOAuth2Clients(context.Context, *connect.Request[v1.ListOAuth2ClientsRequest]) (*connect.Response[v1.ListOAuth2ClientsResponse], error) + // Updates an OAuth2 client. + UpdateOAuth2Client(context.Context, *connect.Request[v1.UpdateOAuth2ClientRequest]) (*connect.Response[v1.UpdateOAuth2ClientResponse], error) + // Deletes an OAuth2 client. + DeleteOAuth2Client(context.Context, *connect.Request[v1.DeleteOAuth2ClientRequest]) (*connect.Response[v1.DeleteOAuth2ClientResponse], error) + // Rotates an OAuth2 client's secret. + // Returns the new plaintext secret (only returned during rotation). + RotateOAuth2ClientSecret(context.Context, *connect.Request[v1.RotateOAuth2ClientSecretRequest]) (*connect.Response[v1.RotateOAuth2ClientSecretResponse], error) + // Disables an OAuth2 client (soft delete). + DisableOAuth2Client(context.Context, *connect.Request[v1.DisableOAuth2ClientRequest]) (*connect.Response[v1.DisableOAuth2ClientResponse], error) + // Validates OAuth2 client credentials. + // Used for authenticating client_credentials grant requests. + ValidateClientCredentials(context.Context, *connect.Request[v1.ValidateClientCredentialsRequest]) (*connect.Response[v1.ValidateClientCredentialsResponse], error) +} + +// NewOAuth2ClientServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewOAuth2ClientServiceHandler(svc OAuth2ClientServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + oAuth2ClientServiceCreateOAuth2ClientHandler := connect.NewUnaryHandler( + OAuth2ClientServiceCreateOAuth2ClientProcedure, + svc.CreateOAuth2Client, + connect.WithSchema(oAuth2ClientServiceCreateOAuth2ClientMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceGetOAuth2ClientHandler := connect.NewUnaryHandler( + OAuth2ClientServiceGetOAuth2ClientProcedure, + svc.GetOAuth2Client, + connect.WithSchema(oAuth2ClientServiceGetOAuth2ClientMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceListOAuth2ClientsHandler := connect.NewUnaryHandler( + OAuth2ClientServiceListOAuth2ClientsProcedure, + svc.ListOAuth2Clients, + connect.WithSchema(oAuth2ClientServiceListOAuth2ClientsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceUpdateOAuth2ClientHandler := connect.NewUnaryHandler( + OAuth2ClientServiceUpdateOAuth2ClientProcedure, + svc.UpdateOAuth2Client, + connect.WithSchema(oAuth2ClientServiceUpdateOAuth2ClientMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceDeleteOAuth2ClientHandler := connect.NewUnaryHandler( + OAuth2ClientServiceDeleteOAuth2ClientProcedure, + svc.DeleteOAuth2Client, + connect.WithSchema(oAuth2ClientServiceDeleteOAuth2ClientMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceRotateOAuth2ClientSecretHandler := connect.NewUnaryHandler( + OAuth2ClientServiceRotateOAuth2ClientSecretProcedure, + svc.RotateOAuth2ClientSecret, + connect.WithSchema(oAuth2ClientServiceRotateOAuth2ClientSecretMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceDisableOAuth2ClientHandler := connect.NewUnaryHandler( + OAuth2ClientServiceDisableOAuth2ClientProcedure, + svc.DisableOAuth2Client, + connect.WithSchema(oAuth2ClientServiceDisableOAuth2ClientMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2ClientServiceValidateClientCredentialsHandler := connect.NewUnaryHandler( + OAuth2ClientServiceValidateClientCredentialsProcedure, + svc.ValidateClientCredentials, + connect.WithSchema(oAuth2ClientServiceValidateClientCredentialsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.OAuth2ClientService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case OAuth2ClientServiceCreateOAuth2ClientProcedure: + oAuth2ClientServiceCreateOAuth2ClientHandler.ServeHTTP(w, r) + case OAuth2ClientServiceGetOAuth2ClientProcedure: + oAuth2ClientServiceGetOAuth2ClientHandler.ServeHTTP(w, r) + case OAuth2ClientServiceListOAuth2ClientsProcedure: + oAuth2ClientServiceListOAuth2ClientsHandler.ServeHTTP(w, r) + case OAuth2ClientServiceUpdateOAuth2ClientProcedure: + oAuth2ClientServiceUpdateOAuth2ClientHandler.ServeHTTP(w, r) + case OAuth2ClientServiceDeleteOAuth2ClientProcedure: + oAuth2ClientServiceDeleteOAuth2ClientHandler.ServeHTTP(w, r) + case OAuth2ClientServiceRotateOAuth2ClientSecretProcedure: + oAuth2ClientServiceRotateOAuth2ClientSecretHandler.ServeHTTP(w, r) + case OAuth2ClientServiceDisableOAuth2ClientProcedure: + oAuth2ClientServiceDisableOAuth2ClientHandler.ServeHTTP(w, r) + case OAuth2ClientServiceValidateClientCredentialsProcedure: + oAuth2ClientServiceValidateClientCredentialsHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedOAuth2ClientServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedOAuth2ClientServiceHandler struct{} + +func (UnimplementedOAuth2ClientServiceHandler) CreateOAuth2Client(context.Context, *connect.Request[v1.CreateOAuth2ClientRequest]) (*connect.Response[v1.CreateOAuth2ClientResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) GetOAuth2Client(context.Context, *connect.Request[v1.GetOAuth2ClientRequest]) (*connect.Response[v1.GetOAuth2ClientResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) ListOAuth2Clients(context.Context, *connect.Request[v1.ListOAuth2ClientsRequest]) (*connect.Response[v1.ListOAuth2ClientsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) UpdateOAuth2Client(context.Context, *connect.Request[v1.UpdateOAuth2ClientRequest]) (*connect.Response[v1.UpdateOAuth2ClientResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) DeleteOAuth2Client(context.Context, *connect.Request[v1.DeleteOAuth2ClientRequest]) (*connect.Response[v1.DeleteOAuth2ClientResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) RotateOAuth2ClientSecret(context.Context, *connect.Request[v1.RotateOAuth2ClientSecretRequest]) (*connect.Response[v1.RotateOAuth2ClientSecretResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) DisableOAuth2Client(context.Context, *connect.Request[v1.DisableOAuth2ClientRequest]) (*connect.Response[v1.DisableOAuth2ClientResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client is not implemented")) +} + +func (UnimplementedOAuth2ClientServiceHandler) ValidateClientCredentials(context.Context, *connect.Request[v1.ValidateClientCredentialsRequest]) (*connect.Response[v1.ValidateClientCredentialsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.gw.go new file mode 100644 index 0000000000..a341ebedea --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_client.connect.gw.go @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/oauth2_client.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// OAuth2ClientServiceGatewayServer implements the gRPC server API for the OAuth2ClientService +// service. +type OAuth2ClientServiceGatewayServer struct { + v1.UnimplementedOAuth2ClientServiceServer + createOAuth2Client connect_gateway.UnaryHandler[v1.CreateOAuth2ClientRequest, v1.CreateOAuth2ClientResponse] + getOAuth2Client connect_gateway.UnaryHandler[v1.GetOAuth2ClientRequest, v1.GetOAuth2ClientResponse] + listOAuth2Clients connect_gateway.UnaryHandler[v1.ListOAuth2ClientsRequest, v1.ListOAuth2ClientsResponse] + updateOAuth2Client connect_gateway.UnaryHandler[v1.UpdateOAuth2ClientRequest, v1.UpdateOAuth2ClientResponse] + deleteOAuth2Client connect_gateway.UnaryHandler[v1.DeleteOAuth2ClientRequest, v1.DeleteOAuth2ClientResponse] + rotateOAuth2ClientSecret connect_gateway.UnaryHandler[v1.RotateOAuth2ClientSecretRequest, v1.RotateOAuth2ClientSecretResponse] + disableOAuth2Client connect_gateway.UnaryHandler[v1.DisableOAuth2ClientRequest, v1.DisableOAuth2ClientResponse] + validateClientCredentials connect_gateway.UnaryHandler[v1.ValidateClientCredentialsRequest, v1.ValidateClientCredentialsResponse] +} + +// NewOAuth2ClientServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// OAuth2ClientService service. +func NewOAuth2ClientServiceGatewayServer(svc OAuth2ClientServiceHandler, opts ...connect_gateway.HandlerOption) *OAuth2ClientServiceGatewayServer { + return &OAuth2ClientServiceGatewayServer{ + createOAuth2Client: connect_gateway.NewUnaryHandler(OAuth2ClientServiceCreateOAuth2ClientProcedure, svc.CreateOAuth2Client, opts...), + getOAuth2Client: connect_gateway.NewUnaryHandler(OAuth2ClientServiceGetOAuth2ClientProcedure, svc.GetOAuth2Client, opts...), + listOAuth2Clients: connect_gateway.NewUnaryHandler(OAuth2ClientServiceListOAuth2ClientsProcedure, svc.ListOAuth2Clients, opts...), + updateOAuth2Client: connect_gateway.NewUnaryHandler(OAuth2ClientServiceUpdateOAuth2ClientProcedure, svc.UpdateOAuth2Client, opts...), + deleteOAuth2Client: connect_gateway.NewUnaryHandler(OAuth2ClientServiceDeleteOAuth2ClientProcedure, svc.DeleteOAuth2Client, opts...), + rotateOAuth2ClientSecret: connect_gateway.NewUnaryHandler(OAuth2ClientServiceRotateOAuth2ClientSecretProcedure, svc.RotateOAuth2ClientSecret, opts...), + disableOAuth2Client: connect_gateway.NewUnaryHandler(OAuth2ClientServiceDisableOAuth2ClientProcedure, svc.DisableOAuth2Client, opts...), + validateClientCredentials: connect_gateway.NewUnaryHandler(OAuth2ClientServiceValidateClientCredentialsProcedure, svc.ValidateClientCredentials, opts...), + } +} + +func (s *OAuth2ClientServiceGatewayServer) CreateOAuth2Client(ctx context.Context, req *v1.CreateOAuth2ClientRequest) (*v1.CreateOAuth2ClientResponse, error) { + return s.createOAuth2Client(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) GetOAuth2Client(ctx context.Context, req *v1.GetOAuth2ClientRequest) (*v1.GetOAuth2ClientResponse, error) { + return s.getOAuth2Client(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) ListOAuth2Clients(ctx context.Context, req *v1.ListOAuth2ClientsRequest) (*v1.ListOAuth2ClientsResponse, error) { + return s.listOAuth2Clients(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) UpdateOAuth2Client(ctx context.Context, req *v1.UpdateOAuth2ClientRequest) (*v1.UpdateOAuth2ClientResponse, error) { + return s.updateOAuth2Client(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) DeleteOAuth2Client(ctx context.Context, req *v1.DeleteOAuth2ClientRequest) (*v1.DeleteOAuth2ClientResponse, error) { + return s.deleteOAuth2Client(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) RotateOAuth2ClientSecret(ctx context.Context, req *v1.RotateOAuth2ClientSecretRequest) (*v1.RotateOAuth2ClientSecretResponse, error) { + return s.rotateOAuth2ClientSecret(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) DisableOAuth2Client(ctx context.Context, req *v1.DisableOAuth2ClientRequest) (*v1.DisableOAuth2ClientResponse, error) { + return s.disableOAuth2Client(ctx, req) +} + +func (s *OAuth2ClientServiceGatewayServer) ValidateClientCredentials(ctx context.Context, req *v1.ValidateClientCredentialsRequest) (*v1.ValidateClientCredentialsResponse, error) { + return s.validateClientCredentials(ctx, req) +} + +// RegisterOAuth2ClientServiceHandlerGatewayServer registers the Connect handlers for the +// OAuth2ClientService "svc" to "mux". +func RegisterOAuth2ClientServiceHandlerGatewayServer(mux *runtime.ServeMux, svc OAuth2ClientServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterOAuth2ClientServiceHandlerServer(context.TODO(), mux, NewOAuth2ClientServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.go new file mode 100644 index 0000000000..0916adb506 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.go @@ -0,0 +1,321 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/oauth2_key.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // OAuth2KeyServiceName is the fully-qualified name of the OAuth2KeyService service. + OAuth2KeyServiceName = "redpanda.api.aigateway.v1.OAuth2KeyService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // OAuth2KeyServiceCreateOAuth2KeyProcedure is the fully-qualified name of the OAuth2KeyService's + // CreateOAuth2Key RPC. + OAuth2KeyServiceCreateOAuth2KeyProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/CreateOAuth2Key" + // OAuth2KeyServiceGetOAuth2KeyProcedure is the fully-qualified name of the OAuth2KeyService's + // GetOAuth2Key RPC. + OAuth2KeyServiceGetOAuth2KeyProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/GetOAuth2Key" + // OAuth2KeyServiceListOAuth2KeysProcedure is the fully-qualified name of the OAuth2KeyService's + // ListOAuth2Keys RPC. + OAuth2KeyServiceListOAuth2KeysProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/ListOAuth2Keys" + // OAuth2KeyServiceDeactivateOAuth2KeyProcedure is the fully-qualified name of the + // OAuth2KeyService's DeactivateOAuth2Key RPC. + OAuth2KeyServiceDeactivateOAuth2KeyProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/DeactivateOAuth2Key" + // OAuth2KeyServiceDeleteOAuth2KeyProcedure is the fully-qualified name of the OAuth2KeyService's + // DeleteOAuth2Key RPC. + OAuth2KeyServiceDeleteOAuth2KeyProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/DeleteOAuth2Key" + // OAuth2KeyServiceRotateOAuth2KeysProcedure is the fully-qualified name of the OAuth2KeyService's + // RotateOAuth2Keys RPC. + OAuth2KeyServiceRotateOAuth2KeysProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/RotateOAuth2Keys" + // OAuth2KeyServiceGetJWKSProcedure is the fully-qualified name of the OAuth2KeyService's GetJWKS + // RPC. + OAuth2KeyServiceGetJWKSProcedure = "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + oAuth2KeyServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_oauth2_key_proto.Services().ByName("OAuth2KeyService") + oAuth2KeyServiceCreateOAuth2KeyMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("CreateOAuth2Key") + oAuth2KeyServiceGetOAuth2KeyMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("GetOAuth2Key") + oAuth2KeyServiceListOAuth2KeysMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("ListOAuth2Keys") + oAuth2KeyServiceDeactivateOAuth2KeyMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("DeactivateOAuth2Key") + oAuth2KeyServiceDeleteOAuth2KeyMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("DeleteOAuth2Key") + oAuth2KeyServiceRotateOAuth2KeysMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("RotateOAuth2Keys") + oAuth2KeyServiceGetJWKSMethodDescriptor = oAuth2KeyServiceServiceDescriptor.Methods().ByName("GetJWKS") +) + +// OAuth2KeyServiceClient is a client for the redpanda.api.aigateway.v1.OAuth2KeyService service. +type OAuth2KeyServiceClient interface { + // Creates a new signing key. + CreateOAuth2Key(context.Context, *connect.Request[v1.CreateOAuth2KeyRequest]) (*connect.Response[v1.CreateOAuth2KeyResponse], error) + // Gets a signing key by name. + // Note: Private key material is never returned. + GetOAuth2Key(context.Context, *connect.Request[v1.GetOAuth2KeyRequest]) (*connect.Response[v1.GetOAuth2KeyResponse], error) + // Lists signing keys. + ListOAuth2Keys(context.Context, *connect.Request[v1.ListOAuth2KeysRequest]) (*connect.Response[v1.ListOAuth2KeysResponse], error) + // Deactivates a signing key. + // The key will no longer be used for signing new tokens. + // Existing tokens signed with this key remain valid until expiry. + DeactivateOAuth2Key(context.Context, *connect.Request[v1.DeactivateOAuth2KeyRequest]) (*connect.Response[v1.DeactivateOAuth2KeyResponse], error) + // Deletes a signing key. + // WARNING: This will invalidate all tokens signed with this key. + DeleteOAuth2Key(context.Context, *connect.Request[v1.DeleteOAuth2KeyRequest]) (*connect.Response[v1.DeleteOAuth2KeyResponse], error) + // Rotates signing keys. + // Creates a new active key and optionally deactivates old keys. + RotateOAuth2Keys(context.Context, *connect.Request[v1.RotateOAuth2KeysRequest]) (*connect.Response[v1.RotateOAuth2KeysResponse], error) + // Gets the JWKS (JSON Web Key Set) for token verification. + // This endpoint is public and returns only public keys. + GetJWKS(context.Context, *connect.Request[v1.GetJWKSRequest]) (*connect.Response[v1.GetJWKSResponse], error) +} + +// NewOAuth2KeyServiceClient constructs a client for the redpanda.api.aigateway.v1.OAuth2KeyService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewOAuth2KeyServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) OAuth2KeyServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &oAuth2KeyServiceClient{ + createOAuth2Key: connect.NewClient[v1.CreateOAuth2KeyRequest, v1.CreateOAuth2KeyResponse]( + httpClient, + baseURL+OAuth2KeyServiceCreateOAuth2KeyProcedure, + connect.WithSchema(oAuth2KeyServiceCreateOAuth2KeyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getOAuth2Key: connect.NewClient[v1.GetOAuth2KeyRequest, v1.GetOAuth2KeyResponse]( + httpClient, + baseURL+OAuth2KeyServiceGetOAuth2KeyProcedure, + connect.WithSchema(oAuth2KeyServiceGetOAuth2KeyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listOAuth2Keys: connect.NewClient[v1.ListOAuth2KeysRequest, v1.ListOAuth2KeysResponse]( + httpClient, + baseURL+OAuth2KeyServiceListOAuth2KeysProcedure, + connect.WithSchema(oAuth2KeyServiceListOAuth2KeysMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deactivateOAuth2Key: connect.NewClient[v1.DeactivateOAuth2KeyRequest, v1.DeactivateOAuth2KeyResponse]( + httpClient, + baseURL+OAuth2KeyServiceDeactivateOAuth2KeyProcedure, + connect.WithSchema(oAuth2KeyServiceDeactivateOAuth2KeyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteOAuth2Key: connect.NewClient[v1.DeleteOAuth2KeyRequest, v1.DeleteOAuth2KeyResponse]( + httpClient, + baseURL+OAuth2KeyServiceDeleteOAuth2KeyProcedure, + connect.WithSchema(oAuth2KeyServiceDeleteOAuth2KeyMethodDescriptor), + connect.WithClientOptions(opts...), + ), + rotateOAuth2Keys: connect.NewClient[v1.RotateOAuth2KeysRequest, v1.RotateOAuth2KeysResponse]( + httpClient, + baseURL+OAuth2KeyServiceRotateOAuth2KeysProcedure, + connect.WithSchema(oAuth2KeyServiceRotateOAuth2KeysMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getJWKS: connect.NewClient[v1.GetJWKSRequest, v1.GetJWKSResponse]( + httpClient, + baseURL+OAuth2KeyServiceGetJWKSProcedure, + connect.WithSchema(oAuth2KeyServiceGetJWKSMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// oAuth2KeyServiceClient implements OAuth2KeyServiceClient. +type oAuth2KeyServiceClient struct { + createOAuth2Key *connect.Client[v1.CreateOAuth2KeyRequest, v1.CreateOAuth2KeyResponse] + getOAuth2Key *connect.Client[v1.GetOAuth2KeyRequest, v1.GetOAuth2KeyResponse] + listOAuth2Keys *connect.Client[v1.ListOAuth2KeysRequest, v1.ListOAuth2KeysResponse] + deactivateOAuth2Key *connect.Client[v1.DeactivateOAuth2KeyRequest, v1.DeactivateOAuth2KeyResponse] + deleteOAuth2Key *connect.Client[v1.DeleteOAuth2KeyRequest, v1.DeleteOAuth2KeyResponse] + rotateOAuth2Keys *connect.Client[v1.RotateOAuth2KeysRequest, v1.RotateOAuth2KeysResponse] + getJWKS *connect.Client[v1.GetJWKSRequest, v1.GetJWKSResponse] +} + +// CreateOAuth2Key calls redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key. +func (c *oAuth2KeyServiceClient) CreateOAuth2Key(ctx context.Context, req *connect.Request[v1.CreateOAuth2KeyRequest]) (*connect.Response[v1.CreateOAuth2KeyResponse], error) { + return c.createOAuth2Key.CallUnary(ctx, req) +} + +// GetOAuth2Key calls redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key. +func (c *oAuth2KeyServiceClient) GetOAuth2Key(ctx context.Context, req *connect.Request[v1.GetOAuth2KeyRequest]) (*connect.Response[v1.GetOAuth2KeyResponse], error) { + return c.getOAuth2Key.CallUnary(ctx, req) +} + +// ListOAuth2Keys calls redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys. +func (c *oAuth2KeyServiceClient) ListOAuth2Keys(ctx context.Context, req *connect.Request[v1.ListOAuth2KeysRequest]) (*connect.Response[v1.ListOAuth2KeysResponse], error) { + return c.listOAuth2Keys.CallUnary(ctx, req) +} + +// DeactivateOAuth2Key calls redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key. +func (c *oAuth2KeyServiceClient) DeactivateOAuth2Key(ctx context.Context, req *connect.Request[v1.DeactivateOAuth2KeyRequest]) (*connect.Response[v1.DeactivateOAuth2KeyResponse], error) { + return c.deactivateOAuth2Key.CallUnary(ctx, req) +} + +// DeleteOAuth2Key calls redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key. +func (c *oAuth2KeyServiceClient) DeleteOAuth2Key(ctx context.Context, req *connect.Request[v1.DeleteOAuth2KeyRequest]) (*connect.Response[v1.DeleteOAuth2KeyResponse], error) { + return c.deleteOAuth2Key.CallUnary(ctx, req) +} + +// RotateOAuth2Keys calls redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys. +func (c *oAuth2KeyServiceClient) RotateOAuth2Keys(ctx context.Context, req *connect.Request[v1.RotateOAuth2KeysRequest]) (*connect.Response[v1.RotateOAuth2KeysResponse], error) { + return c.rotateOAuth2Keys.CallUnary(ctx, req) +} + +// GetJWKS calls redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS. +func (c *oAuth2KeyServiceClient) GetJWKS(ctx context.Context, req *connect.Request[v1.GetJWKSRequest]) (*connect.Response[v1.GetJWKSResponse], error) { + return c.getJWKS.CallUnary(ctx, req) +} + +// OAuth2KeyServiceHandler is an implementation of the redpanda.api.aigateway.v1.OAuth2KeyService +// service. +type OAuth2KeyServiceHandler interface { + // Creates a new signing key. + CreateOAuth2Key(context.Context, *connect.Request[v1.CreateOAuth2KeyRequest]) (*connect.Response[v1.CreateOAuth2KeyResponse], error) + // Gets a signing key by name. + // Note: Private key material is never returned. + GetOAuth2Key(context.Context, *connect.Request[v1.GetOAuth2KeyRequest]) (*connect.Response[v1.GetOAuth2KeyResponse], error) + // Lists signing keys. + ListOAuth2Keys(context.Context, *connect.Request[v1.ListOAuth2KeysRequest]) (*connect.Response[v1.ListOAuth2KeysResponse], error) + // Deactivates a signing key. + // The key will no longer be used for signing new tokens. + // Existing tokens signed with this key remain valid until expiry. + DeactivateOAuth2Key(context.Context, *connect.Request[v1.DeactivateOAuth2KeyRequest]) (*connect.Response[v1.DeactivateOAuth2KeyResponse], error) + // Deletes a signing key. + // WARNING: This will invalidate all tokens signed with this key. + DeleteOAuth2Key(context.Context, *connect.Request[v1.DeleteOAuth2KeyRequest]) (*connect.Response[v1.DeleteOAuth2KeyResponse], error) + // Rotates signing keys. + // Creates a new active key and optionally deactivates old keys. + RotateOAuth2Keys(context.Context, *connect.Request[v1.RotateOAuth2KeysRequest]) (*connect.Response[v1.RotateOAuth2KeysResponse], error) + // Gets the JWKS (JSON Web Key Set) for token verification. + // This endpoint is public and returns only public keys. + GetJWKS(context.Context, *connect.Request[v1.GetJWKSRequest]) (*connect.Response[v1.GetJWKSResponse], error) +} + +// NewOAuth2KeyServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewOAuth2KeyServiceHandler(svc OAuth2KeyServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + oAuth2KeyServiceCreateOAuth2KeyHandler := connect.NewUnaryHandler( + OAuth2KeyServiceCreateOAuth2KeyProcedure, + svc.CreateOAuth2Key, + connect.WithSchema(oAuth2KeyServiceCreateOAuth2KeyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceGetOAuth2KeyHandler := connect.NewUnaryHandler( + OAuth2KeyServiceGetOAuth2KeyProcedure, + svc.GetOAuth2Key, + connect.WithSchema(oAuth2KeyServiceGetOAuth2KeyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceListOAuth2KeysHandler := connect.NewUnaryHandler( + OAuth2KeyServiceListOAuth2KeysProcedure, + svc.ListOAuth2Keys, + connect.WithSchema(oAuth2KeyServiceListOAuth2KeysMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceDeactivateOAuth2KeyHandler := connect.NewUnaryHandler( + OAuth2KeyServiceDeactivateOAuth2KeyProcedure, + svc.DeactivateOAuth2Key, + connect.WithSchema(oAuth2KeyServiceDeactivateOAuth2KeyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceDeleteOAuth2KeyHandler := connect.NewUnaryHandler( + OAuth2KeyServiceDeleteOAuth2KeyProcedure, + svc.DeleteOAuth2Key, + connect.WithSchema(oAuth2KeyServiceDeleteOAuth2KeyMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceRotateOAuth2KeysHandler := connect.NewUnaryHandler( + OAuth2KeyServiceRotateOAuth2KeysProcedure, + svc.RotateOAuth2Keys, + connect.WithSchema(oAuth2KeyServiceRotateOAuth2KeysMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + oAuth2KeyServiceGetJWKSHandler := connect.NewUnaryHandler( + OAuth2KeyServiceGetJWKSProcedure, + svc.GetJWKS, + connect.WithSchema(oAuth2KeyServiceGetJWKSMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.OAuth2KeyService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case OAuth2KeyServiceCreateOAuth2KeyProcedure: + oAuth2KeyServiceCreateOAuth2KeyHandler.ServeHTTP(w, r) + case OAuth2KeyServiceGetOAuth2KeyProcedure: + oAuth2KeyServiceGetOAuth2KeyHandler.ServeHTTP(w, r) + case OAuth2KeyServiceListOAuth2KeysProcedure: + oAuth2KeyServiceListOAuth2KeysHandler.ServeHTTP(w, r) + case OAuth2KeyServiceDeactivateOAuth2KeyProcedure: + oAuth2KeyServiceDeactivateOAuth2KeyHandler.ServeHTTP(w, r) + case OAuth2KeyServiceDeleteOAuth2KeyProcedure: + oAuth2KeyServiceDeleteOAuth2KeyHandler.ServeHTTP(w, r) + case OAuth2KeyServiceRotateOAuth2KeysProcedure: + oAuth2KeyServiceRotateOAuth2KeysHandler.ServeHTTP(w, r) + case OAuth2KeyServiceGetJWKSProcedure: + oAuth2KeyServiceGetJWKSHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedOAuth2KeyServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedOAuth2KeyServiceHandler struct{} + +func (UnimplementedOAuth2KeyServiceHandler) CreateOAuth2Key(context.Context, *connect.Request[v1.CreateOAuth2KeyRequest]) (*connect.Response[v1.CreateOAuth2KeyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) GetOAuth2Key(context.Context, *connect.Request[v1.GetOAuth2KeyRequest]) (*connect.Response[v1.GetOAuth2KeyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) ListOAuth2Keys(context.Context, *connect.Request[v1.ListOAuth2KeysRequest]) (*connect.Response[v1.ListOAuth2KeysResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) DeactivateOAuth2Key(context.Context, *connect.Request[v1.DeactivateOAuth2KeyRequest]) (*connect.Response[v1.DeactivateOAuth2KeyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) DeleteOAuth2Key(context.Context, *connect.Request[v1.DeleteOAuth2KeyRequest]) (*connect.Response[v1.DeleteOAuth2KeyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) RotateOAuth2Keys(context.Context, *connect.Request[v1.RotateOAuth2KeysRequest]) (*connect.Response[v1.RotateOAuth2KeysResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys is not implemented")) +} + +func (UnimplementedOAuth2KeyServiceHandler) GetJWKS(context.Context, *connect.Request[v1.GetJWKSRequest]) (*connect.Response[v1.GetJWKSResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.gw.go new file mode 100644 index 0000000000..2202b3fe57 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/oauth2_key.connect.gw.go @@ -0,0 +1,76 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/oauth2_key.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// OAuth2KeyServiceGatewayServer implements the gRPC server API for the OAuth2KeyService service. +type OAuth2KeyServiceGatewayServer struct { + v1.UnimplementedOAuth2KeyServiceServer + createOAuth2Key connect_gateway.UnaryHandler[v1.CreateOAuth2KeyRequest, v1.CreateOAuth2KeyResponse] + getOAuth2Key connect_gateway.UnaryHandler[v1.GetOAuth2KeyRequest, v1.GetOAuth2KeyResponse] + listOAuth2Keys connect_gateway.UnaryHandler[v1.ListOAuth2KeysRequest, v1.ListOAuth2KeysResponse] + deactivateOAuth2Key connect_gateway.UnaryHandler[v1.DeactivateOAuth2KeyRequest, v1.DeactivateOAuth2KeyResponse] + deleteOAuth2Key connect_gateway.UnaryHandler[v1.DeleteOAuth2KeyRequest, v1.DeleteOAuth2KeyResponse] + rotateOAuth2Keys connect_gateway.UnaryHandler[v1.RotateOAuth2KeysRequest, v1.RotateOAuth2KeysResponse] + getJWKS connect_gateway.UnaryHandler[v1.GetJWKSRequest, v1.GetJWKSResponse] +} + +// NewOAuth2KeyServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// OAuth2KeyService service. +func NewOAuth2KeyServiceGatewayServer(svc OAuth2KeyServiceHandler, opts ...connect_gateway.HandlerOption) *OAuth2KeyServiceGatewayServer { + return &OAuth2KeyServiceGatewayServer{ + createOAuth2Key: connect_gateway.NewUnaryHandler(OAuth2KeyServiceCreateOAuth2KeyProcedure, svc.CreateOAuth2Key, opts...), + getOAuth2Key: connect_gateway.NewUnaryHandler(OAuth2KeyServiceGetOAuth2KeyProcedure, svc.GetOAuth2Key, opts...), + listOAuth2Keys: connect_gateway.NewUnaryHandler(OAuth2KeyServiceListOAuth2KeysProcedure, svc.ListOAuth2Keys, opts...), + deactivateOAuth2Key: connect_gateway.NewUnaryHandler(OAuth2KeyServiceDeactivateOAuth2KeyProcedure, svc.DeactivateOAuth2Key, opts...), + deleteOAuth2Key: connect_gateway.NewUnaryHandler(OAuth2KeyServiceDeleteOAuth2KeyProcedure, svc.DeleteOAuth2Key, opts...), + rotateOAuth2Keys: connect_gateway.NewUnaryHandler(OAuth2KeyServiceRotateOAuth2KeysProcedure, svc.RotateOAuth2Keys, opts...), + getJWKS: connect_gateway.NewUnaryHandler(OAuth2KeyServiceGetJWKSProcedure, svc.GetJWKS, opts...), + } +} + +func (s *OAuth2KeyServiceGatewayServer) CreateOAuth2Key(ctx context.Context, req *v1.CreateOAuth2KeyRequest) (*v1.CreateOAuth2KeyResponse, error) { + return s.createOAuth2Key(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) GetOAuth2Key(ctx context.Context, req *v1.GetOAuth2KeyRequest) (*v1.GetOAuth2KeyResponse, error) { + return s.getOAuth2Key(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) ListOAuth2Keys(ctx context.Context, req *v1.ListOAuth2KeysRequest) (*v1.ListOAuth2KeysResponse, error) { + return s.listOAuth2Keys(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) DeactivateOAuth2Key(ctx context.Context, req *v1.DeactivateOAuth2KeyRequest) (*v1.DeactivateOAuth2KeyResponse, error) { + return s.deactivateOAuth2Key(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) DeleteOAuth2Key(ctx context.Context, req *v1.DeleteOAuth2KeyRequest) (*v1.DeleteOAuth2KeyResponse, error) { + return s.deleteOAuth2Key(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) RotateOAuth2Keys(ctx context.Context, req *v1.RotateOAuth2KeysRequest) (*v1.RotateOAuth2KeysResponse, error) { + return s.rotateOAuth2Keys(ctx, req) +} + +func (s *OAuth2KeyServiceGatewayServer) GetJWKS(ctx context.Context, req *v1.GetJWKSRequest) (*v1.GetJWKSResponse, error) { + return s.getJWKS(ctx, req) +} + +// RegisterOAuth2KeyServiceHandlerGatewayServer registers the Connect handlers for the +// OAuth2KeyService "svc" to "mux". +func RegisterOAuth2KeyServiceHandlerGatewayServer(mux *runtime.ServeMux, svc OAuth2KeyServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterOAuth2KeyServiceHandlerServer(context.TODO(), mux, NewOAuth2KeyServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.go new file mode 100644 index 0000000000..0ae6aa0349 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.go @@ -0,0 +1,247 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/organization.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // OrganizationServiceName is the fully-qualified name of the OrganizationService service. + OrganizationServiceName = "redpanda.api.aigateway.v1.OrganizationService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // OrganizationServiceCreateOrganizationProcedure is the fully-qualified name of the + // OrganizationService's CreateOrganization RPC. + OrganizationServiceCreateOrganizationProcedure = "/redpanda.api.aigateway.v1.OrganizationService/CreateOrganization" + // OrganizationServiceGetOrganizationProcedure is the fully-qualified name of the + // OrganizationService's GetOrganization RPC. + OrganizationServiceGetOrganizationProcedure = "/redpanda.api.aigateway.v1.OrganizationService/GetOrganization" + // OrganizationServiceListOrganizationsProcedure is the fully-qualified name of the + // OrganizationService's ListOrganizations RPC. + OrganizationServiceListOrganizationsProcedure = "/redpanda.api.aigateway.v1.OrganizationService/ListOrganizations" + // OrganizationServiceUpdateOrganizationProcedure is the fully-qualified name of the + // OrganizationService's UpdateOrganization RPC. + OrganizationServiceUpdateOrganizationProcedure = "/redpanda.api.aigateway.v1.OrganizationService/UpdateOrganization" + // OrganizationServiceDeleteOrganizationProcedure is the fully-qualified name of the + // OrganizationService's DeleteOrganization RPC. + OrganizationServiceDeleteOrganizationProcedure = "/redpanda.api.aigateway.v1.OrganizationService/DeleteOrganization" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + organizationServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_organization_proto.Services().ByName("OrganizationService") + organizationServiceCreateOrganizationMethodDescriptor = organizationServiceServiceDescriptor.Methods().ByName("CreateOrganization") + organizationServiceGetOrganizationMethodDescriptor = organizationServiceServiceDescriptor.Methods().ByName("GetOrganization") + organizationServiceListOrganizationsMethodDescriptor = organizationServiceServiceDescriptor.Methods().ByName("ListOrganizations") + organizationServiceUpdateOrganizationMethodDescriptor = organizationServiceServiceDescriptor.Methods().ByName("UpdateOrganization") + organizationServiceDeleteOrganizationMethodDescriptor = organizationServiceServiceDescriptor.Methods().ByName("DeleteOrganization") +) + +// OrganizationServiceClient is a client for the redpanda.api.aigateway.v1.OrganizationService +// service. +type OrganizationServiceClient interface { + // Creates a new organization within an account. + CreateOrganization(context.Context, *connect.Request[v1.CreateOrganizationRequest]) (*connect.Response[v1.CreateOrganizationResponse], error) + // Gets an organization by name. + GetOrganization(context.Context, *connect.Request[v1.GetOrganizationRequest]) (*connect.Response[v1.GetOrganizationResponse], error) + // Lists organizations within an account. + ListOrganizations(context.Context, *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) + // Updates an organization. + UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.UpdateOrganizationResponse], error) + // Deletes an organization. + DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[v1.DeleteOrganizationResponse], error) +} + +// NewOrganizationServiceClient constructs a client for the +// redpanda.api.aigateway.v1.OrganizationService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewOrganizationServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) OrganizationServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &organizationServiceClient{ + createOrganization: connect.NewClient[v1.CreateOrganizationRequest, v1.CreateOrganizationResponse]( + httpClient, + baseURL+OrganizationServiceCreateOrganizationProcedure, + connect.WithSchema(organizationServiceCreateOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getOrganization: connect.NewClient[v1.GetOrganizationRequest, v1.GetOrganizationResponse]( + httpClient, + baseURL+OrganizationServiceGetOrganizationProcedure, + connect.WithSchema(organizationServiceGetOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listOrganizations: connect.NewClient[v1.ListOrganizationsRequest, v1.ListOrganizationsResponse]( + httpClient, + baseURL+OrganizationServiceListOrganizationsProcedure, + connect.WithSchema(organizationServiceListOrganizationsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateOrganization: connect.NewClient[v1.UpdateOrganizationRequest, v1.UpdateOrganizationResponse]( + httpClient, + baseURL+OrganizationServiceUpdateOrganizationProcedure, + connect.WithSchema(organizationServiceUpdateOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteOrganization: connect.NewClient[v1.DeleteOrganizationRequest, v1.DeleteOrganizationResponse]( + httpClient, + baseURL+OrganizationServiceDeleteOrganizationProcedure, + connect.WithSchema(organizationServiceDeleteOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// organizationServiceClient implements OrganizationServiceClient. +type organizationServiceClient struct { + createOrganization *connect.Client[v1.CreateOrganizationRequest, v1.CreateOrganizationResponse] + getOrganization *connect.Client[v1.GetOrganizationRequest, v1.GetOrganizationResponse] + listOrganizations *connect.Client[v1.ListOrganizationsRequest, v1.ListOrganizationsResponse] + updateOrganization *connect.Client[v1.UpdateOrganizationRequest, v1.UpdateOrganizationResponse] + deleteOrganization *connect.Client[v1.DeleteOrganizationRequest, v1.DeleteOrganizationResponse] +} + +// CreateOrganization calls redpanda.api.aigateway.v1.OrganizationService.CreateOrganization. +func (c *organizationServiceClient) CreateOrganization(ctx context.Context, req *connect.Request[v1.CreateOrganizationRequest]) (*connect.Response[v1.CreateOrganizationResponse], error) { + return c.createOrganization.CallUnary(ctx, req) +} + +// GetOrganization calls redpanda.api.aigateway.v1.OrganizationService.GetOrganization. +func (c *organizationServiceClient) GetOrganization(ctx context.Context, req *connect.Request[v1.GetOrganizationRequest]) (*connect.Response[v1.GetOrganizationResponse], error) { + return c.getOrganization.CallUnary(ctx, req) +} + +// ListOrganizations calls redpanda.api.aigateway.v1.OrganizationService.ListOrganizations. +func (c *organizationServiceClient) ListOrganizations(ctx context.Context, req *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) { + return c.listOrganizations.CallUnary(ctx, req) +} + +// UpdateOrganization calls redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization. +func (c *organizationServiceClient) UpdateOrganization(ctx context.Context, req *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.UpdateOrganizationResponse], error) { + return c.updateOrganization.CallUnary(ctx, req) +} + +// DeleteOrganization calls redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization. +func (c *organizationServiceClient) DeleteOrganization(ctx context.Context, req *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[v1.DeleteOrganizationResponse], error) { + return c.deleteOrganization.CallUnary(ctx, req) +} + +// OrganizationServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.OrganizationService service. +type OrganizationServiceHandler interface { + // Creates a new organization within an account. + CreateOrganization(context.Context, *connect.Request[v1.CreateOrganizationRequest]) (*connect.Response[v1.CreateOrganizationResponse], error) + // Gets an organization by name. + GetOrganization(context.Context, *connect.Request[v1.GetOrganizationRequest]) (*connect.Response[v1.GetOrganizationResponse], error) + // Lists organizations within an account. + ListOrganizations(context.Context, *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) + // Updates an organization. + UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.UpdateOrganizationResponse], error) + // Deletes an organization. + DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[v1.DeleteOrganizationResponse], error) +} + +// NewOrganizationServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewOrganizationServiceHandler(svc OrganizationServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + organizationServiceCreateOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceCreateOrganizationProcedure, + svc.CreateOrganization, + connect.WithSchema(organizationServiceCreateOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + organizationServiceGetOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceGetOrganizationProcedure, + svc.GetOrganization, + connect.WithSchema(organizationServiceGetOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + organizationServiceListOrganizationsHandler := connect.NewUnaryHandler( + OrganizationServiceListOrganizationsProcedure, + svc.ListOrganizations, + connect.WithSchema(organizationServiceListOrganizationsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + organizationServiceUpdateOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceUpdateOrganizationProcedure, + svc.UpdateOrganization, + connect.WithSchema(organizationServiceUpdateOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + organizationServiceDeleteOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceDeleteOrganizationProcedure, + svc.DeleteOrganization, + connect.WithSchema(organizationServiceDeleteOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.OrganizationService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case OrganizationServiceCreateOrganizationProcedure: + organizationServiceCreateOrganizationHandler.ServeHTTP(w, r) + case OrganizationServiceGetOrganizationProcedure: + organizationServiceGetOrganizationHandler.ServeHTTP(w, r) + case OrganizationServiceListOrganizationsProcedure: + organizationServiceListOrganizationsHandler.ServeHTTP(w, r) + case OrganizationServiceUpdateOrganizationProcedure: + organizationServiceUpdateOrganizationHandler.ServeHTTP(w, r) + case OrganizationServiceDeleteOrganizationProcedure: + organizationServiceDeleteOrganizationHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedOrganizationServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedOrganizationServiceHandler struct{} + +func (UnimplementedOrganizationServiceHandler) CreateOrganization(context.Context, *connect.Request[v1.CreateOrganizationRequest]) (*connect.Response[v1.CreateOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OrganizationService.CreateOrganization is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) GetOrganization(context.Context, *connect.Request[v1.GetOrganizationRequest]) (*connect.Response[v1.GetOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OrganizationService.GetOrganization is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) ListOrganizations(context.Context, *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OrganizationService.ListOrganizations is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.UpdateOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[v1.DeleteOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.gw.go new file mode 100644 index 0000000000..11e53009fd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/organization.connect.gw.go @@ -0,0 +1,65 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/organization.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// OrganizationServiceGatewayServer implements the gRPC server API for the OrganizationService +// service. +type OrganizationServiceGatewayServer struct { + v1.UnimplementedOrganizationServiceServer + createOrganization connect_gateway.UnaryHandler[v1.CreateOrganizationRequest, v1.CreateOrganizationResponse] + getOrganization connect_gateway.UnaryHandler[v1.GetOrganizationRequest, v1.GetOrganizationResponse] + listOrganizations connect_gateway.UnaryHandler[v1.ListOrganizationsRequest, v1.ListOrganizationsResponse] + updateOrganization connect_gateway.UnaryHandler[v1.UpdateOrganizationRequest, v1.UpdateOrganizationResponse] + deleteOrganization connect_gateway.UnaryHandler[v1.DeleteOrganizationRequest, v1.DeleteOrganizationResponse] +} + +// NewOrganizationServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// OrganizationService service. +func NewOrganizationServiceGatewayServer(svc OrganizationServiceHandler, opts ...connect_gateway.HandlerOption) *OrganizationServiceGatewayServer { + return &OrganizationServiceGatewayServer{ + createOrganization: connect_gateway.NewUnaryHandler(OrganizationServiceCreateOrganizationProcedure, svc.CreateOrganization, opts...), + getOrganization: connect_gateway.NewUnaryHandler(OrganizationServiceGetOrganizationProcedure, svc.GetOrganization, opts...), + listOrganizations: connect_gateway.NewUnaryHandler(OrganizationServiceListOrganizationsProcedure, svc.ListOrganizations, opts...), + updateOrganization: connect_gateway.NewUnaryHandler(OrganizationServiceUpdateOrganizationProcedure, svc.UpdateOrganization, opts...), + deleteOrganization: connect_gateway.NewUnaryHandler(OrganizationServiceDeleteOrganizationProcedure, svc.DeleteOrganization, opts...), + } +} + +func (s *OrganizationServiceGatewayServer) CreateOrganization(ctx context.Context, req *v1.CreateOrganizationRequest) (*v1.CreateOrganizationResponse, error) { + return s.createOrganization(ctx, req) +} + +func (s *OrganizationServiceGatewayServer) GetOrganization(ctx context.Context, req *v1.GetOrganizationRequest) (*v1.GetOrganizationResponse, error) { + return s.getOrganization(ctx, req) +} + +func (s *OrganizationServiceGatewayServer) ListOrganizations(ctx context.Context, req *v1.ListOrganizationsRequest) (*v1.ListOrganizationsResponse, error) { + return s.listOrganizations(ctx, req) +} + +func (s *OrganizationServiceGatewayServer) UpdateOrganization(ctx context.Context, req *v1.UpdateOrganizationRequest) (*v1.UpdateOrganizationResponse, error) { + return s.updateOrganization(ctx, req) +} + +func (s *OrganizationServiceGatewayServer) DeleteOrganization(ctx context.Context, req *v1.DeleteOrganizationRequest) (*v1.DeleteOrganizationResponse, error) { + return s.deleteOrganization(ctx, req) +} + +// RegisterOrganizationServiceHandlerGatewayServer registers the Connect handlers for the +// OrganizationService "svc" to "mux". +func RegisterOrganizationServiceHandlerGatewayServer(mux *runtime.ServeMux, svc OrganizationServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterOrganizationServiceHandlerServer(context.TODO(), mux, NewOrganizationServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.go new file mode 100644 index 0000000000..0c6b3c7186 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.go @@ -0,0 +1,447 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/pricing.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // ModelPricingServiceName is the fully-qualified name of the ModelPricingService service. + ModelPricingServiceName = "redpanda.api.aigateway.v1.ModelPricingService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // ModelPricingServiceCreateStandardPriceProcedure is the fully-qualified name of the + // ModelPricingService's CreateStandardPrice RPC. + ModelPricingServiceCreateStandardPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/CreateStandardPrice" + // ModelPricingServiceGetStandardPriceProcedure is the fully-qualified name of the + // ModelPricingService's GetStandardPrice RPC. + ModelPricingServiceGetStandardPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/GetStandardPrice" + // ModelPricingServiceListStandardPricesProcedure is the fully-qualified name of the + // ModelPricingService's ListStandardPrices RPC. + ModelPricingServiceListStandardPricesProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/ListStandardPrices" + // ModelPricingServiceUpdateStandardPriceProcedure is the fully-qualified name of the + // ModelPricingService's UpdateStandardPrice RPC. + ModelPricingServiceUpdateStandardPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/UpdateStandardPrice" + // ModelPricingServiceDeleteStandardPriceProcedure is the fully-qualified name of the + // ModelPricingService's DeleteStandardPrice RPC. + ModelPricingServiceDeleteStandardPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/DeleteStandardPrice" + // ModelPricingServiceCreateCustomPriceProcedure is the fully-qualified name of the + // ModelPricingService's CreateCustomPrice RPC. + ModelPricingServiceCreateCustomPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/CreateCustomPrice" + // ModelPricingServiceGetCustomPriceProcedure is the fully-qualified name of the + // ModelPricingService's GetCustomPrice RPC. + ModelPricingServiceGetCustomPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/GetCustomPrice" + // ModelPricingServiceListCustomPricesProcedure is the fully-qualified name of the + // ModelPricingService's ListCustomPrices RPC. + ModelPricingServiceListCustomPricesProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/ListCustomPrices" + // ModelPricingServiceUpdateCustomPriceProcedure is the fully-qualified name of the + // ModelPricingService's UpdateCustomPrice RPC. + ModelPricingServiceUpdateCustomPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/UpdateCustomPrice" + // ModelPricingServiceDeleteCustomPriceProcedure is the fully-qualified name of the + // ModelPricingService's DeleteCustomPrice RPC. + ModelPricingServiceDeleteCustomPriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/DeleteCustomPrice" + // ModelPricingServiceGetEffectivePriceProcedure is the fully-qualified name of the + // ModelPricingService's GetEffectivePrice RPC. + ModelPricingServiceGetEffectivePriceProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/GetEffectivePrice" + // ModelPricingServiceListPriceHistoryProcedure is the fully-qualified name of the + // ModelPricingService's ListPriceHistory RPC. + ModelPricingServiceListPriceHistoryProcedure = "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + modelPricingServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_pricing_proto.Services().ByName("ModelPricingService") + modelPricingServiceCreateStandardPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("CreateStandardPrice") + modelPricingServiceGetStandardPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("GetStandardPrice") + modelPricingServiceListStandardPricesMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("ListStandardPrices") + modelPricingServiceUpdateStandardPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("UpdateStandardPrice") + modelPricingServiceDeleteStandardPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("DeleteStandardPrice") + modelPricingServiceCreateCustomPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("CreateCustomPrice") + modelPricingServiceGetCustomPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("GetCustomPrice") + modelPricingServiceListCustomPricesMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("ListCustomPrices") + modelPricingServiceUpdateCustomPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("UpdateCustomPrice") + modelPricingServiceDeleteCustomPriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("DeleteCustomPrice") + modelPricingServiceGetEffectivePriceMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("GetEffectivePrice") + modelPricingServiceListPriceHistoryMethodDescriptor = modelPricingServiceServiceDescriptor.Methods().ByName("ListPriceHistory") +) + +// ModelPricingServiceClient is a client for the redpanda.api.aigateway.v1.ModelPricingService +// service. +type ModelPricingServiceClient interface { + CreateStandardPrice(context.Context, *connect.Request[v1.CreateStandardPriceRequest]) (*connect.Response[v1.CreateStandardPriceResponse], error) + GetStandardPrice(context.Context, *connect.Request[v1.GetStandardPriceRequest]) (*connect.Response[v1.GetStandardPriceResponse], error) + ListStandardPrices(context.Context, *connect.Request[v1.ListStandardPricesRequest]) (*connect.Response[v1.ListStandardPricesResponse], error) + UpdateStandardPrice(context.Context, *connect.Request[v1.UpdateStandardPriceRequest]) (*connect.Response[v1.UpdateStandardPriceResponse], error) + DeleteStandardPrice(context.Context, *connect.Request[v1.DeleteStandardPriceRequest]) (*connect.Response[v1.DeleteStandardPriceResponse], error) + CreateCustomPrice(context.Context, *connect.Request[v1.CreateCustomPriceRequest]) (*connect.Response[v1.CreateCustomPriceResponse], error) + GetCustomPrice(context.Context, *connect.Request[v1.GetCustomPriceRequest]) (*connect.Response[v1.GetCustomPriceResponse], error) + ListCustomPrices(context.Context, *connect.Request[v1.ListCustomPricesRequest]) (*connect.Response[v1.ListCustomPricesResponse], error) + UpdateCustomPrice(context.Context, *connect.Request[v1.UpdateCustomPriceRequest]) (*connect.Response[v1.UpdateCustomPriceResponse], error) + DeleteCustomPrice(context.Context, *connect.Request[v1.DeleteCustomPriceRequest]) (*connect.Response[v1.DeleteCustomPriceResponse], error) + GetEffectivePrice(context.Context, *connect.Request[v1.GetEffectivePriceRequest]) (*connect.Response[v1.GetEffectivePriceResponse], error) + ListPriceHistory(context.Context, *connect.Request[v1.ListPriceHistoryRequest]) (*connect.Response[v1.ListPriceHistoryResponse], error) +} + +// NewModelPricingServiceClient constructs a client for the +// redpanda.api.aigateway.v1.ModelPricingService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewModelPricingServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ModelPricingServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &modelPricingServiceClient{ + createStandardPrice: connect.NewClient[v1.CreateStandardPriceRequest, v1.CreateStandardPriceResponse]( + httpClient, + baseURL+ModelPricingServiceCreateStandardPriceProcedure, + connect.WithSchema(modelPricingServiceCreateStandardPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getStandardPrice: connect.NewClient[v1.GetStandardPriceRequest, v1.GetStandardPriceResponse]( + httpClient, + baseURL+ModelPricingServiceGetStandardPriceProcedure, + connect.WithSchema(modelPricingServiceGetStandardPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listStandardPrices: connect.NewClient[v1.ListStandardPricesRequest, v1.ListStandardPricesResponse]( + httpClient, + baseURL+ModelPricingServiceListStandardPricesProcedure, + connect.WithSchema(modelPricingServiceListStandardPricesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateStandardPrice: connect.NewClient[v1.UpdateStandardPriceRequest, v1.UpdateStandardPriceResponse]( + httpClient, + baseURL+ModelPricingServiceUpdateStandardPriceProcedure, + connect.WithSchema(modelPricingServiceUpdateStandardPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteStandardPrice: connect.NewClient[v1.DeleteStandardPriceRequest, v1.DeleteStandardPriceResponse]( + httpClient, + baseURL+ModelPricingServiceDeleteStandardPriceProcedure, + connect.WithSchema(modelPricingServiceDeleteStandardPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + createCustomPrice: connect.NewClient[v1.CreateCustomPriceRequest, v1.CreateCustomPriceResponse]( + httpClient, + baseURL+ModelPricingServiceCreateCustomPriceProcedure, + connect.WithSchema(modelPricingServiceCreateCustomPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getCustomPrice: connect.NewClient[v1.GetCustomPriceRequest, v1.GetCustomPriceResponse]( + httpClient, + baseURL+ModelPricingServiceGetCustomPriceProcedure, + connect.WithSchema(modelPricingServiceGetCustomPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listCustomPrices: connect.NewClient[v1.ListCustomPricesRequest, v1.ListCustomPricesResponse]( + httpClient, + baseURL+ModelPricingServiceListCustomPricesProcedure, + connect.WithSchema(modelPricingServiceListCustomPricesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateCustomPrice: connect.NewClient[v1.UpdateCustomPriceRequest, v1.UpdateCustomPriceResponse]( + httpClient, + baseURL+ModelPricingServiceUpdateCustomPriceProcedure, + connect.WithSchema(modelPricingServiceUpdateCustomPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteCustomPrice: connect.NewClient[v1.DeleteCustomPriceRequest, v1.DeleteCustomPriceResponse]( + httpClient, + baseURL+ModelPricingServiceDeleteCustomPriceProcedure, + connect.WithSchema(modelPricingServiceDeleteCustomPriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getEffectivePrice: connect.NewClient[v1.GetEffectivePriceRequest, v1.GetEffectivePriceResponse]( + httpClient, + baseURL+ModelPricingServiceGetEffectivePriceProcedure, + connect.WithSchema(modelPricingServiceGetEffectivePriceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listPriceHistory: connect.NewClient[v1.ListPriceHistoryRequest, v1.ListPriceHistoryResponse]( + httpClient, + baseURL+ModelPricingServiceListPriceHistoryProcedure, + connect.WithSchema(modelPricingServiceListPriceHistoryMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// modelPricingServiceClient implements ModelPricingServiceClient. +type modelPricingServiceClient struct { + createStandardPrice *connect.Client[v1.CreateStandardPriceRequest, v1.CreateStandardPriceResponse] + getStandardPrice *connect.Client[v1.GetStandardPriceRequest, v1.GetStandardPriceResponse] + listStandardPrices *connect.Client[v1.ListStandardPricesRequest, v1.ListStandardPricesResponse] + updateStandardPrice *connect.Client[v1.UpdateStandardPriceRequest, v1.UpdateStandardPriceResponse] + deleteStandardPrice *connect.Client[v1.DeleteStandardPriceRequest, v1.DeleteStandardPriceResponse] + createCustomPrice *connect.Client[v1.CreateCustomPriceRequest, v1.CreateCustomPriceResponse] + getCustomPrice *connect.Client[v1.GetCustomPriceRequest, v1.GetCustomPriceResponse] + listCustomPrices *connect.Client[v1.ListCustomPricesRequest, v1.ListCustomPricesResponse] + updateCustomPrice *connect.Client[v1.UpdateCustomPriceRequest, v1.UpdateCustomPriceResponse] + deleteCustomPrice *connect.Client[v1.DeleteCustomPriceRequest, v1.DeleteCustomPriceResponse] + getEffectivePrice *connect.Client[v1.GetEffectivePriceRequest, v1.GetEffectivePriceResponse] + listPriceHistory *connect.Client[v1.ListPriceHistoryRequest, v1.ListPriceHistoryResponse] +} + +// CreateStandardPrice calls redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice. +func (c *modelPricingServiceClient) CreateStandardPrice(ctx context.Context, req *connect.Request[v1.CreateStandardPriceRequest]) (*connect.Response[v1.CreateStandardPriceResponse], error) { + return c.createStandardPrice.CallUnary(ctx, req) +} + +// GetStandardPrice calls redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice. +func (c *modelPricingServiceClient) GetStandardPrice(ctx context.Context, req *connect.Request[v1.GetStandardPriceRequest]) (*connect.Response[v1.GetStandardPriceResponse], error) { + return c.getStandardPrice.CallUnary(ctx, req) +} + +// ListStandardPrices calls redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices. +func (c *modelPricingServiceClient) ListStandardPrices(ctx context.Context, req *connect.Request[v1.ListStandardPricesRequest]) (*connect.Response[v1.ListStandardPricesResponse], error) { + return c.listStandardPrices.CallUnary(ctx, req) +} + +// UpdateStandardPrice calls redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice. +func (c *modelPricingServiceClient) UpdateStandardPrice(ctx context.Context, req *connect.Request[v1.UpdateStandardPriceRequest]) (*connect.Response[v1.UpdateStandardPriceResponse], error) { + return c.updateStandardPrice.CallUnary(ctx, req) +} + +// DeleteStandardPrice calls redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice. +func (c *modelPricingServiceClient) DeleteStandardPrice(ctx context.Context, req *connect.Request[v1.DeleteStandardPriceRequest]) (*connect.Response[v1.DeleteStandardPriceResponse], error) { + return c.deleteStandardPrice.CallUnary(ctx, req) +} + +// CreateCustomPrice calls redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice. +func (c *modelPricingServiceClient) CreateCustomPrice(ctx context.Context, req *connect.Request[v1.CreateCustomPriceRequest]) (*connect.Response[v1.CreateCustomPriceResponse], error) { + return c.createCustomPrice.CallUnary(ctx, req) +} + +// GetCustomPrice calls redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice. +func (c *modelPricingServiceClient) GetCustomPrice(ctx context.Context, req *connect.Request[v1.GetCustomPriceRequest]) (*connect.Response[v1.GetCustomPriceResponse], error) { + return c.getCustomPrice.CallUnary(ctx, req) +} + +// ListCustomPrices calls redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices. +func (c *modelPricingServiceClient) ListCustomPrices(ctx context.Context, req *connect.Request[v1.ListCustomPricesRequest]) (*connect.Response[v1.ListCustomPricesResponse], error) { + return c.listCustomPrices.CallUnary(ctx, req) +} + +// UpdateCustomPrice calls redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice. +func (c *modelPricingServiceClient) UpdateCustomPrice(ctx context.Context, req *connect.Request[v1.UpdateCustomPriceRequest]) (*connect.Response[v1.UpdateCustomPriceResponse], error) { + return c.updateCustomPrice.CallUnary(ctx, req) +} + +// DeleteCustomPrice calls redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice. +func (c *modelPricingServiceClient) DeleteCustomPrice(ctx context.Context, req *connect.Request[v1.DeleteCustomPriceRequest]) (*connect.Response[v1.DeleteCustomPriceResponse], error) { + return c.deleteCustomPrice.CallUnary(ctx, req) +} + +// GetEffectivePrice calls redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice. +func (c *modelPricingServiceClient) GetEffectivePrice(ctx context.Context, req *connect.Request[v1.GetEffectivePriceRequest]) (*connect.Response[v1.GetEffectivePriceResponse], error) { + return c.getEffectivePrice.CallUnary(ctx, req) +} + +// ListPriceHistory calls redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory. +func (c *modelPricingServiceClient) ListPriceHistory(ctx context.Context, req *connect.Request[v1.ListPriceHistoryRequest]) (*connect.Response[v1.ListPriceHistoryResponse], error) { + return c.listPriceHistory.CallUnary(ctx, req) +} + +// ModelPricingServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.ModelPricingService service. +type ModelPricingServiceHandler interface { + CreateStandardPrice(context.Context, *connect.Request[v1.CreateStandardPriceRequest]) (*connect.Response[v1.CreateStandardPriceResponse], error) + GetStandardPrice(context.Context, *connect.Request[v1.GetStandardPriceRequest]) (*connect.Response[v1.GetStandardPriceResponse], error) + ListStandardPrices(context.Context, *connect.Request[v1.ListStandardPricesRequest]) (*connect.Response[v1.ListStandardPricesResponse], error) + UpdateStandardPrice(context.Context, *connect.Request[v1.UpdateStandardPriceRequest]) (*connect.Response[v1.UpdateStandardPriceResponse], error) + DeleteStandardPrice(context.Context, *connect.Request[v1.DeleteStandardPriceRequest]) (*connect.Response[v1.DeleteStandardPriceResponse], error) + CreateCustomPrice(context.Context, *connect.Request[v1.CreateCustomPriceRequest]) (*connect.Response[v1.CreateCustomPriceResponse], error) + GetCustomPrice(context.Context, *connect.Request[v1.GetCustomPriceRequest]) (*connect.Response[v1.GetCustomPriceResponse], error) + ListCustomPrices(context.Context, *connect.Request[v1.ListCustomPricesRequest]) (*connect.Response[v1.ListCustomPricesResponse], error) + UpdateCustomPrice(context.Context, *connect.Request[v1.UpdateCustomPriceRequest]) (*connect.Response[v1.UpdateCustomPriceResponse], error) + DeleteCustomPrice(context.Context, *connect.Request[v1.DeleteCustomPriceRequest]) (*connect.Response[v1.DeleteCustomPriceResponse], error) + GetEffectivePrice(context.Context, *connect.Request[v1.GetEffectivePriceRequest]) (*connect.Response[v1.GetEffectivePriceResponse], error) + ListPriceHistory(context.Context, *connect.Request[v1.ListPriceHistoryRequest]) (*connect.Response[v1.ListPriceHistoryResponse], error) +} + +// NewModelPricingServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewModelPricingServiceHandler(svc ModelPricingServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + modelPricingServiceCreateStandardPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceCreateStandardPriceProcedure, + svc.CreateStandardPrice, + connect.WithSchema(modelPricingServiceCreateStandardPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceGetStandardPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceGetStandardPriceProcedure, + svc.GetStandardPrice, + connect.WithSchema(modelPricingServiceGetStandardPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceListStandardPricesHandler := connect.NewUnaryHandler( + ModelPricingServiceListStandardPricesProcedure, + svc.ListStandardPrices, + connect.WithSchema(modelPricingServiceListStandardPricesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceUpdateStandardPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceUpdateStandardPriceProcedure, + svc.UpdateStandardPrice, + connect.WithSchema(modelPricingServiceUpdateStandardPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceDeleteStandardPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceDeleteStandardPriceProcedure, + svc.DeleteStandardPrice, + connect.WithSchema(modelPricingServiceDeleteStandardPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceCreateCustomPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceCreateCustomPriceProcedure, + svc.CreateCustomPrice, + connect.WithSchema(modelPricingServiceCreateCustomPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceGetCustomPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceGetCustomPriceProcedure, + svc.GetCustomPrice, + connect.WithSchema(modelPricingServiceGetCustomPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceListCustomPricesHandler := connect.NewUnaryHandler( + ModelPricingServiceListCustomPricesProcedure, + svc.ListCustomPrices, + connect.WithSchema(modelPricingServiceListCustomPricesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceUpdateCustomPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceUpdateCustomPriceProcedure, + svc.UpdateCustomPrice, + connect.WithSchema(modelPricingServiceUpdateCustomPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceDeleteCustomPriceHandler := connect.NewUnaryHandler( + ModelPricingServiceDeleteCustomPriceProcedure, + svc.DeleteCustomPrice, + connect.WithSchema(modelPricingServiceDeleteCustomPriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceGetEffectivePriceHandler := connect.NewUnaryHandler( + ModelPricingServiceGetEffectivePriceProcedure, + svc.GetEffectivePrice, + connect.WithSchema(modelPricingServiceGetEffectivePriceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + modelPricingServiceListPriceHistoryHandler := connect.NewUnaryHandler( + ModelPricingServiceListPriceHistoryProcedure, + svc.ListPriceHistory, + connect.WithSchema(modelPricingServiceListPriceHistoryMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.ModelPricingService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case ModelPricingServiceCreateStandardPriceProcedure: + modelPricingServiceCreateStandardPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceGetStandardPriceProcedure: + modelPricingServiceGetStandardPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceListStandardPricesProcedure: + modelPricingServiceListStandardPricesHandler.ServeHTTP(w, r) + case ModelPricingServiceUpdateStandardPriceProcedure: + modelPricingServiceUpdateStandardPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceDeleteStandardPriceProcedure: + modelPricingServiceDeleteStandardPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceCreateCustomPriceProcedure: + modelPricingServiceCreateCustomPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceGetCustomPriceProcedure: + modelPricingServiceGetCustomPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceListCustomPricesProcedure: + modelPricingServiceListCustomPricesHandler.ServeHTTP(w, r) + case ModelPricingServiceUpdateCustomPriceProcedure: + modelPricingServiceUpdateCustomPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceDeleteCustomPriceProcedure: + modelPricingServiceDeleteCustomPriceHandler.ServeHTTP(w, r) + case ModelPricingServiceGetEffectivePriceProcedure: + modelPricingServiceGetEffectivePriceHandler.ServeHTTP(w, r) + case ModelPricingServiceListPriceHistoryProcedure: + modelPricingServiceListPriceHistoryHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedModelPricingServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedModelPricingServiceHandler struct{} + +func (UnimplementedModelPricingServiceHandler) CreateStandardPrice(context.Context, *connect.Request[v1.CreateStandardPriceRequest]) (*connect.Response[v1.CreateStandardPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) GetStandardPrice(context.Context, *connect.Request[v1.GetStandardPriceRequest]) (*connect.Response[v1.GetStandardPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) ListStandardPrices(context.Context, *connect.Request[v1.ListStandardPricesRequest]) (*connect.Response[v1.ListStandardPricesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) UpdateStandardPrice(context.Context, *connect.Request[v1.UpdateStandardPriceRequest]) (*connect.Response[v1.UpdateStandardPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) DeleteStandardPrice(context.Context, *connect.Request[v1.DeleteStandardPriceRequest]) (*connect.Response[v1.DeleteStandardPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) CreateCustomPrice(context.Context, *connect.Request[v1.CreateCustomPriceRequest]) (*connect.Response[v1.CreateCustomPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) GetCustomPrice(context.Context, *connect.Request[v1.GetCustomPriceRequest]) (*connect.Response[v1.GetCustomPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) ListCustomPrices(context.Context, *connect.Request[v1.ListCustomPricesRequest]) (*connect.Response[v1.ListCustomPricesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) UpdateCustomPrice(context.Context, *connect.Request[v1.UpdateCustomPriceRequest]) (*connect.Response[v1.UpdateCustomPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) DeleteCustomPrice(context.Context, *connect.Request[v1.DeleteCustomPriceRequest]) (*connect.Response[v1.DeleteCustomPriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) GetEffectivePrice(context.Context, *connect.Request[v1.GetEffectivePriceRequest]) (*connect.Response[v1.GetEffectivePriceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice is not implemented")) +} + +func (UnimplementedModelPricingServiceHandler) ListPriceHistory(context.Context, *connect.Request[v1.ListPriceHistoryRequest]) (*connect.Response[v1.ListPriceHistoryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.gw.go new file mode 100644 index 0000000000..6386b48912 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/pricing.connect.gw.go @@ -0,0 +1,107 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/pricing.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// ModelPricingServiceGatewayServer implements the gRPC server API for the ModelPricingService +// service. +type ModelPricingServiceGatewayServer struct { + v1.UnimplementedModelPricingServiceServer + createStandardPrice connect_gateway.UnaryHandler[v1.CreateStandardPriceRequest, v1.CreateStandardPriceResponse] + getStandardPrice connect_gateway.UnaryHandler[v1.GetStandardPriceRequest, v1.GetStandardPriceResponse] + listStandardPrices connect_gateway.UnaryHandler[v1.ListStandardPricesRequest, v1.ListStandardPricesResponse] + updateStandardPrice connect_gateway.UnaryHandler[v1.UpdateStandardPriceRequest, v1.UpdateStandardPriceResponse] + deleteStandardPrice connect_gateway.UnaryHandler[v1.DeleteStandardPriceRequest, v1.DeleteStandardPriceResponse] + createCustomPrice connect_gateway.UnaryHandler[v1.CreateCustomPriceRequest, v1.CreateCustomPriceResponse] + getCustomPrice connect_gateway.UnaryHandler[v1.GetCustomPriceRequest, v1.GetCustomPriceResponse] + listCustomPrices connect_gateway.UnaryHandler[v1.ListCustomPricesRequest, v1.ListCustomPricesResponse] + updateCustomPrice connect_gateway.UnaryHandler[v1.UpdateCustomPriceRequest, v1.UpdateCustomPriceResponse] + deleteCustomPrice connect_gateway.UnaryHandler[v1.DeleteCustomPriceRequest, v1.DeleteCustomPriceResponse] + getEffectivePrice connect_gateway.UnaryHandler[v1.GetEffectivePriceRequest, v1.GetEffectivePriceResponse] + listPriceHistory connect_gateway.UnaryHandler[v1.ListPriceHistoryRequest, v1.ListPriceHistoryResponse] +} + +// NewModelPricingServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// ModelPricingService service. +func NewModelPricingServiceGatewayServer(svc ModelPricingServiceHandler, opts ...connect_gateway.HandlerOption) *ModelPricingServiceGatewayServer { + return &ModelPricingServiceGatewayServer{ + createStandardPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceCreateStandardPriceProcedure, svc.CreateStandardPrice, opts...), + getStandardPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceGetStandardPriceProcedure, svc.GetStandardPrice, opts...), + listStandardPrices: connect_gateway.NewUnaryHandler(ModelPricingServiceListStandardPricesProcedure, svc.ListStandardPrices, opts...), + updateStandardPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceUpdateStandardPriceProcedure, svc.UpdateStandardPrice, opts...), + deleteStandardPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceDeleteStandardPriceProcedure, svc.DeleteStandardPrice, opts...), + createCustomPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceCreateCustomPriceProcedure, svc.CreateCustomPrice, opts...), + getCustomPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceGetCustomPriceProcedure, svc.GetCustomPrice, opts...), + listCustomPrices: connect_gateway.NewUnaryHandler(ModelPricingServiceListCustomPricesProcedure, svc.ListCustomPrices, opts...), + updateCustomPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceUpdateCustomPriceProcedure, svc.UpdateCustomPrice, opts...), + deleteCustomPrice: connect_gateway.NewUnaryHandler(ModelPricingServiceDeleteCustomPriceProcedure, svc.DeleteCustomPrice, opts...), + getEffectivePrice: connect_gateway.NewUnaryHandler(ModelPricingServiceGetEffectivePriceProcedure, svc.GetEffectivePrice, opts...), + listPriceHistory: connect_gateway.NewUnaryHandler(ModelPricingServiceListPriceHistoryProcedure, svc.ListPriceHistory, opts...), + } +} + +func (s *ModelPricingServiceGatewayServer) CreateStandardPrice(ctx context.Context, req *v1.CreateStandardPriceRequest) (*v1.CreateStandardPriceResponse, error) { + return s.createStandardPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) GetStandardPrice(ctx context.Context, req *v1.GetStandardPriceRequest) (*v1.GetStandardPriceResponse, error) { + return s.getStandardPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) ListStandardPrices(ctx context.Context, req *v1.ListStandardPricesRequest) (*v1.ListStandardPricesResponse, error) { + return s.listStandardPrices(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) UpdateStandardPrice(ctx context.Context, req *v1.UpdateStandardPriceRequest) (*v1.UpdateStandardPriceResponse, error) { + return s.updateStandardPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) DeleteStandardPrice(ctx context.Context, req *v1.DeleteStandardPriceRequest) (*v1.DeleteStandardPriceResponse, error) { + return s.deleteStandardPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) CreateCustomPrice(ctx context.Context, req *v1.CreateCustomPriceRequest) (*v1.CreateCustomPriceResponse, error) { + return s.createCustomPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) GetCustomPrice(ctx context.Context, req *v1.GetCustomPriceRequest) (*v1.GetCustomPriceResponse, error) { + return s.getCustomPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) ListCustomPrices(ctx context.Context, req *v1.ListCustomPricesRequest) (*v1.ListCustomPricesResponse, error) { + return s.listCustomPrices(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) UpdateCustomPrice(ctx context.Context, req *v1.UpdateCustomPriceRequest) (*v1.UpdateCustomPriceResponse, error) { + return s.updateCustomPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) DeleteCustomPrice(ctx context.Context, req *v1.DeleteCustomPriceRequest) (*v1.DeleteCustomPriceResponse, error) { + return s.deleteCustomPrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) GetEffectivePrice(ctx context.Context, req *v1.GetEffectivePriceRequest) (*v1.GetEffectivePriceResponse, error) { + return s.getEffectivePrice(ctx, req) +} + +func (s *ModelPricingServiceGatewayServer) ListPriceHistory(ctx context.Context, req *v1.ListPriceHistoryRequest) (*v1.ListPriceHistoryResponse, error) { + return s.listPriceHistory(ctx, req) +} + +// RegisterModelPricingServiceHandlerGatewayServer registers the Connect handlers for the +// ModelPricingService "svc" to "mux". +func RegisterModelPricingServiceHandlerGatewayServer(mux *runtime.ServeMux, svc ModelPricingServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterModelPricingServiceHandlerServer(context.TODO(), mux, NewModelPricingServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.go new file mode 100644 index 0000000000..b1d948de02 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.go @@ -0,0 +1,283 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/provider_config.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // ProviderConfigServiceName is the fully-qualified name of the ProviderConfigService service. + ProviderConfigServiceName = "redpanda.api.aigateway.v1.ProviderConfigService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // ProviderConfigServiceCreateProviderConfigProcedure is the fully-qualified name of the + // ProviderConfigService's CreateProviderConfig RPC. + ProviderConfigServiceCreateProviderConfigProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/CreateProviderConfig" + // ProviderConfigServiceGetProviderConfigProcedure is the fully-qualified name of the + // ProviderConfigService's GetProviderConfig RPC. + ProviderConfigServiceGetProviderConfigProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/GetProviderConfig" + // ProviderConfigServiceListProviderConfigsProcedure is the fully-qualified name of the + // ProviderConfigService's ListProviderConfigs RPC. + ProviderConfigServiceListProviderConfigsProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/ListProviderConfigs" + // ProviderConfigServiceUpdateProviderConfigProcedure is the fully-qualified name of the + // ProviderConfigService's UpdateProviderConfig RPC. + ProviderConfigServiceUpdateProviderConfigProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/UpdateProviderConfig" + // ProviderConfigServiceDeleteProviderConfigProcedure is the fully-qualified name of the + // ProviderConfigService's DeleteProviderConfig RPC. + ProviderConfigServiceDeleteProviderConfigProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/DeleteProviderConfig" + // ProviderConfigServiceTestProviderConfigProcedure is the fully-qualified name of the + // ProviderConfigService's TestProviderConfig RPC. + ProviderConfigServiceTestProviderConfigProcedure = "/redpanda.api.aigateway.v1.ProviderConfigService/TestProviderConfig" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + providerConfigServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_provider_config_proto.Services().ByName("ProviderConfigService") + providerConfigServiceCreateProviderConfigMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("CreateProviderConfig") + providerConfigServiceGetProviderConfigMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("GetProviderConfig") + providerConfigServiceListProviderConfigsMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("ListProviderConfigs") + providerConfigServiceUpdateProviderConfigMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("UpdateProviderConfig") + providerConfigServiceDeleteProviderConfigMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("DeleteProviderConfig") + providerConfigServiceTestProviderConfigMethodDescriptor = providerConfigServiceServiceDescriptor.Methods().ByName("TestProviderConfig") +) + +// ProviderConfigServiceClient is a client for the redpanda.api.aigateway.v1.ProviderConfigService +// service. +type ProviderConfigServiceClient interface { + // Creates a new provider configuration. + // The configuration is encrypted at rest using the control plane encryption key. + CreateProviderConfig(context.Context, *connect.Request[v1.CreateProviderConfigRequest]) (*connect.Response[v1.CreateProviderConfigResponse], error) + // Gets a provider configuration by name. + // Note: Sensitive fields are masked in the response. + GetProviderConfig(context.Context, *connect.Request[v1.GetProviderConfigRequest]) (*connect.Response[v1.GetProviderConfigResponse], error) + // Lists provider configurations. + ListProviderConfigs(context.Context, *connect.Request[v1.ListProviderConfigsRequest]) (*connect.Response[v1.ListProviderConfigsResponse], error) + // Updates a provider configuration. + UpdateProviderConfig(context.Context, *connect.Request[v1.UpdateProviderConfigRequest]) (*connect.Response[v1.UpdateProviderConfigResponse], error) + // Deletes a provider configuration. + DeleteProviderConfig(context.Context, *connect.Request[v1.DeleteProviderConfigRequest]) (*connect.Response[v1.DeleteProviderConfigResponse], error) + // Tests a provider configuration by attempting to authenticate with the provider. + TestProviderConfig(context.Context, *connect.Request[v1.TestProviderConfigRequest]) (*connect.Response[v1.TestProviderConfigResponse], error) +} + +// NewProviderConfigServiceClient constructs a client for the +// redpanda.api.aigateway.v1.ProviderConfigService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewProviderConfigServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ProviderConfigServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &providerConfigServiceClient{ + createProviderConfig: connect.NewClient[v1.CreateProviderConfigRequest, v1.CreateProviderConfigResponse]( + httpClient, + baseURL+ProviderConfigServiceCreateProviderConfigProcedure, + connect.WithSchema(providerConfigServiceCreateProviderConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getProviderConfig: connect.NewClient[v1.GetProviderConfigRequest, v1.GetProviderConfigResponse]( + httpClient, + baseURL+ProviderConfigServiceGetProviderConfigProcedure, + connect.WithSchema(providerConfigServiceGetProviderConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listProviderConfigs: connect.NewClient[v1.ListProviderConfigsRequest, v1.ListProviderConfigsResponse]( + httpClient, + baseURL+ProviderConfigServiceListProviderConfigsProcedure, + connect.WithSchema(providerConfigServiceListProviderConfigsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateProviderConfig: connect.NewClient[v1.UpdateProviderConfigRequest, v1.UpdateProviderConfigResponse]( + httpClient, + baseURL+ProviderConfigServiceUpdateProviderConfigProcedure, + connect.WithSchema(providerConfigServiceUpdateProviderConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteProviderConfig: connect.NewClient[v1.DeleteProviderConfigRequest, v1.DeleteProviderConfigResponse]( + httpClient, + baseURL+ProviderConfigServiceDeleteProviderConfigProcedure, + connect.WithSchema(providerConfigServiceDeleteProviderConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + testProviderConfig: connect.NewClient[v1.TestProviderConfigRequest, v1.TestProviderConfigResponse]( + httpClient, + baseURL+ProviderConfigServiceTestProviderConfigProcedure, + connect.WithSchema(providerConfigServiceTestProviderConfigMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// providerConfigServiceClient implements ProviderConfigServiceClient. +type providerConfigServiceClient struct { + createProviderConfig *connect.Client[v1.CreateProviderConfigRequest, v1.CreateProviderConfigResponse] + getProviderConfig *connect.Client[v1.GetProviderConfigRequest, v1.GetProviderConfigResponse] + listProviderConfigs *connect.Client[v1.ListProviderConfigsRequest, v1.ListProviderConfigsResponse] + updateProviderConfig *connect.Client[v1.UpdateProviderConfigRequest, v1.UpdateProviderConfigResponse] + deleteProviderConfig *connect.Client[v1.DeleteProviderConfigRequest, v1.DeleteProviderConfigResponse] + testProviderConfig *connect.Client[v1.TestProviderConfigRequest, v1.TestProviderConfigResponse] +} + +// CreateProviderConfig calls redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig. +func (c *providerConfigServiceClient) CreateProviderConfig(ctx context.Context, req *connect.Request[v1.CreateProviderConfigRequest]) (*connect.Response[v1.CreateProviderConfigResponse], error) { + return c.createProviderConfig.CallUnary(ctx, req) +} + +// GetProviderConfig calls redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig. +func (c *providerConfigServiceClient) GetProviderConfig(ctx context.Context, req *connect.Request[v1.GetProviderConfigRequest]) (*connect.Response[v1.GetProviderConfigResponse], error) { + return c.getProviderConfig.CallUnary(ctx, req) +} + +// ListProviderConfigs calls redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs. +func (c *providerConfigServiceClient) ListProviderConfigs(ctx context.Context, req *connect.Request[v1.ListProviderConfigsRequest]) (*connect.Response[v1.ListProviderConfigsResponse], error) { + return c.listProviderConfigs.CallUnary(ctx, req) +} + +// UpdateProviderConfig calls redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig. +func (c *providerConfigServiceClient) UpdateProviderConfig(ctx context.Context, req *connect.Request[v1.UpdateProviderConfigRequest]) (*connect.Response[v1.UpdateProviderConfigResponse], error) { + return c.updateProviderConfig.CallUnary(ctx, req) +} + +// DeleteProviderConfig calls redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig. +func (c *providerConfigServiceClient) DeleteProviderConfig(ctx context.Context, req *connect.Request[v1.DeleteProviderConfigRequest]) (*connect.Response[v1.DeleteProviderConfigResponse], error) { + return c.deleteProviderConfig.CallUnary(ctx, req) +} + +// TestProviderConfig calls redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig. +func (c *providerConfigServiceClient) TestProviderConfig(ctx context.Context, req *connect.Request[v1.TestProviderConfigRequest]) (*connect.Response[v1.TestProviderConfigResponse], error) { + return c.testProviderConfig.CallUnary(ctx, req) +} + +// ProviderConfigServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.ProviderConfigService service. +type ProviderConfigServiceHandler interface { + // Creates a new provider configuration. + // The configuration is encrypted at rest using the control plane encryption key. + CreateProviderConfig(context.Context, *connect.Request[v1.CreateProviderConfigRequest]) (*connect.Response[v1.CreateProviderConfigResponse], error) + // Gets a provider configuration by name. + // Note: Sensitive fields are masked in the response. + GetProviderConfig(context.Context, *connect.Request[v1.GetProviderConfigRequest]) (*connect.Response[v1.GetProviderConfigResponse], error) + // Lists provider configurations. + ListProviderConfigs(context.Context, *connect.Request[v1.ListProviderConfigsRequest]) (*connect.Response[v1.ListProviderConfigsResponse], error) + // Updates a provider configuration. + UpdateProviderConfig(context.Context, *connect.Request[v1.UpdateProviderConfigRequest]) (*connect.Response[v1.UpdateProviderConfigResponse], error) + // Deletes a provider configuration. + DeleteProviderConfig(context.Context, *connect.Request[v1.DeleteProviderConfigRequest]) (*connect.Response[v1.DeleteProviderConfigResponse], error) + // Tests a provider configuration by attempting to authenticate with the provider. + TestProviderConfig(context.Context, *connect.Request[v1.TestProviderConfigRequest]) (*connect.Response[v1.TestProviderConfigResponse], error) +} + +// NewProviderConfigServiceHandler builds an HTTP handler from the service implementation. It +// returns the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewProviderConfigServiceHandler(svc ProviderConfigServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + providerConfigServiceCreateProviderConfigHandler := connect.NewUnaryHandler( + ProviderConfigServiceCreateProviderConfigProcedure, + svc.CreateProviderConfig, + connect.WithSchema(providerConfigServiceCreateProviderConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + providerConfigServiceGetProviderConfigHandler := connect.NewUnaryHandler( + ProviderConfigServiceGetProviderConfigProcedure, + svc.GetProviderConfig, + connect.WithSchema(providerConfigServiceGetProviderConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + providerConfigServiceListProviderConfigsHandler := connect.NewUnaryHandler( + ProviderConfigServiceListProviderConfigsProcedure, + svc.ListProviderConfigs, + connect.WithSchema(providerConfigServiceListProviderConfigsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + providerConfigServiceUpdateProviderConfigHandler := connect.NewUnaryHandler( + ProviderConfigServiceUpdateProviderConfigProcedure, + svc.UpdateProviderConfig, + connect.WithSchema(providerConfigServiceUpdateProviderConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + providerConfigServiceDeleteProviderConfigHandler := connect.NewUnaryHandler( + ProviderConfigServiceDeleteProviderConfigProcedure, + svc.DeleteProviderConfig, + connect.WithSchema(providerConfigServiceDeleteProviderConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + providerConfigServiceTestProviderConfigHandler := connect.NewUnaryHandler( + ProviderConfigServiceTestProviderConfigProcedure, + svc.TestProviderConfig, + connect.WithSchema(providerConfigServiceTestProviderConfigMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.ProviderConfigService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case ProviderConfigServiceCreateProviderConfigProcedure: + providerConfigServiceCreateProviderConfigHandler.ServeHTTP(w, r) + case ProviderConfigServiceGetProviderConfigProcedure: + providerConfigServiceGetProviderConfigHandler.ServeHTTP(w, r) + case ProviderConfigServiceListProviderConfigsProcedure: + providerConfigServiceListProviderConfigsHandler.ServeHTTP(w, r) + case ProviderConfigServiceUpdateProviderConfigProcedure: + providerConfigServiceUpdateProviderConfigHandler.ServeHTTP(w, r) + case ProviderConfigServiceDeleteProviderConfigProcedure: + providerConfigServiceDeleteProviderConfigHandler.ServeHTTP(w, r) + case ProviderConfigServiceTestProviderConfigProcedure: + providerConfigServiceTestProviderConfigHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedProviderConfigServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedProviderConfigServiceHandler struct{} + +func (UnimplementedProviderConfigServiceHandler) CreateProviderConfig(context.Context, *connect.Request[v1.CreateProviderConfigRequest]) (*connect.Response[v1.CreateProviderConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig is not implemented")) +} + +func (UnimplementedProviderConfigServiceHandler) GetProviderConfig(context.Context, *connect.Request[v1.GetProviderConfigRequest]) (*connect.Response[v1.GetProviderConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig is not implemented")) +} + +func (UnimplementedProviderConfigServiceHandler) ListProviderConfigs(context.Context, *connect.Request[v1.ListProviderConfigsRequest]) (*connect.Response[v1.ListProviderConfigsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs is not implemented")) +} + +func (UnimplementedProviderConfigServiceHandler) UpdateProviderConfig(context.Context, *connect.Request[v1.UpdateProviderConfigRequest]) (*connect.Response[v1.UpdateProviderConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig is not implemented")) +} + +func (UnimplementedProviderConfigServiceHandler) DeleteProviderConfig(context.Context, *connect.Request[v1.DeleteProviderConfigRequest]) (*connect.Response[v1.DeleteProviderConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig is not implemented")) +} + +func (UnimplementedProviderConfigServiceHandler) TestProviderConfig(context.Context, *connect.Request[v1.TestProviderConfigRequest]) (*connect.Response[v1.TestProviderConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.gw.go new file mode 100644 index 0000000000..7bda701c0c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/provider_config.connect.gw.go @@ -0,0 +1,71 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/provider_config.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// ProviderConfigServiceGatewayServer implements the gRPC server API for the ProviderConfigService +// service. +type ProviderConfigServiceGatewayServer struct { + v1.UnimplementedProviderConfigServiceServer + createProviderConfig connect_gateway.UnaryHandler[v1.CreateProviderConfigRequest, v1.CreateProviderConfigResponse] + getProviderConfig connect_gateway.UnaryHandler[v1.GetProviderConfigRequest, v1.GetProviderConfigResponse] + listProviderConfigs connect_gateway.UnaryHandler[v1.ListProviderConfigsRequest, v1.ListProviderConfigsResponse] + updateProviderConfig connect_gateway.UnaryHandler[v1.UpdateProviderConfigRequest, v1.UpdateProviderConfigResponse] + deleteProviderConfig connect_gateway.UnaryHandler[v1.DeleteProviderConfigRequest, v1.DeleteProviderConfigResponse] + testProviderConfig connect_gateway.UnaryHandler[v1.TestProviderConfigRequest, v1.TestProviderConfigResponse] +} + +// NewProviderConfigServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// ProviderConfigService service. +func NewProviderConfigServiceGatewayServer(svc ProviderConfigServiceHandler, opts ...connect_gateway.HandlerOption) *ProviderConfigServiceGatewayServer { + return &ProviderConfigServiceGatewayServer{ + createProviderConfig: connect_gateway.NewUnaryHandler(ProviderConfigServiceCreateProviderConfigProcedure, svc.CreateProviderConfig, opts...), + getProviderConfig: connect_gateway.NewUnaryHandler(ProviderConfigServiceGetProviderConfigProcedure, svc.GetProviderConfig, opts...), + listProviderConfigs: connect_gateway.NewUnaryHandler(ProviderConfigServiceListProviderConfigsProcedure, svc.ListProviderConfigs, opts...), + updateProviderConfig: connect_gateway.NewUnaryHandler(ProviderConfigServiceUpdateProviderConfigProcedure, svc.UpdateProviderConfig, opts...), + deleteProviderConfig: connect_gateway.NewUnaryHandler(ProviderConfigServiceDeleteProviderConfigProcedure, svc.DeleteProviderConfig, opts...), + testProviderConfig: connect_gateway.NewUnaryHandler(ProviderConfigServiceTestProviderConfigProcedure, svc.TestProviderConfig, opts...), + } +} + +func (s *ProviderConfigServiceGatewayServer) CreateProviderConfig(ctx context.Context, req *v1.CreateProviderConfigRequest) (*v1.CreateProviderConfigResponse, error) { + return s.createProviderConfig(ctx, req) +} + +func (s *ProviderConfigServiceGatewayServer) GetProviderConfig(ctx context.Context, req *v1.GetProviderConfigRequest) (*v1.GetProviderConfigResponse, error) { + return s.getProviderConfig(ctx, req) +} + +func (s *ProviderConfigServiceGatewayServer) ListProviderConfigs(ctx context.Context, req *v1.ListProviderConfigsRequest) (*v1.ListProviderConfigsResponse, error) { + return s.listProviderConfigs(ctx, req) +} + +func (s *ProviderConfigServiceGatewayServer) UpdateProviderConfig(ctx context.Context, req *v1.UpdateProviderConfigRequest) (*v1.UpdateProviderConfigResponse, error) { + return s.updateProviderConfig(ctx, req) +} + +func (s *ProviderConfigServiceGatewayServer) DeleteProviderConfig(ctx context.Context, req *v1.DeleteProviderConfigRequest) (*v1.DeleteProviderConfigResponse, error) { + return s.deleteProviderConfig(ctx, req) +} + +func (s *ProviderConfigServiceGatewayServer) TestProviderConfig(ctx context.Context, req *v1.TestProviderConfigRequest) (*v1.TestProviderConfigResponse, error) { + return s.testProviderConfig(ctx, req) +} + +// RegisterProviderConfigServiceHandlerGatewayServer registers the Connect handlers for the +// ProviderConfigService "svc" to "mux". +func RegisterProviderConfigServiceHandlerGatewayServer(mux *runtime.ServeMux, svc ProviderConfigServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterProviderConfigServiceHandlerServer(context.TODO(), mux, NewProviderConfigServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.go new file mode 100644 index 0000000000..0992b500d4 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.go @@ -0,0 +1,235 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/ratelimit.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // RateLimitServiceName is the fully-qualified name of the RateLimitService service. + RateLimitServiceName = "redpanda.api.aigateway.v1.RateLimitService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // RateLimitServiceCreateRateLimitProcedure is the fully-qualified name of the RateLimitService's + // CreateRateLimit RPC. + RateLimitServiceCreateRateLimitProcedure = "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit" + // RateLimitServiceGetRateLimitProcedure is the fully-qualified name of the RateLimitService's + // GetRateLimit RPC. + RateLimitServiceGetRateLimitProcedure = "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit" + // RateLimitServiceListRateLimitsProcedure is the fully-qualified name of the RateLimitService's + // ListRateLimits RPC. + RateLimitServiceListRateLimitsProcedure = "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits" + // RateLimitServiceUpdateRateLimitProcedure is the fully-qualified name of the RateLimitService's + // UpdateRateLimit RPC. + RateLimitServiceUpdateRateLimitProcedure = "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit" + // RateLimitServiceDeleteRateLimitProcedure is the fully-qualified name of the RateLimitService's + // DeleteRateLimit RPC. + RateLimitServiceDeleteRateLimitProcedure = "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + rateLimitServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_ratelimit_proto.Services().ByName("RateLimitService") + rateLimitServiceCreateRateLimitMethodDescriptor = rateLimitServiceServiceDescriptor.Methods().ByName("CreateRateLimit") + rateLimitServiceGetRateLimitMethodDescriptor = rateLimitServiceServiceDescriptor.Methods().ByName("GetRateLimit") + rateLimitServiceListRateLimitsMethodDescriptor = rateLimitServiceServiceDescriptor.Methods().ByName("ListRateLimits") + rateLimitServiceUpdateRateLimitMethodDescriptor = rateLimitServiceServiceDescriptor.Methods().ByName("UpdateRateLimit") + rateLimitServiceDeleteRateLimitMethodDescriptor = rateLimitServiceServiceDescriptor.Methods().ByName("DeleteRateLimit") +) + +// RateLimitServiceClient is a client for the redpanda.api.aigateway.v1.RateLimitService service. +type RateLimitServiceClient interface { + CreateRateLimit(context.Context, *connect.Request[v1.CreateRateLimitRequest]) (*connect.Response[v1.CreateRateLimitResponse], error) + GetRateLimit(context.Context, *connect.Request[v1.GetRateLimitRequest]) (*connect.Response[v1.GetRateLimitResponse], error) + ListRateLimits(context.Context, *connect.Request[v1.ListRateLimitsRequest]) (*connect.Response[v1.ListRateLimitsResponse], error) + UpdateRateLimit(context.Context, *connect.Request[v1.UpdateRateLimitRequest]) (*connect.Response[v1.UpdateRateLimitResponse], error) + DeleteRateLimit(context.Context, *connect.Request[v1.DeleteRateLimitRequest]) (*connect.Response[v1.DeleteRateLimitResponse], error) +} + +// NewRateLimitServiceClient constructs a client for the redpanda.api.aigateway.v1.RateLimitService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewRateLimitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) RateLimitServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &rateLimitServiceClient{ + createRateLimit: connect.NewClient[v1.CreateRateLimitRequest, v1.CreateRateLimitResponse]( + httpClient, + baseURL+RateLimitServiceCreateRateLimitProcedure, + connect.WithSchema(rateLimitServiceCreateRateLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getRateLimit: connect.NewClient[v1.GetRateLimitRequest, v1.GetRateLimitResponse]( + httpClient, + baseURL+RateLimitServiceGetRateLimitProcedure, + connect.WithSchema(rateLimitServiceGetRateLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listRateLimits: connect.NewClient[v1.ListRateLimitsRequest, v1.ListRateLimitsResponse]( + httpClient, + baseURL+RateLimitServiceListRateLimitsProcedure, + connect.WithSchema(rateLimitServiceListRateLimitsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateRateLimit: connect.NewClient[v1.UpdateRateLimitRequest, v1.UpdateRateLimitResponse]( + httpClient, + baseURL+RateLimitServiceUpdateRateLimitProcedure, + connect.WithSchema(rateLimitServiceUpdateRateLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteRateLimit: connect.NewClient[v1.DeleteRateLimitRequest, v1.DeleteRateLimitResponse]( + httpClient, + baseURL+RateLimitServiceDeleteRateLimitProcedure, + connect.WithSchema(rateLimitServiceDeleteRateLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// rateLimitServiceClient implements RateLimitServiceClient. +type rateLimitServiceClient struct { + createRateLimit *connect.Client[v1.CreateRateLimitRequest, v1.CreateRateLimitResponse] + getRateLimit *connect.Client[v1.GetRateLimitRequest, v1.GetRateLimitResponse] + listRateLimits *connect.Client[v1.ListRateLimitsRequest, v1.ListRateLimitsResponse] + updateRateLimit *connect.Client[v1.UpdateRateLimitRequest, v1.UpdateRateLimitResponse] + deleteRateLimit *connect.Client[v1.DeleteRateLimitRequest, v1.DeleteRateLimitResponse] +} + +// CreateRateLimit calls redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit. +func (c *rateLimitServiceClient) CreateRateLimit(ctx context.Context, req *connect.Request[v1.CreateRateLimitRequest]) (*connect.Response[v1.CreateRateLimitResponse], error) { + return c.createRateLimit.CallUnary(ctx, req) +} + +// GetRateLimit calls redpanda.api.aigateway.v1.RateLimitService.GetRateLimit. +func (c *rateLimitServiceClient) GetRateLimit(ctx context.Context, req *connect.Request[v1.GetRateLimitRequest]) (*connect.Response[v1.GetRateLimitResponse], error) { + return c.getRateLimit.CallUnary(ctx, req) +} + +// ListRateLimits calls redpanda.api.aigateway.v1.RateLimitService.ListRateLimits. +func (c *rateLimitServiceClient) ListRateLimits(ctx context.Context, req *connect.Request[v1.ListRateLimitsRequest]) (*connect.Response[v1.ListRateLimitsResponse], error) { + return c.listRateLimits.CallUnary(ctx, req) +} + +// UpdateRateLimit calls redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit. +func (c *rateLimitServiceClient) UpdateRateLimit(ctx context.Context, req *connect.Request[v1.UpdateRateLimitRequest]) (*connect.Response[v1.UpdateRateLimitResponse], error) { + return c.updateRateLimit.CallUnary(ctx, req) +} + +// DeleteRateLimit calls redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit. +func (c *rateLimitServiceClient) DeleteRateLimit(ctx context.Context, req *connect.Request[v1.DeleteRateLimitRequest]) (*connect.Response[v1.DeleteRateLimitResponse], error) { + return c.deleteRateLimit.CallUnary(ctx, req) +} + +// RateLimitServiceHandler is an implementation of the redpanda.api.aigateway.v1.RateLimitService +// service. +type RateLimitServiceHandler interface { + CreateRateLimit(context.Context, *connect.Request[v1.CreateRateLimitRequest]) (*connect.Response[v1.CreateRateLimitResponse], error) + GetRateLimit(context.Context, *connect.Request[v1.GetRateLimitRequest]) (*connect.Response[v1.GetRateLimitResponse], error) + ListRateLimits(context.Context, *connect.Request[v1.ListRateLimitsRequest]) (*connect.Response[v1.ListRateLimitsResponse], error) + UpdateRateLimit(context.Context, *connect.Request[v1.UpdateRateLimitRequest]) (*connect.Response[v1.UpdateRateLimitResponse], error) + DeleteRateLimit(context.Context, *connect.Request[v1.DeleteRateLimitRequest]) (*connect.Response[v1.DeleteRateLimitResponse], error) +} + +// NewRateLimitServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewRateLimitServiceHandler(svc RateLimitServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + rateLimitServiceCreateRateLimitHandler := connect.NewUnaryHandler( + RateLimitServiceCreateRateLimitProcedure, + svc.CreateRateLimit, + connect.WithSchema(rateLimitServiceCreateRateLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + rateLimitServiceGetRateLimitHandler := connect.NewUnaryHandler( + RateLimitServiceGetRateLimitProcedure, + svc.GetRateLimit, + connect.WithSchema(rateLimitServiceGetRateLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + rateLimitServiceListRateLimitsHandler := connect.NewUnaryHandler( + RateLimitServiceListRateLimitsProcedure, + svc.ListRateLimits, + connect.WithSchema(rateLimitServiceListRateLimitsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + rateLimitServiceUpdateRateLimitHandler := connect.NewUnaryHandler( + RateLimitServiceUpdateRateLimitProcedure, + svc.UpdateRateLimit, + connect.WithSchema(rateLimitServiceUpdateRateLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + rateLimitServiceDeleteRateLimitHandler := connect.NewUnaryHandler( + RateLimitServiceDeleteRateLimitProcedure, + svc.DeleteRateLimit, + connect.WithSchema(rateLimitServiceDeleteRateLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.RateLimitService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case RateLimitServiceCreateRateLimitProcedure: + rateLimitServiceCreateRateLimitHandler.ServeHTTP(w, r) + case RateLimitServiceGetRateLimitProcedure: + rateLimitServiceGetRateLimitHandler.ServeHTTP(w, r) + case RateLimitServiceListRateLimitsProcedure: + rateLimitServiceListRateLimitsHandler.ServeHTTP(w, r) + case RateLimitServiceUpdateRateLimitProcedure: + rateLimitServiceUpdateRateLimitHandler.ServeHTTP(w, r) + case RateLimitServiceDeleteRateLimitProcedure: + rateLimitServiceDeleteRateLimitHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedRateLimitServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedRateLimitServiceHandler struct{} + +func (UnimplementedRateLimitServiceHandler) CreateRateLimit(context.Context, *connect.Request[v1.CreateRateLimitRequest]) (*connect.Response[v1.CreateRateLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit is not implemented")) +} + +func (UnimplementedRateLimitServiceHandler) GetRateLimit(context.Context, *connect.Request[v1.GetRateLimitRequest]) (*connect.Response[v1.GetRateLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RateLimitService.GetRateLimit is not implemented")) +} + +func (UnimplementedRateLimitServiceHandler) ListRateLimits(context.Context, *connect.Request[v1.ListRateLimitsRequest]) (*connect.Response[v1.ListRateLimitsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RateLimitService.ListRateLimits is not implemented")) +} + +func (UnimplementedRateLimitServiceHandler) UpdateRateLimit(context.Context, *connect.Request[v1.UpdateRateLimitRequest]) (*connect.Response[v1.UpdateRateLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit is not implemented")) +} + +func (UnimplementedRateLimitServiceHandler) DeleteRateLimit(context.Context, *connect.Request[v1.DeleteRateLimitRequest]) (*connect.Response[v1.DeleteRateLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.gw.go new file mode 100644 index 0000000000..bfee56ae5c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/ratelimit.connect.gw.go @@ -0,0 +1,64 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/ratelimit.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// RateLimitServiceGatewayServer implements the gRPC server API for the RateLimitService service. +type RateLimitServiceGatewayServer struct { + v1.UnimplementedRateLimitServiceServer + createRateLimit connect_gateway.UnaryHandler[v1.CreateRateLimitRequest, v1.CreateRateLimitResponse] + getRateLimit connect_gateway.UnaryHandler[v1.GetRateLimitRequest, v1.GetRateLimitResponse] + listRateLimits connect_gateway.UnaryHandler[v1.ListRateLimitsRequest, v1.ListRateLimitsResponse] + updateRateLimit connect_gateway.UnaryHandler[v1.UpdateRateLimitRequest, v1.UpdateRateLimitResponse] + deleteRateLimit connect_gateway.UnaryHandler[v1.DeleteRateLimitRequest, v1.DeleteRateLimitResponse] +} + +// NewRateLimitServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// RateLimitService service. +func NewRateLimitServiceGatewayServer(svc RateLimitServiceHandler, opts ...connect_gateway.HandlerOption) *RateLimitServiceGatewayServer { + return &RateLimitServiceGatewayServer{ + createRateLimit: connect_gateway.NewUnaryHandler(RateLimitServiceCreateRateLimitProcedure, svc.CreateRateLimit, opts...), + getRateLimit: connect_gateway.NewUnaryHandler(RateLimitServiceGetRateLimitProcedure, svc.GetRateLimit, opts...), + listRateLimits: connect_gateway.NewUnaryHandler(RateLimitServiceListRateLimitsProcedure, svc.ListRateLimits, opts...), + updateRateLimit: connect_gateway.NewUnaryHandler(RateLimitServiceUpdateRateLimitProcedure, svc.UpdateRateLimit, opts...), + deleteRateLimit: connect_gateway.NewUnaryHandler(RateLimitServiceDeleteRateLimitProcedure, svc.DeleteRateLimit, opts...), + } +} + +func (s *RateLimitServiceGatewayServer) CreateRateLimit(ctx context.Context, req *v1.CreateRateLimitRequest) (*v1.CreateRateLimitResponse, error) { + return s.createRateLimit(ctx, req) +} + +func (s *RateLimitServiceGatewayServer) GetRateLimit(ctx context.Context, req *v1.GetRateLimitRequest) (*v1.GetRateLimitResponse, error) { + return s.getRateLimit(ctx, req) +} + +func (s *RateLimitServiceGatewayServer) ListRateLimits(ctx context.Context, req *v1.ListRateLimitsRequest) (*v1.ListRateLimitsResponse, error) { + return s.listRateLimits(ctx, req) +} + +func (s *RateLimitServiceGatewayServer) UpdateRateLimit(ctx context.Context, req *v1.UpdateRateLimitRequest) (*v1.UpdateRateLimitResponse, error) { + return s.updateRateLimit(ctx, req) +} + +func (s *RateLimitServiceGatewayServer) DeleteRateLimit(ctx context.Context, req *v1.DeleteRateLimitRequest) (*v1.DeleteRateLimitResponse, error) { + return s.deleteRateLimit(ctx, req) +} + +// RegisterRateLimitServiceHandlerGatewayServer registers the Connect handlers for the +// RateLimitService "svc" to "mux". +func RegisterRateLimitServiceHandlerGatewayServer(mux *runtime.ServeMux, svc RateLimitServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterRateLimitServiceHandlerServer(context.TODO(), mux, NewRateLimitServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.go new file mode 100644 index 0000000000..88362f3903 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.go @@ -0,0 +1,369 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/role.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // RoleServiceName is the fully-qualified name of the RoleService service. + RoleServiceName = "redpanda.api.aigateway.v1.RoleService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // RoleServiceCreateRoleProcedure is the fully-qualified name of the RoleService's CreateRole RPC. + RoleServiceCreateRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/CreateRole" + // RoleServiceGetRoleProcedure is the fully-qualified name of the RoleService's GetRole RPC. + RoleServiceGetRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/GetRole" + // RoleServiceListRolesProcedure is the fully-qualified name of the RoleService's ListRoles RPC. + RoleServiceListRolesProcedure = "/redpanda.api.aigateway.v1.RoleService/ListRoles" + // RoleServiceUpdateRoleProcedure is the fully-qualified name of the RoleService's UpdateRole RPC. + RoleServiceUpdateRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/UpdateRole" + // RoleServiceDeleteRoleProcedure is the fully-qualified name of the RoleService's DeleteRole RPC. + RoleServiceDeleteRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/DeleteRole" + // RoleServiceAssignTeamRoleProcedure is the fully-qualified name of the RoleService's + // AssignTeamRole RPC. + RoleServiceAssignTeamRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/AssignTeamRole" + // RoleServiceUnassignTeamRoleProcedure is the fully-qualified name of the RoleService's + // UnassignTeamRole RPC. + RoleServiceUnassignTeamRoleProcedure = "/redpanda.api.aigateway.v1.RoleService/UnassignTeamRole" + // RoleServiceListRoleTeamsProcedure is the fully-qualified name of the RoleService's ListRoleTeams + // RPC. + RoleServiceListRoleTeamsProcedure = "/redpanda.api.aigateway.v1.RoleService/ListRoleTeams" + // RoleServiceListTeamRolesProcedure is the fully-qualified name of the RoleService's ListTeamRoles + // RPC. + RoleServiceListTeamRolesProcedure = "/redpanda.api.aigateway.v1.RoleService/ListTeamRoles" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + roleServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_role_proto.Services().ByName("RoleService") + roleServiceCreateRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("CreateRole") + roleServiceGetRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("GetRole") + roleServiceListRolesMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("ListRoles") + roleServiceUpdateRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("UpdateRole") + roleServiceDeleteRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("DeleteRole") + roleServiceAssignTeamRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("AssignTeamRole") + roleServiceUnassignTeamRoleMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("UnassignTeamRole") + roleServiceListRoleTeamsMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("ListRoleTeams") + roleServiceListTeamRolesMethodDescriptor = roleServiceServiceDescriptor.Methods().ByName("ListTeamRoles") +) + +// RoleServiceClient is a client for the redpanda.api.aigateway.v1.RoleService service. +type RoleServiceClient interface { + // Creates a new role within an organization. + CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) + // Gets a role by name. + GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) + // Lists roles within an organization. + ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) + // Updates a role. + UpdateRole(context.Context, *connect.Request[v1.UpdateRoleRequest]) (*connect.Response[v1.UpdateRoleResponse], error) + // Deletes a role. + DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) + // Assigns a role to a team. + // Implements Cedar pattern: Team in Role + AssignTeamRole(context.Context, *connect.Request[v1.AssignTeamRoleRequest]) (*connect.Response[v1.AssignTeamRoleResponse], error) + // Unassigns a role from a team. + UnassignTeamRole(context.Context, *connect.Request[v1.UnassignTeamRoleRequest]) (*connect.Response[v1.UnassignTeamRoleResponse], error) + // Lists teams assigned to a role. + ListRoleTeams(context.Context, *connect.Request[v1.ListRoleTeamsRequest]) (*connect.Response[v1.ListRoleTeamsResponse], error) + // Lists roles assigned to a team. + ListTeamRoles(context.Context, *connect.Request[v1.ListTeamRolesRequest]) (*connect.Response[v1.ListTeamRolesResponse], error) +} + +// NewRoleServiceClient constructs a client for the redpanda.api.aigateway.v1.RoleService service. +// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped +// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewRoleServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) RoleServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &roleServiceClient{ + createRole: connect.NewClient[v1.CreateRoleRequest, v1.CreateRoleResponse]( + httpClient, + baseURL+RoleServiceCreateRoleProcedure, + connect.WithSchema(roleServiceCreateRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getRole: connect.NewClient[v1.GetRoleRequest, v1.GetRoleResponse]( + httpClient, + baseURL+RoleServiceGetRoleProcedure, + connect.WithSchema(roleServiceGetRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listRoles: connect.NewClient[v1.ListRolesRequest, v1.ListRolesResponse]( + httpClient, + baseURL+RoleServiceListRolesProcedure, + connect.WithSchema(roleServiceListRolesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateRole: connect.NewClient[v1.UpdateRoleRequest, v1.UpdateRoleResponse]( + httpClient, + baseURL+RoleServiceUpdateRoleProcedure, + connect.WithSchema(roleServiceUpdateRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteRole: connect.NewClient[v1.DeleteRoleRequest, v1.DeleteRoleResponse]( + httpClient, + baseURL+RoleServiceDeleteRoleProcedure, + connect.WithSchema(roleServiceDeleteRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + assignTeamRole: connect.NewClient[v1.AssignTeamRoleRequest, v1.AssignTeamRoleResponse]( + httpClient, + baseURL+RoleServiceAssignTeamRoleProcedure, + connect.WithSchema(roleServiceAssignTeamRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + unassignTeamRole: connect.NewClient[v1.UnassignTeamRoleRequest, v1.UnassignTeamRoleResponse]( + httpClient, + baseURL+RoleServiceUnassignTeamRoleProcedure, + connect.WithSchema(roleServiceUnassignTeamRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listRoleTeams: connect.NewClient[v1.ListRoleTeamsRequest, v1.ListRoleTeamsResponse]( + httpClient, + baseURL+RoleServiceListRoleTeamsProcedure, + connect.WithSchema(roleServiceListRoleTeamsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listTeamRoles: connect.NewClient[v1.ListTeamRolesRequest, v1.ListTeamRolesResponse]( + httpClient, + baseURL+RoleServiceListTeamRolesProcedure, + connect.WithSchema(roleServiceListTeamRolesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// roleServiceClient implements RoleServiceClient. +type roleServiceClient struct { + createRole *connect.Client[v1.CreateRoleRequest, v1.CreateRoleResponse] + getRole *connect.Client[v1.GetRoleRequest, v1.GetRoleResponse] + listRoles *connect.Client[v1.ListRolesRequest, v1.ListRolesResponse] + updateRole *connect.Client[v1.UpdateRoleRequest, v1.UpdateRoleResponse] + deleteRole *connect.Client[v1.DeleteRoleRequest, v1.DeleteRoleResponse] + assignTeamRole *connect.Client[v1.AssignTeamRoleRequest, v1.AssignTeamRoleResponse] + unassignTeamRole *connect.Client[v1.UnassignTeamRoleRequest, v1.UnassignTeamRoleResponse] + listRoleTeams *connect.Client[v1.ListRoleTeamsRequest, v1.ListRoleTeamsResponse] + listTeamRoles *connect.Client[v1.ListTeamRolesRequest, v1.ListTeamRolesResponse] +} + +// CreateRole calls redpanda.api.aigateway.v1.RoleService.CreateRole. +func (c *roleServiceClient) CreateRole(ctx context.Context, req *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) { + return c.createRole.CallUnary(ctx, req) +} + +// GetRole calls redpanda.api.aigateway.v1.RoleService.GetRole. +func (c *roleServiceClient) GetRole(ctx context.Context, req *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) { + return c.getRole.CallUnary(ctx, req) +} + +// ListRoles calls redpanda.api.aigateway.v1.RoleService.ListRoles. +func (c *roleServiceClient) ListRoles(ctx context.Context, req *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) { + return c.listRoles.CallUnary(ctx, req) +} + +// UpdateRole calls redpanda.api.aigateway.v1.RoleService.UpdateRole. +func (c *roleServiceClient) UpdateRole(ctx context.Context, req *connect.Request[v1.UpdateRoleRequest]) (*connect.Response[v1.UpdateRoleResponse], error) { + return c.updateRole.CallUnary(ctx, req) +} + +// DeleteRole calls redpanda.api.aigateway.v1.RoleService.DeleteRole. +func (c *roleServiceClient) DeleteRole(ctx context.Context, req *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) { + return c.deleteRole.CallUnary(ctx, req) +} + +// AssignTeamRole calls redpanda.api.aigateway.v1.RoleService.AssignTeamRole. +func (c *roleServiceClient) AssignTeamRole(ctx context.Context, req *connect.Request[v1.AssignTeamRoleRequest]) (*connect.Response[v1.AssignTeamRoleResponse], error) { + return c.assignTeamRole.CallUnary(ctx, req) +} + +// UnassignTeamRole calls redpanda.api.aigateway.v1.RoleService.UnassignTeamRole. +func (c *roleServiceClient) UnassignTeamRole(ctx context.Context, req *connect.Request[v1.UnassignTeamRoleRequest]) (*connect.Response[v1.UnassignTeamRoleResponse], error) { + return c.unassignTeamRole.CallUnary(ctx, req) +} + +// ListRoleTeams calls redpanda.api.aigateway.v1.RoleService.ListRoleTeams. +func (c *roleServiceClient) ListRoleTeams(ctx context.Context, req *connect.Request[v1.ListRoleTeamsRequest]) (*connect.Response[v1.ListRoleTeamsResponse], error) { + return c.listRoleTeams.CallUnary(ctx, req) +} + +// ListTeamRoles calls redpanda.api.aigateway.v1.RoleService.ListTeamRoles. +func (c *roleServiceClient) ListTeamRoles(ctx context.Context, req *connect.Request[v1.ListTeamRolesRequest]) (*connect.Response[v1.ListTeamRolesResponse], error) { + return c.listTeamRoles.CallUnary(ctx, req) +} + +// RoleServiceHandler is an implementation of the redpanda.api.aigateway.v1.RoleService service. +type RoleServiceHandler interface { + // Creates a new role within an organization. + CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) + // Gets a role by name. + GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) + // Lists roles within an organization. + ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) + // Updates a role. + UpdateRole(context.Context, *connect.Request[v1.UpdateRoleRequest]) (*connect.Response[v1.UpdateRoleResponse], error) + // Deletes a role. + DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) + // Assigns a role to a team. + // Implements Cedar pattern: Team in Role + AssignTeamRole(context.Context, *connect.Request[v1.AssignTeamRoleRequest]) (*connect.Response[v1.AssignTeamRoleResponse], error) + // Unassigns a role from a team. + UnassignTeamRole(context.Context, *connect.Request[v1.UnassignTeamRoleRequest]) (*connect.Response[v1.UnassignTeamRoleResponse], error) + // Lists teams assigned to a role. + ListRoleTeams(context.Context, *connect.Request[v1.ListRoleTeamsRequest]) (*connect.Response[v1.ListRoleTeamsResponse], error) + // Lists roles assigned to a team. + ListTeamRoles(context.Context, *connect.Request[v1.ListTeamRolesRequest]) (*connect.Response[v1.ListTeamRolesResponse], error) +} + +// NewRoleServiceHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewRoleServiceHandler(svc RoleServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + roleServiceCreateRoleHandler := connect.NewUnaryHandler( + RoleServiceCreateRoleProcedure, + svc.CreateRole, + connect.WithSchema(roleServiceCreateRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceGetRoleHandler := connect.NewUnaryHandler( + RoleServiceGetRoleProcedure, + svc.GetRole, + connect.WithSchema(roleServiceGetRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceListRolesHandler := connect.NewUnaryHandler( + RoleServiceListRolesProcedure, + svc.ListRoles, + connect.WithSchema(roleServiceListRolesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceUpdateRoleHandler := connect.NewUnaryHandler( + RoleServiceUpdateRoleProcedure, + svc.UpdateRole, + connect.WithSchema(roleServiceUpdateRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceDeleteRoleHandler := connect.NewUnaryHandler( + RoleServiceDeleteRoleProcedure, + svc.DeleteRole, + connect.WithSchema(roleServiceDeleteRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceAssignTeamRoleHandler := connect.NewUnaryHandler( + RoleServiceAssignTeamRoleProcedure, + svc.AssignTeamRole, + connect.WithSchema(roleServiceAssignTeamRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceUnassignTeamRoleHandler := connect.NewUnaryHandler( + RoleServiceUnassignTeamRoleProcedure, + svc.UnassignTeamRole, + connect.WithSchema(roleServiceUnassignTeamRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceListRoleTeamsHandler := connect.NewUnaryHandler( + RoleServiceListRoleTeamsProcedure, + svc.ListRoleTeams, + connect.WithSchema(roleServiceListRoleTeamsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + roleServiceListTeamRolesHandler := connect.NewUnaryHandler( + RoleServiceListTeamRolesProcedure, + svc.ListTeamRoles, + connect.WithSchema(roleServiceListTeamRolesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.RoleService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case RoleServiceCreateRoleProcedure: + roleServiceCreateRoleHandler.ServeHTTP(w, r) + case RoleServiceGetRoleProcedure: + roleServiceGetRoleHandler.ServeHTTP(w, r) + case RoleServiceListRolesProcedure: + roleServiceListRolesHandler.ServeHTTP(w, r) + case RoleServiceUpdateRoleProcedure: + roleServiceUpdateRoleHandler.ServeHTTP(w, r) + case RoleServiceDeleteRoleProcedure: + roleServiceDeleteRoleHandler.ServeHTTP(w, r) + case RoleServiceAssignTeamRoleProcedure: + roleServiceAssignTeamRoleHandler.ServeHTTP(w, r) + case RoleServiceUnassignTeamRoleProcedure: + roleServiceUnassignTeamRoleHandler.ServeHTTP(w, r) + case RoleServiceListRoleTeamsProcedure: + roleServiceListRoleTeamsHandler.ServeHTTP(w, r) + case RoleServiceListTeamRolesProcedure: + roleServiceListTeamRolesHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedRoleServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedRoleServiceHandler struct{} + +func (UnimplementedRoleServiceHandler) CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.CreateRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.GetRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.ListRoles is not implemented")) +} + +func (UnimplementedRoleServiceHandler) UpdateRole(context.Context, *connect.Request[v1.UpdateRoleRequest]) (*connect.Response[v1.UpdateRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.UpdateRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.DeleteRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) AssignTeamRole(context.Context, *connect.Request[v1.AssignTeamRoleRequest]) (*connect.Response[v1.AssignTeamRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.AssignTeamRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) UnassignTeamRole(context.Context, *connect.Request[v1.UnassignTeamRoleRequest]) (*connect.Response[v1.UnassignTeamRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.UnassignTeamRole is not implemented")) +} + +func (UnimplementedRoleServiceHandler) ListRoleTeams(context.Context, *connect.Request[v1.ListRoleTeamsRequest]) (*connect.Response[v1.ListRoleTeamsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.ListRoleTeams is not implemented")) +} + +func (UnimplementedRoleServiceHandler) ListTeamRoles(context.Context, *connect.Request[v1.ListTeamRolesRequest]) (*connect.Response[v1.ListTeamRolesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoleService.ListTeamRoles is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.gw.go new file mode 100644 index 0000000000..e296481d3e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/role.connect.gw.go @@ -0,0 +1,87 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/role.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// RoleServiceGatewayServer implements the gRPC server API for the RoleService service. +type RoleServiceGatewayServer struct { + v1.UnimplementedRoleServiceServer + createRole connect_gateway.UnaryHandler[v1.CreateRoleRequest, v1.CreateRoleResponse] + getRole connect_gateway.UnaryHandler[v1.GetRoleRequest, v1.GetRoleResponse] + listRoles connect_gateway.UnaryHandler[v1.ListRolesRequest, v1.ListRolesResponse] + updateRole connect_gateway.UnaryHandler[v1.UpdateRoleRequest, v1.UpdateRoleResponse] + deleteRole connect_gateway.UnaryHandler[v1.DeleteRoleRequest, v1.DeleteRoleResponse] + assignTeamRole connect_gateway.UnaryHandler[v1.AssignTeamRoleRequest, v1.AssignTeamRoleResponse] + unassignTeamRole connect_gateway.UnaryHandler[v1.UnassignTeamRoleRequest, v1.UnassignTeamRoleResponse] + listRoleTeams connect_gateway.UnaryHandler[v1.ListRoleTeamsRequest, v1.ListRoleTeamsResponse] + listTeamRoles connect_gateway.UnaryHandler[v1.ListTeamRolesRequest, v1.ListTeamRolesResponse] +} + +// NewRoleServiceGatewayServer constructs a Connect-Gateway gRPC server for the RoleService service. +func NewRoleServiceGatewayServer(svc RoleServiceHandler, opts ...connect_gateway.HandlerOption) *RoleServiceGatewayServer { + return &RoleServiceGatewayServer{ + createRole: connect_gateway.NewUnaryHandler(RoleServiceCreateRoleProcedure, svc.CreateRole, opts...), + getRole: connect_gateway.NewUnaryHandler(RoleServiceGetRoleProcedure, svc.GetRole, opts...), + listRoles: connect_gateway.NewUnaryHandler(RoleServiceListRolesProcedure, svc.ListRoles, opts...), + updateRole: connect_gateway.NewUnaryHandler(RoleServiceUpdateRoleProcedure, svc.UpdateRole, opts...), + deleteRole: connect_gateway.NewUnaryHandler(RoleServiceDeleteRoleProcedure, svc.DeleteRole, opts...), + assignTeamRole: connect_gateway.NewUnaryHandler(RoleServiceAssignTeamRoleProcedure, svc.AssignTeamRole, opts...), + unassignTeamRole: connect_gateway.NewUnaryHandler(RoleServiceUnassignTeamRoleProcedure, svc.UnassignTeamRole, opts...), + listRoleTeams: connect_gateway.NewUnaryHandler(RoleServiceListRoleTeamsProcedure, svc.ListRoleTeams, opts...), + listTeamRoles: connect_gateway.NewUnaryHandler(RoleServiceListTeamRolesProcedure, svc.ListTeamRoles, opts...), + } +} + +func (s *RoleServiceGatewayServer) CreateRole(ctx context.Context, req *v1.CreateRoleRequest) (*v1.CreateRoleResponse, error) { + return s.createRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) GetRole(ctx context.Context, req *v1.GetRoleRequest) (*v1.GetRoleResponse, error) { + return s.getRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) ListRoles(ctx context.Context, req *v1.ListRolesRequest) (*v1.ListRolesResponse, error) { + return s.listRoles(ctx, req) +} + +func (s *RoleServiceGatewayServer) UpdateRole(ctx context.Context, req *v1.UpdateRoleRequest) (*v1.UpdateRoleResponse, error) { + return s.updateRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) DeleteRole(ctx context.Context, req *v1.DeleteRoleRequest) (*v1.DeleteRoleResponse, error) { + return s.deleteRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) AssignTeamRole(ctx context.Context, req *v1.AssignTeamRoleRequest) (*v1.AssignTeamRoleResponse, error) { + return s.assignTeamRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) UnassignTeamRole(ctx context.Context, req *v1.UnassignTeamRoleRequest) (*v1.UnassignTeamRoleResponse, error) { + return s.unassignTeamRole(ctx, req) +} + +func (s *RoleServiceGatewayServer) ListRoleTeams(ctx context.Context, req *v1.ListRoleTeamsRequest) (*v1.ListRoleTeamsResponse, error) { + return s.listRoleTeams(ctx, req) +} + +func (s *RoleServiceGatewayServer) ListTeamRoles(ctx context.Context, req *v1.ListTeamRolesRequest) (*v1.ListTeamRolesResponse, error) { + return s.listTeamRoles(ctx, req) +} + +// RegisterRoleServiceHandlerGatewayServer registers the Connect handlers for the RoleService "svc" +// to "mux". +func RegisterRoleServiceHandlerGatewayServer(mux *runtime.ServeMux, svc RoleServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterRoleServiceHandlerServer(context.TODO(), mux, NewRoleServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.go new file mode 100644 index 0000000000..2a06004ddd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.go @@ -0,0 +1,235 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/routing.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // RoutingServiceName is the fully-qualified name of the RoutingService service. + RoutingServiceName = "redpanda.api.aigateway.v1.RoutingService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // RoutingServiceCreateRoutingRuleProcedure is the fully-qualified name of the RoutingService's + // CreateRoutingRule RPC. + RoutingServiceCreateRoutingRuleProcedure = "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule" + // RoutingServiceGetRoutingRuleProcedure is the fully-qualified name of the RoutingService's + // GetRoutingRule RPC. + RoutingServiceGetRoutingRuleProcedure = "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule" + // RoutingServiceListRoutingRulesProcedure is the fully-qualified name of the RoutingService's + // ListRoutingRules RPC. + RoutingServiceListRoutingRulesProcedure = "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules" + // RoutingServiceUpdateRoutingRuleProcedure is the fully-qualified name of the RoutingService's + // UpdateRoutingRule RPC. + RoutingServiceUpdateRoutingRuleProcedure = "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule" + // RoutingServiceDeleteRoutingRuleProcedure is the fully-qualified name of the RoutingService's + // DeleteRoutingRule RPC. + RoutingServiceDeleteRoutingRuleProcedure = "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + routingServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_routing_proto.Services().ByName("RoutingService") + routingServiceCreateRoutingRuleMethodDescriptor = routingServiceServiceDescriptor.Methods().ByName("CreateRoutingRule") + routingServiceGetRoutingRuleMethodDescriptor = routingServiceServiceDescriptor.Methods().ByName("GetRoutingRule") + routingServiceListRoutingRulesMethodDescriptor = routingServiceServiceDescriptor.Methods().ByName("ListRoutingRules") + routingServiceUpdateRoutingRuleMethodDescriptor = routingServiceServiceDescriptor.Methods().ByName("UpdateRoutingRule") + routingServiceDeleteRoutingRuleMethodDescriptor = routingServiceServiceDescriptor.Methods().ByName("DeleteRoutingRule") +) + +// RoutingServiceClient is a client for the redpanda.api.aigateway.v1.RoutingService service. +type RoutingServiceClient interface { + CreateRoutingRule(context.Context, *connect.Request[v1.CreateRoutingRuleRequest]) (*connect.Response[v1.CreateRoutingRuleResponse], error) + GetRoutingRule(context.Context, *connect.Request[v1.GetRoutingRuleRequest]) (*connect.Response[v1.GetRoutingRuleResponse], error) + ListRoutingRules(context.Context, *connect.Request[v1.ListRoutingRulesRequest]) (*connect.Response[v1.ListRoutingRulesResponse], error) + UpdateRoutingRule(context.Context, *connect.Request[v1.UpdateRoutingRuleRequest]) (*connect.Response[v1.UpdateRoutingRuleResponse], error) + DeleteRoutingRule(context.Context, *connect.Request[v1.DeleteRoutingRuleRequest]) (*connect.Response[v1.DeleteRoutingRuleResponse], error) +} + +// NewRoutingServiceClient constructs a client for the redpanda.api.aigateway.v1.RoutingService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewRoutingServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) RoutingServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &routingServiceClient{ + createRoutingRule: connect.NewClient[v1.CreateRoutingRuleRequest, v1.CreateRoutingRuleResponse]( + httpClient, + baseURL+RoutingServiceCreateRoutingRuleProcedure, + connect.WithSchema(routingServiceCreateRoutingRuleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getRoutingRule: connect.NewClient[v1.GetRoutingRuleRequest, v1.GetRoutingRuleResponse]( + httpClient, + baseURL+RoutingServiceGetRoutingRuleProcedure, + connect.WithSchema(routingServiceGetRoutingRuleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listRoutingRules: connect.NewClient[v1.ListRoutingRulesRequest, v1.ListRoutingRulesResponse]( + httpClient, + baseURL+RoutingServiceListRoutingRulesProcedure, + connect.WithSchema(routingServiceListRoutingRulesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateRoutingRule: connect.NewClient[v1.UpdateRoutingRuleRequest, v1.UpdateRoutingRuleResponse]( + httpClient, + baseURL+RoutingServiceUpdateRoutingRuleProcedure, + connect.WithSchema(routingServiceUpdateRoutingRuleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteRoutingRule: connect.NewClient[v1.DeleteRoutingRuleRequest, v1.DeleteRoutingRuleResponse]( + httpClient, + baseURL+RoutingServiceDeleteRoutingRuleProcedure, + connect.WithSchema(routingServiceDeleteRoutingRuleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// routingServiceClient implements RoutingServiceClient. +type routingServiceClient struct { + createRoutingRule *connect.Client[v1.CreateRoutingRuleRequest, v1.CreateRoutingRuleResponse] + getRoutingRule *connect.Client[v1.GetRoutingRuleRequest, v1.GetRoutingRuleResponse] + listRoutingRules *connect.Client[v1.ListRoutingRulesRequest, v1.ListRoutingRulesResponse] + updateRoutingRule *connect.Client[v1.UpdateRoutingRuleRequest, v1.UpdateRoutingRuleResponse] + deleteRoutingRule *connect.Client[v1.DeleteRoutingRuleRequest, v1.DeleteRoutingRuleResponse] +} + +// CreateRoutingRule calls redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule. +func (c *routingServiceClient) CreateRoutingRule(ctx context.Context, req *connect.Request[v1.CreateRoutingRuleRequest]) (*connect.Response[v1.CreateRoutingRuleResponse], error) { + return c.createRoutingRule.CallUnary(ctx, req) +} + +// GetRoutingRule calls redpanda.api.aigateway.v1.RoutingService.GetRoutingRule. +func (c *routingServiceClient) GetRoutingRule(ctx context.Context, req *connect.Request[v1.GetRoutingRuleRequest]) (*connect.Response[v1.GetRoutingRuleResponse], error) { + return c.getRoutingRule.CallUnary(ctx, req) +} + +// ListRoutingRules calls redpanda.api.aigateway.v1.RoutingService.ListRoutingRules. +func (c *routingServiceClient) ListRoutingRules(ctx context.Context, req *connect.Request[v1.ListRoutingRulesRequest]) (*connect.Response[v1.ListRoutingRulesResponse], error) { + return c.listRoutingRules.CallUnary(ctx, req) +} + +// UpdateRoutingRule calls redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule. +func (c *routingServiceClient) UpdateRoutingRule(ctx context.Context, req *connect.Request[v1.UpdateRoutingRuleRequest]) (*connect.Response[v1.UpdateRoutingRuleResponse], error) { + return c.updateRoutingRule.CallUnary(ctx, req) +} + +// DeleteRoutingRule calls redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule. +func (c *routingServiceClient) DeleteRoutingRule(ctx context.Context, req *connect.Request[v1.DeleteRoutingRuleRequest]) (*connect.Response[v1.DeleteRoutingRuleResponse], error) { + return c.deleteRoutingRule.CallUnary(ctx, req) +} + +// RoutingServiceHandler is an implementation of the redpanda.api.aigateway.v1.RoutingService +// service. +type RoutingServiceHandler interface { + CreateRoutingRule(context.Context, *connect.Request[v1.CreateRoutingRuleRequest]) (*connect.Response[v1.CreateRoutingRuleResponse], error) + GetRoutingRule(context.Context, *connect.Request[v1.GetRoutingRuleRequest]) (*connect.Response[v1.GetRoutingRuleResponse], error) + ListRoutingRules(context.Context, *connect.Request[v1.ListRoutingRulesRequest]) (*connect.Response[v1.ListRoutingRulesResponse], error) + UpdateRoutingRule(context.Context, *connect.Request[v1.UpdateRoutingRuleRequest]) (*connect.Response[v1.UpdateRoutingRuleResponse], error) + DeleteRoutingRule(context.Context, *connect.Request[v1.DeleteRoutingRuleRequest]) (*connect.Response[v1.DeleteRoutingRuleResponse], error) +} + +// NewRoutingServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewRoutingServiceHandler(svc RoutingServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + routingServiceCreateRoutingRuleHandler := connect.NewUnaryHandler( + RoutingServiceCreateRoutingRuleProcedure, + svc.CreateRoutingRule, + connect.WithSchema(routingServiceCreateRoutingRuleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + routingServiceGetRoutingRuleHandler := connect.NewUnaryHandler( + RoutingServiceGetRoutingRuleProcedure, + svc.GetRoutingRule, + connect.WithSchema(routingServiceGetRoutingRuleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + routingServiceListRoutingRulesHandler := connect.NewUnaryHandler( + RoutingServiceListRoutingRulesProcedure, + svc.ListRoutingRules, + connect.WithSchema(routingServiceListRoutingRulesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + routingServiceUpdateRoutingRuleHandler := connect.NewUnaryHandler( + RoutingServiceUpdateRoutingRuleProcedure, + svc.UpdateRoutingRule, + connect.WithSchema(routingServiceUpdateRoutingRuleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + routingServiceDeleteRoutingRuleHandler := connect.NewUnaryHandler( + RoutingServiceDeleteRoutingRuleProcedure, + svc.DeleteRoutingRule, + connect.WithSchema(routingServiceDeleteRoutingRuleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.RoutingService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case RoutingServiceCreateRoutingRuleProcedure: + routingServiceCreateRoutingRuleHandler.ServeHTTP(w, r) + case RoutingServiceGetRoutingRuleProcedure: + routingServiceGetRoutingRuleHandler.ServeHTTP(w, r) + case RoutingServiceListRoutingRulesProcedure: + routingServiceListRoutingRulesHandler.ServeHTTP(w, r) + case RoutingServiceUpdateRoutingRuleProcedure: + routingServiceUpdateRoutingRuleHandler.ServeHTTP(w, r) + case RoutingServiceDeleteRoutingRuleProcedure: + routingServiceDeleteRoutingRuleHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedRoutingServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedRoutingServiceHandler struct{} + +func (UnimplementedRoutingServiceHandler) CreateRoutingRule(context.Context, *connect.Request[v1.CreateRoutingRuleRequest]) (*connect.Response[v1.CreateRoutingRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule is not implemented")) +} + +func (UnimplementedRoutingServiceHandler) GetRoutingRule(context.Context, *connect.Request[v1.GetRoutingRuleRequest]) (*connect.Response[v1.GetRoutingRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoutingService.GetRoutingRule is not implemented")) +} + +func (UnimplementedRoutingServiceHandler) ListRoutingRules(context.Context, *connect.Request[v1.ListRoutingRulesRequest]) (*connect.Response[v1.ListRoutingRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoutingService.ListRoutingRules is not implemented")) +} + +func (UnimplementedRoutingServiceHandler) UpdateRoutingRule(context.Context, *connect.Request[v1.UpdateRoutingRuleRequest]) (*connect.Response[v1.UpdateRoutingRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule is not implemented")) +} + +func (UnimplementedRoutingServiceHandler) DeleteRoutingRule(context.Context, *connect.Request[v1.DeleteRoutingRuleRequest]) (*connect.Response[v1.DeleteRoutingRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.gw.go new file mode 100644 index 0000000000..2f57640430 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/routing.connect.gw.go @@ -0,0 +1,64 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/routing.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// RoutingServiceGatewayServer implements the gRPC server API for the RoutingService service. +type RoutingServiceGatewayServer struct { + v1.UnimplementedRoutingServiceServer + createRoutingRule connect_gateway.UnaryHandler[v1.CreateRoutingRuleRequest, v1.CreateRoutingRuleResponse] + getRoutingRule connect_gateway.UnaryHandler[v1.GetRoutingRuleRequest, v1.GetRoutingRuleResponse] + listRoutingRules connect_gateway.UnaryHandler[v1.ListRoutingRulesRequest, v1.ListRoutingRulesResponse] + updateRoutingRule connect_gateway.UnaryHandler[v1.UpdateRoutingRuleRequest, v1.UpdateRoutingRuleResponse] + deleteRoutingRule connect_gateway.UnaryHandler[v1.DeleteRoutingRuleRequest, v1.DeleteRoutingRuleResponse] +} + +// NewRoutingServiceGatewayServer constructs a Connect-Gateway gRPC server for the RoutingService +// service. +func NewRoutingServiceGatewayServer(svc RoutingServiceHandler, opts ...connect_gateway.HandlerOption) *RoutingServiceGatewayServer { + return &RoutingServiceGatewayServer{ + createRoutingRule: connect_gateway.NewUnaryHandler(RoutingServiceCreateRoutingRuleProcedure, svc.CreateRoutingRule, opts...), + getRoutingRule: connect_gateway.NewUnaryHandler(RoutingServiceGetRoutingRuleProcedure, svc.GetRoutingRule, opts...), + listRoutingRules: connect_gateway.NewUnaryHandler(RoutingServiceListRoutingRulesProcedure, svc.ListRoutingRules, opts...), + updateRoutingRule: connect_gateway.NewUnaryHandler(RoutingServiceUpdateRoutingRuleProcedure, svc.UpdateRoutingRule, opts...), + deleteRoutingRule: connect_gateway.NewUnaryHandler(RoutingServiceDeleteRoutingRuleProcedure, svc.DeleteRoutingRule, opts...), + } +} + +func (s *RoutingServiceGatewayServer) CreateRoutingRule(ctx context.Context, req *v1.CreateRoutingRuleRequest) (*v1.CreateRoutingRuleResponse, error) { + return s.createRoutingRule(ctx, req) +} + +func (s *RoutingServiceGatewayServer) GetRoutingRule(ctx context.Context, req *v1.GetRoutingRuleRequest) (*v1.GetRoutingRuleResponse, error) { + return s.getRoutingRule(ctx, req) +} + +func (s *RoutingServiceGatewayServer) ListRoutingRules(ctx context.Context, req *v1.ListRoutingRulesRequest) (*v1.ListRoutingRulesResponse, error) { + return s.listRoutingRules(ctx, req) +} + +func (s *RoutingServiceGatewayServer) UpdateRoutingRule(ctx context.Context, req *v1.UpdateRoutingRuleRequest) (*v1.UpdateRoutingRuleResponse, error) { + return s.updateRoutingRule(ctx, req) +} + +func (s *RoutingServiceGatewayServer) DeleteRoutingRule(ctx context.Context, req *v1.DeleteRoutingRuleRequest) (*v1.DeleteRoutingRuleResponse, error) { + return s.deleteRoutingRule(ctx, req) +} + +// RegisterRoutingServiceHandlerGatewayServer registers the Connect handlers for the RoutingService +// "svc" to "mux". +func RegisterRoutingServiceHandlerGatewayServer(mux *runtime.ServeMux, svc RoutingServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterRoutingServiceHandlerServer(context.TODO(), mux, NewRoutingServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.go new file mode 100644 index 0000000000..e35b628634 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.go @@ -0,0 +1,149 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/settings.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // SettingsServiceName is the fully-qualified name of the SettingsService service. + SettingsServiceName = "redpanda.api.aigateway.v1.SettingsService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SettingsServiceGetSettingsProcedure is the fully-qualified name of the SettingsService's + // GetSettings RPC. + SettingsServiceGetSettingsProcedure = "/redpanda.api.aigateway.v1.SettingsService/GetSettings" + // SettingsServiceUpdateSettingsProcedure is the fully-qualified name of the SettingsService's + // UpdateSettings RPC. + SettingsServiceUpdateSettingsProcedure = "/redpanda.api.aigateway.v1.SettingsService/UpdateSettings" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + settingsServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_settings_proto.Services().ByName("SettingsService") + settingsServiceGetSettingsMethodDescriptor = settingsServiceServiceDescriptor.Methods().ByName("GetSettings") + settingsServiceUpdateSettingsMethodDescriptor = settingsServiceServiceDescriptor.Methods().ByName("UpdateSettings") +) + +// SettingsServiceClient is a client for the redpanda.api.aigateway.v1.SettingsService service. +type SettingsServiceClient interface { + // Gets the global settings for the entire deployment. + GetSettings(context.Context, *connect.Request[v1.GetSettingsRequest]) (*connect.Response[v1.GetSettingsResponse], error) + // Updates the global settings for the entire deployment. + UpdateSettings(context.Context, *connect.Request[v1.UpdateSettingsRequest]) (*connect.Response[v1.UpdateSettingsResponse], error) +} + +// NewSettingsServiceClient constructs a client for the redpanda.api.aigateway.v1.SettingsService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSettingsServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SettingsServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &settingsServiceClient{ + getSettings: connect.NewClient[v1.GetSettingsRequest, v1.GetSettingsResponse]( + httpClient, + baseURL+SettingsServiceGetSettingsProcedure, + connect.WithSchema(settingsServiceGetSettingsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateSettings: connect.NewClient[v1.UpdateSettingsRequest, v1.UpdateSettingsResponse]( + httpClient, + baseURL+SettingsServiceUpdateSettingsProcedure, + connect.WithSchema(settingsServiceUpdateSettingsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// settingsServiceClient implements SettingsServiceClient. +type settingsServiceClient struct { + getSettings *connect.Client[v1.GetSettingsRequest, v1.GetSettingsResponse] + updateSettings *connect.Client[v1.UpdateSettingsRequest, v1.UpdateSettingsResponse] +} + +// GetSettings calls redpanda.api.aigateway.v1.SettingsService.GetSettings. +func (c *settingsServiceClient) GetSettings(ctx context.Context, req *connect.Request[v1.GetSettingsRequest]) (*connect.Response[v1.GetSettingsResponse], error) { + return c.getSettings.CallUnary(ctx, req) +} + +// UpdateSettings calls redpanda.api.aigateway.v1.SettingsService.UpdateSettings. +func (c *settingsServiceClient) UpdateSettings(ctx context.Context, req *connect.Request[v1.UpdateSettingsRequest]) (*connect.Response[v1.UpdateSettingsResponse], error) { + return c.updateSettings.CallUnary(ctx, req) +} + +// SettingsServiceHandler is an implementation of the redpanda.api.aigateway.v1.SettingsService +// service. +type SettingsServiceHandler interface { + // Gets the global settings for the entire deployment. + GetSettings(context.Context, *connect.Request[v1.GetSettingsRequest]) (*connect.Response[v1.GetSettingsResponse], error) + // Updates the global settings for the entire deployment. + UpdateSettings(context.Context, *connect.Request[v1.UpdateSettingsRequest]) (*connect.Response[v1.UpdateSettingsResponse], error) +} + +// NewSettingsServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSettingsServiceHandler(svc SettingsServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + settingsServiceGetSettingsHandler := connect.NewUnaryHandler( + SettingsServiceGetSettingsProcedure, + svc.GetSettings, + connect.WithSchema(settingsServiceGetSettingsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + settingsServiceUpdateSettingsHandler := connect.NewUnaryHandler( + SettingsServiceUpdateSettingsProcedure, + svc.UpdateSettings, + connect.WithSchema(settingsServiceUpdateSettingsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.SettingsService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SettingsServiceGetSettingsProcedure: + settingsServiceGetSettingsHandler.ServeHTTP(w, r) + case SettingsServiceUpdateSettingsProcedure: + settingsServiceUpdateSettingsHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSettingsServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSettingsServiceHandler struct{} + +func (UnimplementedSettingsServiceHandler) GetSettings(context.Context, *connect.Request[v1.GetSettingsRequest]) (*connect.Response[v1.GetSettingsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SettingsService.GetSettings is not implemented")) +} + +func (UnimplementedSettingsServiceHandler) UpdateSettings(context.Context, *connect.Request[v1.UpdateSettingsRequest]) (*connect.Response[v1.UpdateSettingsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SettingsService.UpdateSettings is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.gw.go new file mode 100644 index 0000000000..c62c7a7f57 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/settings.connect.gw.go @@ -0,0 +1,46 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/settings.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// SettingsServiceGatewayServer implements the gRPC server API for the SettingsService service. +type SettingsServiceGatewayServer struct { + v1.UnimplementedSettingsServiceServer + getSettings connect_gateway.UnaryHandler[v1.GetSettingsRequest, v1.GetSettingsResponse] + updateSettings connect_gateway.UnaryHandler[v1.UpdateSettingsRequest, v1.UpdateSettingsResponse] +} + +// NewSettingsServiceGatewayServer constructs a Connect-Gateway gRPC server for the SettingsService +// service. +func NewSettingsServiceGatewayServer(svc SettingsServiceHandler, opts ...connect_gateway.HandlerOption) *SettingsServiceGatewayServer { + return &SettingsServiceGatewayServer{ + getSettings: connect_gateway.NewUnaryHandler(SettingsServiceGetSettingsProcedure, svc.GetSettings, opts...), + updateSettings: connect_gateway.NewUnaryHandler(SettingsServiceUpdateSettingsProcedure, svc.UpdateSettings, opts...), + } +} + +func (s *SettingsServiceGatewayServer) GetSettings(ctx context.Context, req *v1.GetSettingsRequest) (*v1.GetSettingsResponse, error) { + return s.getSettings(ctx, req) +} + +func (s *SettingsServiceGatewayServer) UpdateSettings(ctx context.Context, req *v1.UpdateSettingsRequest) (*v1.UpdateSettingsResponse, error) { + return s.updateSettings(ctx, req) +} + +// RegisterSettingsServiceHandlerGatewayServer registers the Connect handlers for the +// SettingsService "svc" to "mux". +func RegisterSettingsServiceHandlerGatewayServer(mux *runtime.ServeMux, svc SettingsServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterSettingsServiceHandlerServer(context.TODO(), mux, NewSettingsServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.go new file mode 100644 index 0000000000..b5710b4d50 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.go @@ -0,0 +1,266 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/spend_limit.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // SpendLimitServiceName is the fully-qualified name of the SpendLimitService service. + SpendLimitServiceName = "redpanda.api.aigateway.v1.SpendLimitService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SpendLimitServiceCreateSpendLimitProcedure is the fully-qualified name of the SpendLimitService's + // CreateSpendLimit RPC. + SpendLimitServiceCreateSpendLimitProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit" + // SpendLimitServiceGetSpendLimitProcedure is the fully-qualified name of the SpendLimitService's + // GetSpendLimit RPC. + SpendLimitServiceGetSpendLimitProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit" + // SpendLimitServiceListSpendLimitsProcedure is the fully-qualified name of the SpendLimitService's + // ListSpendLimits RPC. + SpendLimitServiceListSpendLimitsProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits" + // SpendLimitServiceUpdateSpendLimitProcedure is the fully-qualified name of the SpendLimitService's + // UpdateSpendLimit RPC. + SpendLimitServiceUpdateSpendLimitProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit" + // SpendLimitServiceDeleteSpendLimitProcedure is the fully-qualified name of the SpendLimitService's + // DeleteSpendLimit RPC. + SpendLimitServiceDeleteSpendLimitProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit" + // SpendLimitServiceGetSpendLimitUsageProcedure is the fully-qualified name of the + // SpendLimitService's GetSpendLimitUsage RPC. + SpendLimitServiceGetSpendLimitUsageProcedure = "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + spendLimitServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_spend_limit_proto.Services().ByName("SpendLimitService") + spendLimitServiceCreateSpendLimitMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("CreateSpendLimit") + spendLimitServiceGetSpendLimitMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("GetSpendLimit") + spendLimitServiceListSpendLimitsMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("ListSpendLimits") + spendLimitServiceUpdateSpendLimitMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("UpdateSpendLimit") + spendLimitServiceDeleteSpendLimitMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("DeleteSpendLimit") + spendLimitServiceGetSpendLimitUsageMethodDescriptor = spendLimitServiceServiceDescriptor.Methods().ByName("GetSpendLimitUsage") +) + +// SpendLimitServiceClient is a client for the redpanda.api.aigateway.v1.SpendLimitService service. +type SpendLimitServiceClient interface { + CreateSpendLimit(context.Context, *connect.Request[v1.CreateSpendLimitRequest]) (*connect.Response[v1.CreateSpendLimitResponse], error) + GetSpendLimit(context.Context, *connect.Request[v1.GetSpendLimitRequest]) (*connect.Response[v1.GetSpendLimitResponse], error) + ListSpendLimits(context.Context, *connect.Request[v1.ListSpendLimitsRequest]) (*connect.Response[v1.ListSpendLimitsResponse], error) + UpdateSpendLimit(context.Context, *connect.Request[v1.UpdateSpendLimitRequest]) (*connect.Response[v1.UpdateSpendLimitResponse], error) + DeleteSpendLimit(context.Context, *connect.Request[v1.DeleteSpendLimitRequest]) (*connect.Response[v1.DeleteSpendLimitResponse], error) + GetSpendLimitUsage(context.Context, *connect.Request[v1.GetSpendLimitUsageRequest]) (*connect.Response[v1.GetSpendLimitUsageResponse], error) +} + +// NewSpendLimitServiceClient constructs a client for the +// redpanda.api.aigateway.v1.SpendLimitService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSpendLimitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SpendLimitServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &spendLimitServiceClient{ + createSpendLimit: connect.NewClient[v1.CreateSpendLimitRequest, v1.CreateSpendLimitResponse]( + httpClient, + baseURL+SpendLimitServiceCreateSpendLimitProcedure, + connect.WithSchema(spendLimitServiceCreateSpendLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getSpendLimit: connect.NewClient[v1.GetSpendLimitRequest, v1.GetSpendLimitResponse]( + httpClient, + baseURL+SpendLimitServiceGetSpendLimitProcedure, + connect.WithSchema(spendLimitServiceGetSpendLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listSpendLimits: connect.NewClient[v1.ListSpendLimitsRequest, v1.ListSpendLimitsResponse]( + httpClient, + baseURL+SpendLimitServiceListSpendLimitsProcedure, + connect.WithSchema(spendLimitServiceListSpendLimitsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateSpendLimit: connect.NewClient[v1.UpdateSpendLimitRequest, v1.UpdateSpendLimitResponse]( + httpClient, + baseURL+SpendLimitServiceUpdateSpendLimitProcedure, + connect.WithSchema(spendLimitServiceUpdateSpendLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteSpendLimit: connect.NewClient[v1.DeleteSpendLimitRequest, v1.DeleteSpendLimitResponse]( + httpClient, + baseURL+SpendLimitServiceDeleteSpendLimitProcedure, + connect.WithSchema(spendLimitServiceDeleteSpendLimitMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getSpendLimitUsage: connect.NewClient[v1.GetSpendLimitUsageRequest, v1.GetSpendLimitUsageResponse]( + httpClient, + baseURL+SpendLimitServiceGetSpendLimitUsageProcedure, + connect.WithSchema(spendLimitServiceGetSpendLimitUsageMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// spendLimitServiceClient implements SpendLimitServiceClient. +type spendLimitServiceClient struct { + createSpendLimit *connect.Client[v1.CreateSpendLimitRequest, v1.CreateSpendLimitResponse] + getSpendLimit *connect.Client[v1.GetSpendLimitRequest, v1.GetSpendLimitResponse] + listSpendLimits *connect.Client[v1.ListSpendLimitsRequest, v1.ListSpendLimitsResponse] + updateSpendLimit *connect.Client[v1.UpdateSpendLimitRequest, v1.UpdateSpendLimitResponse] + deleteSpendLimit *connect.Client[v1.DeleteSpendLimitRequest, v1.DeleteSpendLimitResponse] + getSpendLimitUsage *connect.Client[v1.GetSpendLimitUsageRequest, v1.GetSpendLimitUsageResponse] +} + +// CreateSpendLimit calls redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit. +func (c *spendLimitServiceClient) CreateSpendLimit(ctx context.Context, req *connect.Request[v1.CreateSpendLimitRequest]) (*connect.Response[v1.CreateSpendLimitResponse], error) { + return c.createSpendLimit.CallUnary(ctx, req) +} + +// GetSpendLimit calls redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit. +func (c *spendLimitServiceClient) GetSpendLimit(ctx context.Context, req *connect.Request[v1.GetSpendLimitRequest]) (*connect.Response[v1.GetSpendLimitResponse], error) { + return c.getSpendLimit.CallUnary(ctx, req) +} + +// ListSpendLimits calls redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits. +func (c *spendLimitServiceClient) ListSpendLimits(ctx context.Context, req *connect.Request[v1.ListSpendLimitsRequest]) (*connect.Response[v1.ListSpendLimitsResponse], error) { + return c.listSpendLimits.CallUnary(ctx, req) +} + +// UpdateSpendLimit calls redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit. +func (c *spendLimitServiceClient) UpdateSpendLimit(ctx context.Context, req *connect.Request[v1.UpdateSpendLimitRequest]) (*connect.Response[v1.UpdateSpendLimitResponse], error) { + return c.updateSpendLimit.CallUnary(ctx, req) +} + +// DeleteSpendLimit calls redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit. +func (c *spendLimitServiceClient) DeleteSpendLimit(ctx context.Context, req *connect.Request[v1.DeleteSpendLimitRequest]) (*connect.Response[v1.DeleteSpendLimitResponse], error) { + return c.deleteSpendLimit.CallUnary(ctx, req) +} + +// GetSpendLimitUsage calls redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage. +func (c *spendLimitServiceClient) GetSpendLimitUsage(ctx context.Context, req *connect.Request[v1.GetSpendLimitUsageRequest]) (*connect.Response[v1.GetSpendLimitUsageResponse], error) { + return c.getSpendLimitUsage.CallUnary(ctx, req) +} + +// SpendLimitServiceHandler is an implementation of the redpanda.api.aigateway.v1.SpendLimitService +// service. +type SpendLimitServiceHandler interface { + CreateSpendLimit(context.Context, *connect.Request[v1.CreateSpendLimitRequest]) (*connect.Response[v1.CreateSpendLimitResponse], error) + GetSpendLimit(context.Context, *connect.Request[v1.GetSpendLimitRequest]) (*connect.Response[v1.GetSpendLimitResponse], error) + ListSpendLimits(context.Context, *connect.Request[v1.ListSpendLimitsRequest]) (*connect.Response[v1.ListSpendLimitsResponse], error) + UpdateSpendLimit(context.Context, *connect.Request[v1.UpdateSpendLimitRequest]) (*connect.Response[v1.UpdateSpendLimitResponse], error) + DeleteSpendLimit(context.Context, *connect.Request[v1.DeleteSpendLimitRequest]) (*connect.Response[v1.DeleteSpendLimitResponse], error) + GetSpendLimitUsage(context.Context, *connect.Request[v1.GetSpendLimitUsageRequest]) (*connect.Response[v1.GetSpendLimitUsageResponse], error) +} + +// NewSpendLimitServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSpendLimitServiceHandler(svc SpendLimitServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + spendLimitServiceCreateSpendLimitHandler := connect.NewUnaryHandler( + SpendLimitServiceCreateSpendLimitProcedure, + svc.CreateSpendLimit, + connect.WithSchema(spendLimitServiceCreateSpendLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + spendLimitServiceGetSpendLimitHandler := connect.NewUnaryHandler( + SpendLimitServiceGetSpendLimitProcedure, + svc.GetSpendLimit, + connect.WithSchema(spendLimitServiceGetSpendLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + spendLimitServiceListSpendLimitsHandler := connect.NewUnaryHandler( + SpendLimitServiceListSpendLimitsProcedure, + svc.ListSpendLimits, + connect.WithSchema(spendLimitServiceListSpendLimitsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + spendLimitServiceUpdateSpendLimitHandler := connect.NewUnaryHandler( + SpendLimitServiceUpdateSpendLimitProcedure, + svc.UpdateSpendLimit, + connect.WithSchema(spendLimitServiceUpdateSpendLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + spendLimitServiceDeleteSpendLimitHandler := connect.NewUnaryHandler( + SpendLimitServiceDeleteSpendLimitProcedure, + svc.DeleteSpendLimit, + connect.WithSchema(spendLimitServiceDeleteSpendLimitMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + spendLimitServiceGetSpendLimitUsageHandler := connect.NewUnaryHandler( + SpendLimitServiceGetSpendLimitUsageProcedure, + svc.GetSpendLimitUsage, + connect.WithSchema(spendLimitServiceGetSpendLimitUsageMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.SpendLimitService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SpendLimitServiceCreateSpendLimitProcedure: + spendLimitServiceCreateSpendLimitHandler.ServeHTTP(w, r) + case SpendLimitServiceGetSpendLimitProcedure: + spendLimitServiceGetSpendLimitHandler.ServeHTTP(w, r) + case SpendLimitServiceListSpendLimitsProcedure: + spendLimitServiceListSpendLimitsHandler.ServeHTTP(w, r) + case SpendLimitServiceUpdateSpendLimitProcedure: + spendLimitServiceUpdateSpendLimitHandler.ServeHTTP(w, r) + case SpendLimitServiceDeleteSpendLimitProcedure: + spendLimitServiceDeleteSpendLimitHandler.ServeHTTP(w, r) + case SpendLimitServiceGetSpendLimitUsageProcedure: + spendLimitServiceGetSpendLimitUsageHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSpendLimitServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSpendLimitServiceHandler struct{} + +func (UnimplementedSpendLimitServiceHandler) CreateSpendLimit(context.Context, *connect.Request[v1.CreateSpendLimitRequest]) (*connect.Response[v1.CreateSpendLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit is not implemented")) +} + +func (UnimplementedSpendLimitServiceHandler) GetSpendLimit(context.Context, *connect.Request[v1.GetSpendLimitRequest]) (*connect.Response[v1.GetSpendLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit is not implemented")) +} + +func (UnimplementedSpendLimitServiceHandler) ListSpendLimits(context.Context, *connect.Request[v1.ListSpendLimitsRequest]) (*connect.Response[v1.ListSpendLimitsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits is not implemented")) +} + +func (UnimplementedSpendLimitServiceHandler) UpdateSpendLimit(context.Context, *connect.Request[v1.UpdateSpendLimitRequest]) (*connect.Response[v1.UpdateSpendLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit is not implemented")) +} + +func (UnimplementedSpendLimitServiceHandler) DeleteSpendLimit(context.Context, *connect.Request[v1.DeleteSpendLimitRequest]) (*connect.Response[v1.DeleteSpendLimitResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit is not implemented")) +} + +func (UnimplementedSpendLimitServiceHandler) GetSpendLimitUsage(context.Context, *connect.Request[v1.GetSpendLimitUsageRequest]) (*connect.Response[v1.GetSpendLimitUsageResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.gw.go new file mode 100644 index 0000000000..3b30d60a36 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/spend_limit.connect.gw.go @@ -0,0 +1,70 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/spend_limit.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// SpendLimitServiceGatewayServer implements the gRPC server API for the SpendLimitService service. +type SpendLimitServiceGatewayServer struct { + v1.UnimplementedSpendLimitServiceServer + createSpendLimit connect_gateway.UnaryHandler[v1.CreateSpendLimitRequest, v1.CreateSpendLimitResponse] + getSpendLimit connect_gateway.UnaryHandler[v1.GetSpendLimitRequest, v1.GetSpendLimitResponse] + listSpendLimits connect_gateway.UnaryHandler[v1.ListSpendLimitsRequest, v1.ListSpendLimitsResponse] + updateSpendLimit connect_gateway.UnaryHandler[v1.UpdateSpendLimitRequest, v1.UpdateSpendLimitResponse] + deleteSpendLimit connect_gateway.UnaryHandler[v1.DeleteSpendLimitRequest, v1.DeleteSpendLimitResponse] + getSpendLimitUsage connect_gateway.UnaryHandler[v1.GetSpendLimitUsageRequest, v1.GetSpendLimitUsageResponse] +} + +// NewSpendLimitServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// SpendLimitService service. +func NewSpendLimitServiceGatewayServer(svc SpendLimitServiceHandler, opts ...connect_gateway.HandlerOption) *SpendLimitServiceGatewayServer { + return &SpendLimitServiceGatewayServer{ + createSpendLimit: connect_gateway.NewUnaryHandler(SpendLimitServiceCreateSpendLimitProcedure, svc.CreateSpendLimit, opts...), + getSpendLimit: connect_gateway.NewUnaryHandler(SpendLimitServiceGetSpendLimitProcedure, svc.GetSpendLimit, opts...), + listSpendLimits: connect_gateway.NewUnaryHandler(SpendLimitServiceListSpendLimitsProcedure, svc.ListSpendLimits, opts...), + updateSpendLimit: connect_gateway.NewUnaryHandler(SpendLimitServiceUpdateSpendLimitProcedure, svc.UpdateSpendLimit, opts...), + deleteSpendLimit: connect_gateway.NewUnaryHandler(SpendLimitServiceDeleteSpendLimitProcedure, svc.DeleteSpendLimit, opts...), + getSpendLimitUsage: connect_gateway.NewUnaryHandler(SpendLimitServiceGetSpendLimitUsageProcedure, svc.GetSpendLimitUsage, opts...), + } +} + +func (s *SpendLimitServiceGatewayServer) CreateSpendLimit(ctx context.Context, req *v1.CreateSpendLimitRequest) (*v1.CreateSpendLimitResponse, error) { + return s.createSpendLimit(ctx, req) +} + +func (s *SpendLimitServiceGatewayServer) GetSpendLimit(ctx context.Context, req *v1.GetSpendLimitRequest) (*v1.GetSpendLimitResponse, error) { + return s.getSpendLimit(ctx, req) +} + +func (s *SpendLimitServiceGatewayServer) ListSpendLimits(ctx context.Context, req *v1.ListSpendLimitsRequest) (*v1.ListSpendLimitsResponse, error) { + return s.listSpendLimits(ctx, req) +} + +func (s *SpendLimitServiceGatewayServer) UpdateSpendLimit(ctx context.Context, req *v1.UpdateSpendLimitRequest) (*v1.UpdateSpendLimitResponse, error) { + return s.updateSpendLimit(ctx, req) +} + +func (s *SpendLimitServiceGatewayServer) DeleteSpendLimit(ctx context.Context, req *v1.DeleteSpendLimitRequest) (*v1.DeleteSpendLimitResponse, error) { + return s.deleteSpendLimit(ctx, req) +} + +func (s *SpendLimitServiceGatewayServer) GetSpendLimitUsage(ctx context.Context, req *v1.GetSpendLimitUsageRequest) (*v1.GetSpendLimitUsageResponse, error) { + return s.getSpendLimitUsage(ctx, req) +} + +// RegisterSpendLimitServiceHandlerGatewayServer registers the Connect handlers for the +// SpendLimitService "svc" to "mux". +func RegisterSpendLimitServiceHandlerGatewayServer(mux *runtime.ServeMux, svc SpendLimitServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterSpendLimitServiceHandlerServer(context.TODO(), mux, NewSpendLimitServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.go new file mode 100644 index 0000000000..184b493660 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.go @@ -0,0 +1,442 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/sso.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // SSOServiceName is the fully-qualified name of the SSOService service. + SSOServiceName = "redpanda.api.aigateway.v1.SSOService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SSOServiceCreateIdentityProviderProcedure is the fully-qualified name of the SSOService's + // CreateIdentityProvider RPC. + SSOServiceCreateIdentityProviderProcedure = "/redpanda.api.aigateway.v1.SSOService/CreateIdentityProvider" + // SSOServiceGetIdentityProviderProcedure is the fully-qualified name of the SSOService's + // GetIdentityProvider RPC. + SSOServiceGetIdentityProviderProcedure = "/redpanda.api.aigateway.v1.SSOService/GetIdentityProvider" + // SSOServiceListIdentityProvidersProcedure is the fully-qualified name of the SSOService's + // ListIdentityProviders RPC. + SSOServiceListIdentityProvidersProcedure = "/redpanda.api.aigateway.v1.SSOService/ListIdentityProviders" + // SSOServiceUpdateIdentityProviderProcedure is the fully-qualified name of the SSOService's + // UpdateIdentityProvider RPC. + SSOServiceUpdateIdentityProviderProcedure = "/redpanda.api.aigateway.v1.SSOService/UpdateIdentityProvider" + // SSOServiceDeleteIdentityProviderProcedure is the fully-qualified name of the SSOService's + // DeleteIdentityProvider RPC. + SSOServiceDeleteIdentityProviderProcedure = "/redpanda.api.aigateway.v1.SSOService/DeleteIdentityProvider" + // SSOServiceAddDomainProcedure is the fully-qualified name of the SSOService's AddDomain RPC. + SSOServiceAddDomainProcedure = "/redpanda.api.aigateway.v1.SSOService/AddDomain" + // SSOServiceListDomainsProcedure is the fully-qualified name of the SSOService's ListDomains RPC. + SSOServiceListDomainsProcedure = "/redpanda.api.aigateway.v1.SSOService/ListDomains" + // SSOServiceRemoveDomainProcedure is the fully-qualified name of the SSOService's RemoveDomain RPC. + SSOServiceRemoveDomainProcedure = "/redpanda.api.aigateway.v1.SSOService/RemoveDomain" + // SSOServiceVerifyDomainProcedure is the fully-qualified name of the SSOService's VerifyDomain RPC. + SSOServiceVerifyDomainProcedure = "/redpanda.api.aigateway.v1.SSOService/VerifyDomain" + // SSOServiceLookupIdPByEmailProcedure is the fully-qualified name of the SSOService's + // LookupIdPByEmail RPC. + SSOServiceLookupIdPByEmailProcedure = "/redpanda.api.aigateway.v1.SSOService/LookupIdPByEmail" + // SSOServiceTestCredentialsProcedure is the fully-qualified name of the SSOService's + // TestCredentials RPC. + SSOServiceTestCredentialsProcedure = "/redpanda.api.aigateway.v1.SSOService/TestCredentials" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + sSOServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_sso_proto.Services().ByName("SSOService") + sSOServiceCreateIdentityProviderMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("CreateIdentityProvider") + sSOServiceGetIdentityProviderMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("GetIdentityProvider") + sSOServiceListIdentityProvidersMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("ListIdentityProviders") + sSOServiceUpdateIdentityProviderMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("UpdateIdentityProvider") + sSOServiceDeleteIdentityProviderMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("DeleteIdentityProvider") + sSOServiceAddDomainMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("AddDomain") + sSOServiceListDomainsMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("ListDomains") + sSOServiceRemoveDomainMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("RemoveDomain") + sSOServiceVerifyDomainMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("VerifyDomain") + sSOServiceLookupIdPByEmailMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("LookupIdPByEmail") + sSOServiceTestCredentialsMethodDescriptor = sSOServiceServiceDescriptor.Methods().ByName("TestCredentials") +) + +// SSOServiceClient is a client for the redpanda.api.aigateway.v1.SSOService service. +type SSOServiceClient interface { + // Creates a new identity provider within an account. + CreateIdentityProvider(context.Context, *connect.Request[v1.CreateIdentityProviderRequest]) (*connect.Response[v1.CreateIdentityProviderResponse], error) + // Gets an identity provider by name. + GetIdentityProvider(context.Context, *connect.Request[v1.GetIdentityProviderRequest]) (*connect.Response[v1.GetIdentityProviderResponse], error) + // Lists identity providers within an account. + ListIdentityProviders(context.Context, *connect.Request[v1.ListIdentityProvidersRequest]) (*connect.Response[v1.ListIdentityProvidersResponse], error) + // Updates an identity provider. + UpdateIdentityProvider(context.Context, *connect.Request[v1.UpdateIdentityProviderRequest]) (*connect.Response[v1.UpdateIdentityProviderResponse], error) + // Deletes an identity provider. + DeleteIdentityProvider(context.Context, *connect.Request[v1.DeleteIdentityProviderRequest]) (*connect.Response[v1.DeleteIdentityProviderResponse], error) + // Adds an email domain to an identity provider for Home Realm Discovery. + // The domain must be verified via DNS TXT record before it becomes active. + AddDomain(context.Context, *connect.Request[v1.AddDomainRequest]) (*connect.Response[v1.AddDomainResponse], error) + // Lists domains associated with an identity provider. + ListDomains(context.Context, *connect.Request[v1.ListDomainsRequest]) (*connect.Response[v1.ListDomainsResponse], error) + // Removes a domain from an identity provider. + RemoveDomain(context.Context, *connect.Request[v1.RemoveDomainRequest]) (*connect.Response[v1.RemoveDomainResponse], error) + // Initiates or retries domain verification via DNS TXT record. + VerifyDomain(context.Context, *connect.Request[v1.VerifyDomainRequest]) (*connect.Response[v1.VerifyDomainResponse], error) + // Looks up the identity provider for an email address based on domain. + // Used during login to determine which IdP to redirect to. + // Returns NOT_FOUND if no IdP is configured for the domain. + LookupIdPByEmail(context.Context, *connect.Request[v1.LookupIdPByEmailRequest]) (*connect.Response[v1.LookupIdPByEmailResponse], error) + // Tests OIDC credentials using the client credentials grant. + // Validates that the client_id and client_secret can obtain a token + // and returns the decoded token claims. + TestCredentials(context.Context, *connect.Request[v1.TestCredentialsRequest]) (*connect.Response[v1.TestCredentialsResponse], error) +} + +// NewSSOServiceClient constructs a client for the redpanda.api.aigateway.v1.SSOService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSSOServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SSOServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &sSOServiceClient{ + createIdentityProvider: connect.NewClient[v1.CreateIdentityProviderRequest, v1.CreateIdentityProviderResponse]( + httpClient, + baseURL+SSOServiceCreateIdentityProviderProcedure, + connect.WithSchema(sSOServiceCreateIdentityProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getIdentityProvider: connect.NewClient[v1.GetIdentityProviderRequest, v1.GetIdentityProviderResponse]( + httpClient, + baseURL+SSOServiceGetIdentityProviderProcedure, + connect.WithSchema(sSOServiceGetIdentityProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listIdentityProviders: connect.NewClient[v1.ListIdentityProvidersRequest, v1.ListIdentityProvidersResponse]( + httpClient, + baseURL+SSOServiceListIdentityProvidersProcedure, + connect.WithSchema(sSOServiceListIdentityProvidersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateIdentityProvider: connect.NewClient[v1.UpdateIdentityProviderRequest, v1.UpdateIdentityProviderResponse]( + httpClient, + baseURL+SSOServiceUpdateIdentityProviderProcedure, + connect.WithSchema(sSOServiceUpdateIdentityProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteIdentityProvider: connect.NewClient[v1.DeleteIdentityProviderRequest, v1.DeleteIdentityProviderResponse]( + httpClient, + baseURL+SSOServiceDeleteIdentityProviderProcedure, + connect.WithSchema(sSOServiceDeleteIdentityProviderMethodDescriptor), + connect.WithClientOptions(opts...), + ), + addDomain: connect.NewClient[v1.AddDomainRequest, v1.AddDomainResponse]( + httpClient, + baseURL+SSOServiceAddDomainProcedure, + connect.WithSchema(sSOServiceAddDomainMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listDomains: connect.NewClient[v1.ListDomainsRequest, v1.ListDomainsResponse]( + httpClient, + baseURL+SSOServiceListDomainsProcedure, + connect.WithSchema(sSOServiceListDomainsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + removeDomain: connect.NewClient[v1.RemoveDomainRequest, v1.RemoveDomainResponse]( + httpClient, + baseURL+SSOServiceRemoveDomainProcedure, + connect.WithSchema(sSOServiceRemoveDomainMethodDescriptor), + connect.WithClientOptions(opts...), + ), + verifyDomain: connect.NewClient[v1.VerifyDomainRequest, v1.VerifyDomainResponse]( + httpClient, + baseURL+SSOServiceVerifyDomainProcedure, + connect.WithSchema(sSOServiceVerifyDomainMethodDescriptor), + connect.WithClientOptions(opts...), + ), + lookupIdPByEmail: connect.NewClient[v1.LookupIdPByEmailRequest, v1.LookupIdPByEmailResponse]( + httpClient, + baseURL+SSOServiceLookupIdPByEmailProcedure, + connect.WithSchema(sSOServiceLookupIdPByEmailMethodDescriptor), + connect.WithClientOptions(opts...), + ), + testCredentials: connect.NewClient[v1.TestCredentialsRequest, v1.TestCredentialsResponse]( + httpClient, + baseURL+SSOServiceTestCredentialsProcedure, + connect.WithSchema(sSOServiceTestCredentialsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// sSOServiceClient implements SSOServiceClient. +type sSOServiceClient struct { + createIdentityProvider *connect.Client[v1.CreateIdentityProviderRequest, v1.CreateIdentityProviderResponse] + getIdentityProvider *connect.Client[v1.GetIdentityProviderRequest, v1.GetIdentityProviderResponse] + listIdentityProviders *connect.Client[v1.ListIdentityProvidersRequest, v1.ListIdentityProvidersResponse] + updateIdentityProvider *connect.Client[v1.UpdateIdentityProviderRequest, v1.UpdateIdentityProviderResponse] + deleteIdentityProvider *connect.Client[v1.DeleteIdentityProviderRequest, v1.DeleteIdentityProviderResponse] + addDomain *connect.Client[v1.AddDomainRequest, v1.AddDomainResponse] + listDomains *connect.Client[v1.ListDomainsRequest, v1.ListDomainsResponse] + removeDomain *connect.Client[v1.RemoveDomainRequest, v1.RemoveDomainResponse] + verifyDomain *connect.Client[v1.VerifyDomainRequest, v1.VerifyDomainResponse] + lookupIdPByEmail *connect.Client[v1.LookupIdPByEmailRequest, v1.LookupIdPByEmailResponse] + testCredentials *connect.Client[v1.TestCredentialsRequest, v1.TestCredentialsResponse] +} + +// CreateIdentityProvider calls redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider. +func (c *sSOServiceClient) CreateIdentityProvider(ctx context.Context, req *connect.Request[v1.CreateIdentityProviderRequest]) (*connect.Response[v1.CreateIdentityProviderResponse], error) { + return c.createIdentityProvider.CallUnary(ctx, req) +} + +// GetIdentityProvider calls redpanda.api.aigateway.v1.SSOService.GetIdentityProvider. +func (c *sSOServiceClient) GetIdentityProvider(ctx context.Context, req *connect.Request[v1.GetIdentityProviderRequest]) (*connect.Response[v1.GetIdentityProviderResponse], error) { + return c.getIdentityProvider.CallUnary(ctx, req) +} + +// ListIdentityProviders calls redpanda.api.aigateway.v1.SSOService.ListIdentityProviders. +func (c *sSOServiceClient) ListIdentityProviders(ctx context.Context, req *connect.Request[v1.ListIdentityProvidersRequest]) (*connect.Response[v1.ListIdentityProvidersResponse], error) { + return c.listIdentityProviders.CallUnary(ctx, req) +} + +// UpdateIdentityProvider calls redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider. +func (c *sSOServiceClient) UpdateIdentityProvider(ctx context.Context, req *connect.Request[v1.UpdateIdentityProviderRequest]) (*connect.Response[v1.UpdateIdentityProviderResponse], error) { + return c.updateIdentityProvider.CallUnary(ctx, req) +} + +// DeleteIdentityProvider calls redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider. +func (c *sSOServiceClient) DeleteIdentityProvider(ctx context.Context, req *connect.Request[v1.DeleteIdentityProviderRequest]) (*connect.Response[v1.DeleteIdentityProviderResponse], error) { + return c.deleteIdentityProvider.CallUnary(ctx, req) +} + +// AddDomain calls redpanda.api.aigateway.v1.SSOService.AddDomain. +func (c *sSOServiceClient) AddDomain(ctx context.Context, req *connect.Request[v1.AddDomainRequest]) (*connect.Response[v1.AddDomainResponse], error) { + return c.addDomain.CallUnary(ctx, req) +} + +// ListDomains calls redpanda.api.aigateway.v1.SSOService.ListDomains. +func (c *sSOServiceClient) ListDomains(ctx context.Context, req *connect.Request[v1.ListDomainsRequest]) (*connect.Response[v1.ListDomainsResponse], error) { + return c.listDomains.CallUnary(ctx, req) +} + +// RemoveDomain calls redpanda.api.aigateway.v1.SSOService.RemoveDomain. +func (c *sSOServiceClient) RemoveDomain(ctx context.Context, req *connect.Request[v1.RemoveDomainRequest]) (*connect.Response[v1.RemoveDomainResponse], error) { + return c.removeDomain.CallUnary(ctx, req) +} + +// VerifyDomain calls redpanda.api.aigateway.v1.SSOService.VerifyDomain. +func (c *sSOServiceClient) VerifyDomain(ctx context.Context, req *connect.Request[v1.VerifyDomainRequest]) (*connect.Response[v1.VerifyDomainResponse], error) { + return c.verifyDomain.CallUnary(ctx, req) +} + +// LookupIdPByEmail calls redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail. +func (c *sSOServiceClient) LookupIdPByEmail(ctx context.Context, req *connect.Request[v1.LookupIdPByEmailRequest]) (*connect.Response[v1.LookupIdPByEmailResponse], error) { + return c.lookupIdPByEmail.CallUnary(ctx, req) +} + +// TestCredentials calls redpanda.api.aigateway.v1.SSOService.TestCredentials. +func (c *sSOServiceClient) TestCredentials(ctx context.Context, req *connect.Request[v1.TestCredentialsRequest]) (*connect.Response[v1.TestCredentialsResponse], error) { + return c.testCredentials.CallUnary(ctx, req) +} + +// SSOServiceHandler is an implementation of the redpanda.api.aigateway.v1.SSOService service. +type SSOServiceHandler interface { + // Creates a new identity provider within an account. + CreateIdentityProvider(context.Context, *connect.Request[v1.CreateIdentityProviderRequest]) (*connect.Response[v1.CreateIdentityProviderResponse], error) + // Gets an identity provider by name. + GetIdentityProvider(context.Context, *connect.Request[v1.GetIdentityProviderRequest]) (*connect.Response[v1.GetIdentityProviderResponse], error) + // Lists identity providers within an account. + ListIdentityProviders(context.Context, *connect.Request[v1.ListIdentityProvidersRequest]) (*connect.Response[v1.ListIdentityProvidersResponse], error) + // Updates an identity provider. + UpdateIdentityProvider(context.Context, *connect.Request[v1.UpdateIdentityProviderRequest]) (*connect.Response[v1.UpdateIdentityProviderResponse], error) + // Deletes an identity provider. + DeleteIdentityProvider(context.Context, *connect.Request[v1.DeleteIdentityProviderRequest]) (*connect.Response[v1.DeleteIdentityProviderResponse], error) + // Adds an email domain to an identity provider for Home Realm Discovery. + // The domain must be verified via DNS TXT record before it becomes active. + AddDomain(context.Context, *connect.Request[v1.AddDomainRequest]) (*connect.Response[v1.AddDomainResponse], error) + // Lists domains associated with an identity provider. + ListDomains(context.Context, *connect.Request[v1.ListDomainsRequest]) (*connect.Response[v1.ListDomainsResponse], error) + // Removes a domain from an identity provider. + RemoveDomain(context.Context, *connect.Request[v1.RemoveDomainRequest]) (*connect.Response[v1.RemoveDomainResponse], error) + // Initiates or retries domain verification via DNS TXT record. + VerifyDomain(context.Context, *connect.Request[v1.VerifyDomainRequest]) (*connect.Response[v1.VerifyDomainResponse], error) + // Looks up the identity provider for an email address based on domain. + // Used during login to determine which IdP to redirect to. + // Returns NOT_FOUND if no IdP is configured for the domain. + LookupIdPByEmail(context.Context, *connect.Request[v1.LookupIdPByEmailRequest]) (*connect.Response[v1.LookupIdPByEmailResponse], error) + // Tests OIDC credentials using the client credentials grant. + // Validates that the client_id and client_secret can obtain a token + // and returns the decoded token claims. + TestCredentials(context.Context, *connect.Request[v1.TestCredentialsRequest]) (*connect.Response[v1.TestCredentialsResponse], error) +} + +// NewSSOServiceHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSSOServiceHandler(svc SSOServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + sSOServiceCreateIdentityProviderHandler := connect.NewUnaryHandler( + SSOServiceCreateIdentityProviderProcedure, + svc.CreateIdentityProvider, + connect.WithSchema(sSOServiceCreateIdentityProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceGetIdentityProviderHandler := connect.NewUnaryHandler( + SSOServiceGetIdentityProviderProcedure, + svc.GetIdentityProvider, + connect.WithSchema(sSOServiceGetIdentityProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceListIdentityProvidersHandler := connect.NewUnaryHandler( + SSOServiceListIdentityProvidersProcedure, + svc.ListIdentityProviders, + connect.WithSchema(sSOServiceListIdentityProvidersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceUpdateIdentityProviderHandler := connect.NewUnaryHandler( + SSOServiceUpdateIdentityProviderProcedure, + svc.UpdateIdentityProvider, + connect.WithSchema(sSOServiceUpdateIdentityProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceDeleteIdentityProviderHandler := connect.NewUnaryHandler( + SSOServiceDeleteIdentityProviderProcedure, + svc.DeleteIdentityProvider, + connect.WithSchema(sSOServiceDeleteIdentityProviderMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceAddDomainHandler := connect.NewUnaryHandler( + SSOServiceAddDomainProcedure, + svc.AddDomain, + connect.WithSchema(sSOServiceAddDomainMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceListDomainsHandler := connect.NewUnaryHandler( + SSOServiceListDomainsProcedure, + svc.ListDomains, + connect.WithSchema(sSOServiceListDomainsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceRemoveDomainHandler := connect.NewUnaryHandler( + SSOServiceRemoveDomainProcedure, + svc.RemoveDomain, + connect.WithSchema(sSOServiceRemoveDomainMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceVerifyDomainHandler := connect.NewUnaryHandler( + SSOServiceVerifyDomainProcedure, + svc.VerifyDomain, + connect.WithSchema(sSOServiceVerifyDomainMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceLookupIdPByEmailHandler := connect.NewUnaryHandler( + SSOServiceLookupIdPByEmailProcedure, + svc.LookupIdPByEmail, + connect.WithSchema(sSOServiceLookupIdPByEmailMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + sSOServiceTestCredentialsHandler := connect.NewUnaryHandler( + SSOServiceTestCredentialsProcedure, + svc.TestCredentials, + connect.WithSchema(sSOServiceTestCredentialsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.SSOService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SSOServiceCreateIdentityProviderProcedure: + sSOServiceCreateIdentityProviderHandler.ServeHTTP(w, r) + case SSOServiceGetIdentityProviderProcedure: + sSOServiceGetIdentityProviderHandler.ServeHTTP(w, r) + case SSOServiceListIdentityProvidersProcedure: + sSOServiceListIdentityProvidersHandler.ServeHTTP(w, r) + case SSOServiceUpdateIdentityProviderProcedure: + sSOServiceUpdateIdentityProviderHandler.ServeHTTP(w, r) + case SSOServiceDeleteIdentityProviderProcedure: + sSOServiceDeleteIdentityProviderHandler.ServeHTTP(w, r) + case SSOServiceAddDomainProcedure: + sSOServiceAddDomainHandler.ServeHTTP(w, r) + case SSOServiceListDomainsProcedure: + sSOServiceListDomainsHandler.ServeHTTP(w, r) + case SSOServiceRemoveDomainProcedure: + sSOServiceRemoveDomainHandler.ServeHTTP(w, r) + case SSOServiceVerifyDomainProcedure: + sSOServiceVerifyDomainHandler.ServeHTTP(w, r) + case SSOServiceLookupIdPByEmailProcedure: + sSOServiceLookupIdPByEmailHandler.ServeHTTP(w, r) + case SSOServiceTestCredentialsProcedure: + sSOServiceTestCredentialsHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSSOServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSSOServiceHandler struct{} + +func (UnimplementedSSOServiceHandler) CreateIdentityProvider(context.Context, *connect.Request[v1.CreateIdentityProviderRequest]) (*connect.Response[v1.CreateIdentityProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider is not implemented")) +} + +func (UnimplementedSSOServiceHandler) GetIdentityProvider(context.Context, *connect.Request[v1.GetIdentityProviderRequest]) (*connect.Response[v1.GetIdentityProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.GetIdentityProvider is not implemented")) +} + +func (UnimplementedSSOServiceHandler) ListIdentityProviders(context.Context, *connect.Request[v1.ListIdentityProvidersRequest]) (*connect.Response[v1.ListIdentityProvidersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.ListIdentityProviders is not implemented")) +} + +func (UnimplementedSSOServiceHandler) UpdateIdentityProvider(context.Context, *connect.Request[v1.UpdateIdentityProviderRequest]) (*connect.Response[v1.UpdateIdentityProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider is not implemented")) +} + +func (UnimplementedSSOServiceHandler) DeleteIdentityProvider(context.Context, *connect.Request[v1.DeleteIdentityProviderRequest]) (*connect.Response[v1.DeleteIdentityProviderResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider is not implemented")) +} + +func (UnimplementedSSOServiceHandler) AddDomain(context.Context, *connect.Request[v1.AddDomainRequest]) (*connect.Response[v1.AddDomainResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.AddDomain is not implemented")) +} + +func (UnimplementedSSOServiceHandler) ListDomains(context.Context, *connect.Request[v1.ListDomainsRequest]) (*connect.Response[v1.ListDomainsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.ListDomains is not implemented")) +} + +func (UnimplementedSSOServiceHandler) RemoveDomain(context.Context, *connect.Request[v1.RemoveDomainRequest]) (*connect.Response[v1.RemoveDomainResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.RemoveDomain is not implemented")) +} + +func (UnimplementedSSOServiceHandler) VerifyDomain(context.Context, *connect.Request[v1.VerifyDomainRequest]) (*connect.Response[v1.VerifyDomainResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.VerifyDomain is not implemented")) +} + +func (UnimplementedSSOServiceHandler) LookupIdPByEmail(context.Context, *connect.Request[v1.LookupIdPByEmailRequest]) (*connect.Response[v1.LookupIdPByEmailResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail is not implemented")) +} + +func (UnimplementedSSOServiceHandler) TestCredentials(context.Context, *connect.Request[v1.TestCredentialsRequest]) (*connect.Response[v1.TestCredentialsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.SSOService.TestCredentials is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.gw.go new file mode 100644 index 0000000000..f54a6b3a60 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/sso.connect.gw.go @@ -0,0 +1,99 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/sso.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// SSOServiceGatewayServer implements the gRPC server API for the SSOService service. +type SSOServiceGatewayServer struct { + v1.UnimplementedSSOServiceServer + createIdentityProvider connect_gateway.UnaryHandler[v1.CreateIdentityProviderRequest, v1.CreateIdentityProviderResponse] + getIdentityProvider connect_gateway.UnaryHandler[v1.GetIdentityProviderRequest, v1.GetIdentityProviderResponse] + listIdentityProviders connect_gateway.UnaryHandler[v1.ListIdentityProvidersRequest, v1.ListIdentityProvidersResponse] + updateIdentityProvider connect_gateway.UnaryHandler[v1.UpdateIdentityProviderRequest, v1.UpdateIdentityProviderResponse] + deleteIdentityProvider connect_gateway.UnaryHandler[v1.DeleteIdentityProviderRequest, v1.DeleteIdentityProviderResponse] + addDomain connect_gateway.UnaryHandler[v1.AddDomainRequest, v1.AddDomainResponse] + listDomains connect_gateway.UnaryHandler[v1.ListDomainsRequest, v1.ListDomainsResponse] + removeDomain connect_gateway.UnaryHandler[v1.RemoveDomainRequest, v1.RemoveDomainResponse] + verifyDomain connect_gateway.UnaryHandler[v1.VerifyDomainRequest, v1.VerifyDomainResponse] + lookupIdPByEmail connect_gateway.UnaryHandler[v1.LookupIdPByEmailRequest, v1.LookupIdPByEmailResponse] + testCredentials connect_gateway.UnaryHandler[v1.TestCredentialsRequest, v1.TestCredentialsResponse] +} + +// NewSSOServiceGatewayServer constructs a Connect-Gateway gRPC server for the SSOService service. +func NewSSOServiceGatewayServer(svc SSOServiceHandler, opts ...connect_gateway.HandlerOption) *SSOServiceGatewayServer { + return &SSOServiceGatewayServer{ + createIdentityProvider: connect_gateway.NewUnaryHandler(SSOServiceCreateIdentityProviderProcedure, svc.CreateIdentityProvider, opts...), + getIdentityProvider: connect_gateway.NewUnaryHandler(SSOServiceGetIdentityProviderProcedure, svc.GetIdentityProvider, opts...), + listIdentityProviders: connect_gateway.NewUnaryHandler(SSOServiceListIdentityProvidersProcedure, svc.ListIdentityProviders, opts...), + updateIdentityProvider: connect_gateway.NewUnaryHandler(SSOServiceUpdateIdentityProviderProcedure, svc.UpdateIdentityProvider, opts...), + deleteIdentityProvider: connect_gateway.NewUnaryHandler(SSOServiceDeleteIdentityProviderProcedure, svc.DeleteIdentityProvider, opts...), + addDomain: connect_gateway.NewUnaryHandler(SSOServiceAddDomainProcedure, svc.AddDomain, opts...), + listDomains: connect_gateway.NewUnaryHandler(SSOServiceListDomainsProcedure, svc.ListDomains, opts...), + removeDomain: connect_gateway.NewUnaryHandler(SSOServiceRemoveDomainProcedure, svc.RemoveDomain, opts...), + verifyDomain: connect_gateway.NewUnaryHandler(SSOServiceVerifyDomainProcedure, svc.VerifyDomain, opts...), + lookupIdPByEmail: connect_gateway.NewUnaryHandler(SSOServiceLookupIdPByEmailProcedure, svc.LookupIdPByEmail, opts...), + testCredentials: connect_gateway.NewUnaryHandler(SSOServiceTestCredentialsProcedure, svc.TestCredentials, opts...), + } +} + +func (s *SSOServiceGatewayServer) CreateIdentityProvider(ctx context.Context, req *v1.CreateIdentityProviderRequest) (*v1.CreateIdentityProviderResponse, error) { + return s.createIdentityProvider(ctx, req) +} + +func (s *SSOServiceGatewayServer) GetIdentityProvider(ctx context.Context, req *v1.GetIdentityProviderRequest) (*v1.GetIdentityProviderResponse, error) { + return s.getIdentityProvider(ctx, req) +} + +func (s *SSOServiceGatewayServer) ListIdentityProviders(ctx context.Context, req *v1.ListIdentityProvidersRequest) (*v1.ListIdentityProvidersResponse, error) { + return s.listIdentityProviders(ctx, req) +} + +func (s *SSOServiceGatewayServer) UpdateIdentityProvider(ctx context.Context, req *v1.UpdateIdentityProviderRequest) (*v1.UpdateIdentityProviderResponse, error) { + return s.updateIdentityProvider(ctx, req) +} + +func (s *SSOServiceGatewayServer) DeleteIdentityProvider(ctx context.Context, req *v1.DeleteIdentityProviderRequest) (*v1.DeleteIdentityProviderResponse, error) { + return s.deleteIdentityProvider(ctx, req) +} + +func (s *SSOServiceGatewayServer) AddDomain(ctx context.Context, req *v1.AddDomainRequest) (*v1.AddDomainResponse, error) { + return s.addDomain(ctx, req) +} + +func (s *SSOServiceGatewayServer) ListDomains(ctx context.Context, req *v1.ListDomainsRequest) (*v1.ListDomainsResponse, error) { + return s.listDomains(ctx, req) +} + +func (s *SSOServiceGatewayServer) RemoveDomain(ctx context.Context, req *v1.RemoveDomainRequest) (*v1.RemoveDomainResponse, error) { + return s.removeDomain(ctx, req) +} + +func (s *SSOServiceGatewayServer) VerifyDomain(ctx context.Context, req *v1.VerifyDomainRequest) (*v1.VerifyDomainResponse, error) { + return s.verifyDomain(ctx, req) +} + +func (s *SSOServiceGatewayServer) LookupIdPByEmail(ctx context.Context, req *v1.LookupIdPByEmailRequest) (*v1.LookupIdPByEmailResponse, error) { + return s.lookupIdPByEmail(ctx, req) +} + +func (s *SSOServiceGatewayServer) TestCredentials(ctx context.Context, req *v1.TestCredentialsRequest) (*v1.TestCredentialsResponse, error) { + return s.testCredentials(ctx, req) +} + +// RegisterSSOServiceHandlerGatewayServer registers the Connect handlers for the SSOService "svc" to +// "mux". +func RegisterSSOServiceHandlerGatewayServer(mux *runtime.ServeMux, svc SSOServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterSSOServiceHandlerServer(context.TODO(), mux, NewSSOServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.go new file mode 100644 index 0000000000..805c47cadd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.go @@ -0,0 +1,399 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/team.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // TeamServiceName is the fully-qualified name of the TeamService service. + TeamServiceName = "redpanda.api.aigateway.v1.TeamService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // TeamServiceCreateTeamProcedure is the fully-qualified name of the TeamService's CreateTeam RPC. + TeamServiceCreateTeamProcedure = "/redpanda.api.aigateway.v1.TeamService/CreateTeam" + // TeamServiceGetTeamProcedure is the fully-qualified name of the TeamService's GetTeam RPC. + TeamServiceGetTeamProcedure = "/redpanda.api.aigateway.v1.TeamService/GetTeam" + // TeamServiceListTeamsProcedure is the fully-qualified name of the TeamService's ListTeams RPC. + TeamServiceListTeamsProcedure = "/redpanda.api.aigateway.v1.TeamService/ListTeams" + // TeamServiceUpdateTeamProcedure is the fully-qualified name of the TeamService's UpdateTeam RPC. + TeamServiceUpdateTeamProcedure = "/redpanda.api.aigateway.v1.TeamService/UpdateTeam" + // TeamServiceDeleteTeamProcedure is the fully-qualified name of the TeamService's DeleteTeam RPC. + TeamServiceDeleteTeamProcedure = "/redpanda.api.aigateway.v1.TeamService/DeleteTeam" + // TeamServiceAddTeamMemberProcedure is the fully-qualified name of the TeamService's AddTeamMember + // RPC. + TeamServiceAddTeamMemberProcedure = "/redpanda.api.aigateway.v1.TeamService/AddTeamMember" + // TeamServiceGetTeamMemberProcedure is the fully-qualified name of the TeamService's GetTeamMember + // RPC. + TeamServiceGetTeamMemberProcedure = "/redpanda.api.aigateway.v1.TeamService/GetTeamMember" + // TeamServiceListTeamMembersProcedure is the fully-qualified name of the TeamService's + // ListTeamMembers RPC. + TeamServiceListTeamMembersProcedure = "/redpanda.api.aigateway.v1.TeamService/ListTeamMembers" + // TeamServiceUpdateTeamMemberProcedure is the fully-qualified name of the TeamService's + // UpdateTeamMember RPC. + TeamServiceUpdateTeamMemberProcedure = "/redpanda.api.aigateway.v1.TeamService/UpdateTeamMember" + // TeamServiceRemoveTeamMemberProcedure is the fully-qualified name of the TeamService's + // RemoveTeamMember RPC. + TeamServiceRemoveTeamMemberProcedure = "/redpanda.api.aigateway.v1.TeamService/RemoveTeamMember" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + teamServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_team_proto.Services().ByName("TeamService") + teamServiceCreateTeamMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("CreateTeam") + teamServiceGetTeamMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("GetTeam") + teamServiceListTeamsMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("ListTeams") + teamServiceUpdateTeamMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("UpdateTeam") + teamServiceDeleteTeamMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("DeleteTeam") + teamServiceAddTeamMemberMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("AddTeamMember") + teamServiceGetTeamMemberMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("GetTeamMember") + teamServiceListTeamMembersMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("ListTeamMembers") + teamServiceUpdateTeamMemberMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("UpdateTeamMember") + teamServiceRemoveTeamMemberMethodDescriptor = teamServiceServiceDescriptor.Methods().ByName("RemoveTeamMember") +) + +// TeamServiceClient is a client for the redpanda.api.aigateway.v1.TeamService service. +type TeamServiceClient interface { + // Creates a new team within an organization. + CreateTeam(context.Context, *connect.Request[v1.CreateTeamRequest]) (*connect.Response[v1.CreateTeamResponse], error) + // Gets a team by name. + GetTeam(context.Context, *connect.Request[v1.GetTeamRequest]) (*connect.Response[v1.GetTeamResponse], error) + // Lists teams within an organization. + ListTeams(context.Context, *connect.Request[v1.ListTeamsRequest]) (*connect.Response[v1.ListTeamsResponse], error) + // Updates a team. + UpdateTeam(context.Context, *connect.Request[v1.UpdateTeamRequest]) (*connect.Response[v1.UpdateTeamResponse], error) + // Deletes a team. + DeleteTeam(context.Context, *connect.Request[v1.DeleteTeamRequest]) (*connect.Response[v1.DeleteTeamResponse], error) + // Adds a user to a team. + AddTeamMember(context.Context, *connect.Request[v1.AddTeamMemberRequest]) (*connect.Response[v1.AddTeamMemberResponse], error) + // Gets a team membership. + GetTeamMember(context.Context, *connect.Request[v1.GetTeamMemberRequest]) (*connect.Response[v1.GetTeamMemberResponse], error) + // Lists members of a team. + ListTeamMembers(context.Context, *connect.Request[v1.ListTeamMembersRequest]) (*connect.Response[v1.ListTeamMembersResponse], error) + // Updates a team member's role. + UpdateTeamMember(context.Context, *connect.Request[v1.UpdateTeamMemberRequest]) (*connect.Response[v1.UpdateTeamMemberResponse], error) + // Removes a user from a team. + RemoveTeamMember(context.Context, *connect.Request[v1.RemoveTeamMemberRequest]) (*connect.Response[v1.RemoveTeamMemberResponse], error) +} + +// NewTeamServiceClient constructs a client for the redpanda.api.aigateway.v1.TeamService service. +// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped +// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewTeamServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) TeamServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &teamServiceClient{ + createTeam: connect.NewClient[v1.CreateTeamRequest, v1.CreateTeamResponse]( + httpClient, + baseURL+TeamServiceCreateTeamProcedure, + connect.WithSchema(teamServiceCreateTeamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getTeam: connect.NewClient[v1.GetTeamRequest, v1.GetTeamResponse]( + httpClient, + baseURL+TeamServiceGetTeamProcedure, + connect.WithSchema(teamServiceGetTeamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listTeams: connect.NewClient[v1.ListTeamsRequest, v1.ListTeamsResponse]( + httpClient, + baseURL+TeamServiceListTeamsProcedure, + connect.WithSchema(teamServiceListTeamsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateTeam: connect.NewClient[v1.UpdateTeamRequest, v1.UpdateTeamResponse]( + httpClient, + baseURL+TeamServiceUpdateTeamProcedure, + connect.WithSchema(teamServiceUpdateTeamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteTeam: connect.NewClient[v1.DeleteTeamRequest, v1.DeleteTeamResponse]( + httpClient, + baseURL+TeamServiceDeleteTeamProcedure, + connect.WithSchema(teamServiceDeleteTeamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + addTeamMember: connect.NewClient[v1.AddTeamMemberRequest, v1.AddTeamMemberResponse]( + httpClient, + baseURL+TeamServiceAddTeamMemberProcedure, + connect.WithSchema(teamServiceAddTeamMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getTeamMember: connect.NewClient[v1.GetTeamMemberRequest, v1.GetTeamMemberResponse]( + httpClient, + baseURL+TeamServiceGetTeamMemberProcedure, + connect.WithSchema(teamServiceGetTeamMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listTeamMembers: connect.NewClient[v1.ListTeamMembersRequest, v1.ListTeamMembersResponse]( + httpClient, + baseURL+TeamServiceListTeamMembersProcedure, + connect.WithSchema(teamServiceListTeamMembersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateTeamMember: connect.NewClient[v1.UpdateTeamMemberRequest, v1.UpdateTeamMemberResponse]( + httpClient, + baseURL+TeamServiceUpdateTeamMemberProcedure, + connect.WithSchema(teamServiceUpdateTeamMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + removeTeamMember: connect.NewClient[v1.RemoveTeamMemberRequest, v1.RemoveTeamMemberResponse]( + httpClient, + baseURL+TeamServiceRemoveTeamMemberProcedure, + connect.WithSchema(teamServiceRemoveTeamMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// teamServiceClient implements TeamServiceClient. +type teamServiceClient struct { + createTeam *connect.Client[v1.CreateTeamRequest, v1.CreateTeamResponse] + getTeam *connect.Client[v1.GetTeamRequest, v1.GetTeamResponse] + listTeams *connect.Client[v1.ListTeamsRequest, v1.ListTeamsResponse] + updateTeam *connect.Client[v1.UpdateTeamRequest, v1.UpdateTeamResponse] + deleteTeam *connect.Client[v1.DeleteTeamRequest, v1.DeleteTeamResponse] + addTeamMember *connect.Client[v1.AddTeamMemberRequest, v1.AddTeamMemberResponse] + getTeamMember *connect.Client[v1.GetTeamMemberRequest, v1.GetTeamMemberResponse] + listTeamMembers *connect.Client[v1.ListTeamMembersRequest, v1.ListTeamMembersResponse] + updateTeamMember *connect.Client[v1.UpdateTeamMemberRequest, v1.UpdateTeamMemberResponse] + removeTeamMember *connect.Client[v1.RemoveTeamMemberRequest, v1.RemoveTeamMemberResponse] +} + +// CreateTeam calls redpanda.api.aigateway.v1.TeamService.CreateTeam. +func (c *teamServiceClient) CreateTeam(ctx context.Context, req *connect.Request[v1.CreateTeamRequest]) (*connect.Response[v1.CreateTeamResponse], error) { + return c.createTeam.CallUnary(ctx, req) +} + +// GetTeam calls redpanda.api.aigateway.v1.TeamService.GetTeam. +func (c *teamServiceClient) GetTeam(ctx context.Context, req *connect.Request[v1.GetTeamRequest]) (*connect.Response[v1.GetTeamResponse], error) { + return c.getTeam.CallUnary(ctx, req) +} + +// ListTeams calls redpanda.api.aigateway.v1.TeamService.ListTeams. +func (c *teamServiceClient) ListTeams(ctx context.Context, req *connect.Request[v1.ListTeamsRequest]) (*connect.Response[v1.ListTeamsResponse], error) { + return c.listTeams.CallUnary(ctx, req) +} + +// UpdateTeam calls redpanda.api.aigateway.v1.TeamService.UpdateTeam. +func (c *teamServiceClient) UpdateTeam(ctx context.Context, req *connect.Request[v1.UpdateTeamRequest]) (*connect.Response[v1.UpdateTeamResponse], error) { + return c.updateTeam.CallUnary(ctx, req) +} + +// DeleteTeam calls redpanda.api.aigateway.v1.TeamService.DeleteTeam. +func (c *teamServiceClient) DeleteTeam(ctx context.Context, req *connect.Request[v1.DeleteTeamRequest]) (*connect.Response[v1.DeleteTeamResponse], error) { + return c.deleteTeam.CallUnary(ctx, req) +} + +// AddTeamMember calls redpanda.api.aigateway.v1.TeamService.AddTeamMember. +func (c *teamServiceClient) AddTeamMember(ctx context.Context, req *connect.Request[v1.AddTeamMemberRequest]) (*connect.Response[v1.AddTeamMemberResponse], error) { + return c.addTeamMember.CallUnary(ctx, req) +} + +// GetTeamMember calls redpanda.api.aigateway.v1.TeamService.GetTeamMember. +func (c *teamServiceClient) GetTeamMember(ctx context.Context, req *connect.Request[v1.GetTeamMemberRequest]) (*connect.Response[v1.GetTeamMemberResponse], error) { + return c.getTeamMember.CallUnary(ctx, req) +} + +// ListTeamMembers calls redpanda.api.aigateway.v1.TeamService.ListTeamMembers. +func (c *teamServiceClient) ListTeamMembers(ctx context.Context, req *connect.Request[v1.ListTeamMembersRequest]) (*connect.Response[v1.ListTeamMembersResponse], error) { + return c.listTeamMembers.CallUnary(ctx, req) +} + +// UpdateTeamMember calls redpanda.api.aigateway.v1.TeamService.UpdateTeamMember. +func (c *teamServiceClient) UpdateTeamMember(ctx context.Context, req *connect.Request[v1.UpdateTeamMemberRequest]) (*connect.Response[v1.UpdateTeamMemberResponse], error) { + return c.updateTeamMember.CallUnary(ctx, req) +} + +// RemoveTeamMember calls redpanda.api.aigateway.v1.TeamService.RemoveTeamMember. +func (c *teamServiceClient) RemoveTeamMember(ctx context.Context, req *connect.Request[v1.RemoveTeamMemberRequest]) (*connect.Response[v1.RemoveTeamMemberResponse], error) { + return c.removeTeamMember.CallUnary(ctx, req) +} + +// TeamServiceHandler is an implementation of the redpanda.api.aigateway.v1.TeamService service. +type TeamServiceHandler interface { + // Creates a new team within an organization. + CreateTeam(context.Context, *connect.Request[v1.CreateTeamRequest]) (*connect.Response[v1.CreateTeamResponse], error) + // Gets a team by name. + GetTeam(context.Context, *connect.Request[v1.GetTeamRequest]) (*connect.Response[v1.GetTeamResponse], error) + // Lists teams within an organization. + ListTeams(context.Context, *connect.Request[v1.ListTeamsRequest]) (*connect.Response[v1.ListTeamsResponse], error) + // Updates a team. + UpdateTeam(context.Context, *connect.Request[v1.UpdateTeamRequest]) (*connect.Response[v1.UpdateTeamResponse], error) + // Deletes a team. + DeleteTeam(context.Context, *connect.Request[v1.DeleteTeamRequest]) (*connect.Response[v1.DeleteTeamResponse], error) + // Adds a user to a team. + AddTeamMember(context.Context, *connect.Request[v1.AddTeamMemberRequest]) (*connect.Response[v1.AddTeamMemberResponse], error) + // Gets a team membership. + GetTeamMember(context.Context, *connect.Request[v1.GetTeamMemberRequest]) (*connect.Response[v1.GetTeamMemberResponse], error) + // Lists members of a team. + ListTeamMembers(context.Context, *connect.Request[v1.ListTeamMembersRequest]) (*connect.Response[v1.ListTeamMembersResponse], error) + // Updates a team member's role. + UpdateTeamMember(context.Context, *connect.Request[v1.UpdateTeamMemberRequest]) (*connect.Response[v1.UpdateTeamMemberResponse], error) + // Removes a user from a team. + RemoveTeamMember(context.Context, *connect.Request[v1.RemoveTeamMemberRequest]) (*connect.Response[v1.RemoveTeamMemberResponse], error) +} + +// NewTeamServiceHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewTeamServiceHandler(svc TeamServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + teamServiceCreateTeamHandler := connect.NewUnaryHandler( + TeamServiceCreateTeamProcedure, + svc.CreateTeam, + connect.WithSchema(teamServiceCreateTeamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceGetTeamHandler := connect.NewUnaryHandler( + TeamServiceGetTeamProcedure, + svc.GetTeam, + connect.WithSchema(teamServiceGetTeamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceListTeamsHandler := connect.NewUnaryHandler( + TeamServiceListTeamsProcedure, + svc.ListTeams, + connect.WithSchema(teamServiceListTeamsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceUpdateTeamHandler := connect.NewUnaryHandler( + TeamServiceUpdateTeamProcedure, + svc.UpdateTeam, + connect.WithSchema(teamServiceUpdateTeamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceDeleteTeamHandler := connect.NewUnaryHandler( + TeamServiceDeleteTeamProcedure, + svc.DeleteTeam, + connect.WithSchema(teamServiceDeleteTeamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceAddTeamMemberHandler := connect.NewUnaryHandler( + TeamServiceAddTeamMemberProcedure, + svc.AddTeamMember, + connect.WithSchema(teamServiceAddTeamMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceGetTeamMemberHandler := connect.NewUnaryHandler( + TeamServiceGetTeamMemberProcedure, + svc.GetTeamMember, + connect.WithSchema(teamServiceGetTeamMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceListTeamMembersHandler := connect.NewUnaryHandler( + TeamServiceListTeamMembersProcedure, + svc.ListTeamMembers, + connect.WithSchema(teamServiceListTeamMembersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceUpdateTeamMemberHandler := connect.NewUnaryHandler( + TeamServiceUpdateTeamMemberProcedure, + svc.UpdateTeamMember, + connect.WithSchema(teamServiceUpdateTeamMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + teamServiceRemoveTeamMemberHandler := connect.NewUnaryHandler( + TeamServiceRemoveTeamMemberProcedure, + svc.RemoveTeamMember, + connect.WithSchema(teamServiceRemoveTeamMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.TeamService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case TeamServiceCreateTeamProcedure: + teamServiceCreateTeamHandler.ServeHTTP(w, r) + case TeamServiceGetTeamProcedure: + teamServiceGetTeamHandler.ServeHTTP(w, r) + case TeamServiceListTeamsProcedure: + teamServiceListTeamsHandler.ServeHTTP(w, r) + case TeamServiceUpdateTeamProcedure: + teamServiceUpdateTeamHandler.ServeHTTP(w, r) + case TeamServiceDeleteTeamProcedure: + teamServiceDeleteTeamHandler.ServeHTTP(w, r) + case TeamServiceAddTeamMemberProcedure: + teamServiceAddTeamMemberHandler.ServeHTTP(w, r) + case TeamServiceGetTeamMemberProcedure: + teamServiceGetTeamMemberHandler.ServeHTTP(w, r) + case TeamServiceListTeamMembersProcedure: + teamServiceListTeamMembersHandler.ServeHTTP(w, r) + case TeamServiceUpdateTeamMemberProcedure: + teamServiceUpdateTeamMemberHandler.ServeHTTP(w, r) + case TeamServiceRemoveTeamMemberProcedure: + teamServiceRemoveTeamMemberHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedTeamServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedTeamServiceHandler struct{} + +func (UnimplementedTeamServiceHandler) CreateTeam(context.Context, *connect.Request[v1.CreateTeamRequest]) (*connect.Response[v1.CreateTeamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.CreateTeam is not implemented")) +} + +func (UnimplementedTeamServiceHandler) GetTeam(context.Context, *connect.Request[v1.GetTeamRequest]) (*connect.Response[v1.GetTeamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.GetTeam is not implemented")) +} + +func (UnimplementedTeamServiceHandler) ListTeams(context.Context, *connect.Request[v1.ListTeamsRequest]) (*connect.Response[v1.ListTeamsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.ListTeams is not implemented")) +} + +func (UnimplementedTeamServiceHandler) UpdateTeam(context.Context, *connect.Request[v1.UpdateTeamRequest]) (*connect.Response[v1.UpdateTeamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.UpdateTeam is not implemented")) +} + +func (UnimplementedTeamServiceHandler) DeleteTeam(context.Context, *connect.Request[v1.DeleteTeamRequest]) (*connect.Response[v1.DeleteTeamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.DeleteTeam is not implemented")) +} + +func (UnimplementedTeamServiceHandler) AddTeamMember(context.Context, *connect.Request[v1.AddTeamMemberRequest]) (*connect.Response[v1.AddTeamMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.AddTeamMember is not implemented")) +} + +func (UnimplementedTeamServiceHandler) GetTeamMember(context.Context, *connect.Request[v1.GetTeamMemberRequest]) (*connect.Response[v1.GetTeamMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.GetTeamMember is not implemented")) +} + +func (UnimplementedTeamServiceHandler) ListTeamMembers(context.Context, *connect.Request[v1.ListTeamMembersRequest]) (*connect.Response[v1.ListTeamMembersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.ListTeamMembers is not implemented")) +} + +func (UnimplementedTeamServiceHandler) UpdateTeamMember(context.Context, *connect.Request[v1.UpdateTeamMemberRequest]) (*connect.Response[v1.UpdateTeamMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.UpdateTeamMember is not implemented")) +} + +func (UnimplementedTeamServiceHandler) RemoveTeamMember(context.Context, *connect.Request[v1.RemoveTeamMemberRequest]) (*connect.Response[v1.RemoveTeamMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.TeamService.RemoveTeamMember is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.gw.go new file mode 100644 index 0000000000..f0971f7199 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/team.connect.gw.go @@ -0,0 +1,93 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/team.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// TeamServiceGatewayServer implements the gRPC server API for the TeamService service. +type TeamServiceGatewayServer struct { + v1.UnimplementedTeamServiceServer + createTeam connect_gateway.UnaryHandler[v1.CreateTeamRequest, v1.CreateTeamResponse] + getTeam connect_gateway.UnaryHandler[v1.GetTeamRequest, v1.GetTeamResponse] + listTeams connect_gateway.UnaryHandler[v1.ListTeamsRequest, v1.ListTeamsResponse] + updateTeam connect_gateway.UnaryHandler[v1.UpdateTeamRequest, v1.UpdateTeamResponse] + deleteTeam connect_gateway.UnaryHandler[v1.DeleteTeamRequest, v1.DeleteTeamResponse] + addTeamMember connect_gateway.UnaryHandler[v1.AddTeamMemberRequest, v1.AddTeamMemberResponse] + getTeamMember connect_gateway.UnaryHandler[v1.GetTeamMemberRequest, v1.GetTeamMemberResponse] + listTeamMembers connect_gateway.UnaryHandler[v1.ListTeamMembersRequest, v1.ListTeamMembersResponse] + updateTeamMember connect_gateway.UnaryHandler[v1.UpdateTeamMemberRequest, v1.UpdateTeamMemberResponse] + removeTeamMember connect_gateway.UnaryHandler[v1.RemoveTeamMemberRequest, v1.RemoveTeamMemberResponse] +} + +// NewTeamServiceGatewayServer constructs a Connect-Gateway gRPC server for the TeamService service. +func NewTeamServiceGatewayServer(svc TeamServiceHandler, opts ...connect_gateway.HandlerOption) *TeamServiceGatewayServer { + return &TeamServiceGatewayServer{ + createTeam: connect_gateway.NewUnaryHandler(TeamServiceCreateTeamProcedure, svc.CreateTeam, opts...), + getTeam: connect_gateway.NewUnaryHandler(TeamServiceGetTeamProcedure, svc.GetTeam, opts...), + listTeams: connect_gateway.NewUnaryHandler(TeamServiceListTeamsProcedure, svc.ListTeams, opts...), + updateTeam: connect_gateway.NewUnaryHandler(TeamServiceUpdateTeamProcedure, svc.UpdateTeam, opts...), + deleteTeam: connect_gateway.NewUnaryHandler(TeamServiceDeleteTeamProcedure, svc.DeleteTeam, opts...), + addTeamMember: connect_gateway.NewUnaryHandler(TeamServiceAddTeamMemberProcedure, svc.AddTeamMember, opts...), + getTeamMember: connect_gateway.NewUnaryHandler(TeamServiceGetTeamMemberProcedure, svc.GetTeamMember, opts...), + listTeamMembers: connect_gateway.NewUnaryHandler(TeamServiceListTeamMembersProcedure, svc.ListTeamMembers, opts...), + updateTeamMember: connect_gateway.NewUnaryHandler(TeamServiceUpdateTeamMemberProcedure, svc.UpdateTeamMember, opts...), + removeTeamMember: connect_gateway.NewUnaryHandler(TeamServiceRemoveTeamMemberProcedure, svc.RemoveTeamMember, opts...), + } +} + +func (s *TeamServiceGatewayServer) CreateTeam(ctx context.Context, req *v1.CreateTeamRequest) (*v1.CreateTeamResponse, error) { + return s.createTeam(ctx, req) +} + +func (s *TeamServiceGatewayServer) GetTeam(ctx context.Context, req *v1.GetTeamRequest) (*v1.GetTeamResponse, error) { + return s.getTeam(ctx, req) +} + +func (s *TeamServiceGatewayServer) ListTeams(ctx context.Context, req *v1.ListTeamsRequest) (*v1.ListTeamsResponse, error) { + return s.listTeams(ctx, req) +} + +func (s *TeamServiceGatewayServer) UpdateTeam(ctx context.Context, req *v1.UpdateTeamRequest) (*v1.UpdateTeamResponse, error) { + return s.updateTeam(ctx, req) +} + +func (s *TeamServiceGatewayServer) DeleteTeam(ctx context.Context, req *v1.DeleteTeamRequest) (*v1.DeleteTeamResponse, error) { + return s.deleteTeam(ctx, req) +} + +func (s *TeamServiceGatewayServer) AddTeamMember(ctx context.Context, req *v1.AddTeamMemberRequest) (*v1.AddTeamMemberResponse, error) { + return s.addTeamMember(ctx, req) +} + +func (s *TeamServiceGatewayServer) GetTeamMember(ctx context.Context, req *v1.GetTeamMemberRequest) (*v1.GetTeamMemberResponse, error) { + return s.getTeamMember(ctx, req) +} + +func (s *TeamServiceGatewayServer) ListTeamMembers(ctx context.Context, req *v1.ListTeamMembersRequest) (*v1.ListTeamMembersResponse, error) { + return s.listTeamMembers(ctx, req) +} + +func (s *TeamServiceGatewayServer) UpdateTeamMember(ctx context.Context, req *v1.UpdateTeamMemberRequest) (*v1.UpdateTeamMemberResponse, error) { + return s.updateTeamMember(ctx, req) +} + +func (s *TeamServiceGatewayServer) RemoveTeamMember(ctx context.Context, req *v1.RemoveTeamMemberRequest) (*v1.RemoveTeamMemberResponse, error) { + return s.removeTeamMember(ctx, req) +} + +// RegisterTeamServiceHandlerGatewayServer registers the Connect handlers for the TeamService "svc" +// to "mux". +func RegisterTeamServiceHandlerGatewayServer(mux *runtime.ServeMux, svc TeamServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterTeamServiceHandlerServer(context.TODO(), mux, NewTeamServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.go new file mode 100644 index 0000000000..d4ba17b142 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.go @@ -0,0 +1,503 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/user.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // UserServiceName is the fully-qualified name of the UserService service. + UserServiceName = "redpanda.api.aigateway.v1.UserService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // UserServiceCreateUserProcedure is the fully-qualified name of the UserService's CreateUser RPC. + UserServiceCreateUserProcedure = "/redpanda.api.aigateway.v1.UserService/CreateUser" + // UserServiceGetUserProcedure is the fully-qualified name of the UserService's GetUser RPC. + UserServiceGetUserProcedure = "/redpanda.api.aigateway.v1.UserService/GetUser" + // UserServiceListUsersProcedure is the fully-qualified name of the UserService's ListUsers RPC. + UserServiceListUsersProcedure = "/redpanda.api.aigateway.v1.UserService/ListUsers" + // UserServiceUpdateUserProcedure is the fully-qualified name of the UserService's UpdateUser RPC. + UserServiceUpdateUserProcedure = "/redpanda.api.aigateway.v1.UserService/UpdateUser" + // UserServiceDeleteUserProcedure is the fully-qualified name of the UserService's DeleteUser RPC. + UserServiceDeleteUserProcedure = "/redpanda.api.aigateway.v1.UserService/DeleteUser" + // UserServiceListUserOrganizationsProcedure is the fully-qualified name of the UserService's + // ListUserOrganizations RPC. + UserServiceListUserOrganizationsProcedure = "/redpanda.api.aigateway.v1.UserService/ListUserOrganizations" + // UserServiceAddUserToOrganizationProcedure is the fully-qualified name of the UserService's + // AddUserToOrganization RPC. + UserServiceAddUserToOrganizationProcedure = "/redpanda.api.aigateway.v1.UserService/AddUserToOrganization" + // UserServiceUpdateUserOrganizationRoleProcedure is the fully-qualified name of the UserService's + // UpdateUserOrganizationRole RPC. + UserServiceUpdateUserOrganizationRoleProcedure = "/redpanda.api.aigateway.v1.UserService/UpdateUserOrganizationRole" + // UserServiceRemoveUserFromOrganizationProcedure is the fully-qualified name of the UserService's + // RemoveUserFromOrganization RPC. + UserServiceRemoveUserFromOrganizationProcedure = "/redpanda.api.aigateway.v1.UserService/RemoveUserFromOrganization" + // UserServiceListUserTeamsProcedure is the fully-qualified name of the UserService's ListUserTeams + // RPC. + UserServiceListUserTeamsProcedure = "/redpanda.api.aigateway.v1.UserService/ListUserTeams" + // UserServiceGetPersonalTokenInfoProcedure is the fully-qualified name of the UserService's + // GetPersonalTokenInfo RPC. + UserServiceGetPersonalTokenInfoProcedure = "/redpanda.api.aigateway.v1.UserService/GetPersonalTokenInfo" + // UserServiceRotatePersonalTokenProcedure is the fully-qualified name of the UserService's + // RotatePersonalToken RPC. + UserServiceRotatePersonalTokenProcedure = "/redpanda.api.aigateway.v1.UserService/RotatePersonalToken" + // UserServiceRevealPersonalTokenProcedure is the fully-qualified name of the UserService's + // RevealPersonalToken RPC. + UserServiceRevealPersonalTokenProcedure = "/redpanda.api.aigateway.v1.UserService/RevealPersonalToken" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + userServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_user_proto.Services().ByName("UserService") + userServiceCreateUserMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("CreateUser") + userServiceGetUserMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("GetUser") + userServiceListUsersMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("ListUsers") + userServiceUpdateUserMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("UpdateUser") + userServiceDeleteUserMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("DeleteUser") + userServiceListUserOrganizationsMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("ListUserOrganizations") + userServiceAddUserToOrganizationMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("AddUserToOrganization") + userServiceUpdateUserOrganizationRoleMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("UpdateUserOrganizationRole") + userServiceRemoveUserFromOrganizationMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("RemoveUserFromOrganization") + userServiceListUserTeamsMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("ListUserTeams") + userServiceGetPersonalTokenInfoMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("GetPersonalTokenInfo") + userServiceRotatePersonalTokenMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("RotatePersonalToken") + userServiceRevealPersonalTokenMethodDescriptor = userServiceServiceDescriptor.Methods().ByName("RevealPersonalToken") +) + +// UserServiceClient is a client for the redpanda.api.aigateway.v1.UserService service. +type UserServiceClient interface { + // Creates a new user within an account. + CreateUser(context.Context, *connect.Request[v1.CreateUserRequest]) (*connect.Response[v1.CreateUserResponse], error) + // Gets a user by name. + GetUser(context.Context, *connect.Request[v1.GetUserRequest]) (*connect.Response[v1.GetUserResponse], error) + // Lists users within an account. + ListUsers(context.Context, *connect.Request[v1.ListUsersRequest]) (*connect.Response[v1.ListUsersResponse], error) + // Updates a user. + UpdateUser(context.Context, *connect.Request[v1.UpdateUserRequest]) (*connect.Response[v1.UpdateUserResponse], error) + // Deletes a user. + DeleteUser(context.Context, *connect.Request[v1.DeleteUserRequest]) (*connect.Response[v1.DeleteUserResponse], error) + // Lists organizations that a user belongs to. + ListUserOrganizations(context.Context, *connect.Request[v1.ListUserOrganizationsRequest]) (*connect.Response[v1.ListUserOrganizationsResponse], error) + // Adds a user to an organization. + AddUserToOrganization(context.Context, *connect.Request[v1.AddUserToOrganizationRequest]) (*connect.Response[v1.AddUserToOrganizationResponse], error) + // Updates a user's role in an organization. + UpdateUserOrganizationRole(context.Context, *connect.Request[v1.UpdateUserOrganizationRoleRequest]) (*connect.Response[v1.UpdateUserOrganizationRoleResponse], error) + // Removes a user from an organization. + RemoveUserFromOrganization(context.Context, *connect.Request[v1.RemoveUserFromOrganizationRequest]) (*connect.Response[v1.RemoveUserFromOrganizationResponse], error) + // Lists teams that a user belongs to. + ListUserTeams(context.Context, *connect.Request[v1.ListUserTeamsRequest]) (*connect.Response[v1.ListUserTeamsResponse], error) + // Gets information about a user's personal access token (non-secret info only). + GetPersonalTokenInfo(context.Context, *connect.Request[v1.GetPersonalTokenInfoRequest]) (*connect.Response[v1.GetPersonalTokenInfoResponse], error) + // Rotates a user's personal access token. + // The old token is invalidated and a new one is generated. + // The new token is returned only once and should be stored securely. + RotatePersonalToken(context.Context, *connect.Request[v1.RotatePersonalTokenRequest]) (*connect.Response[v1.RotatePersonalTokenResponse], error) + // Reveals the user's personal access token. + // Requires re-authentication with the user's password for security. + RevealPersonalToken(context.Context, *connect.Request[v1.RevealPersonalTokenRequest]) (*connect.Response[v1.RevealPersonalTokenResponse], error) +} + +// NewUserServiceClient constructs a client for the redpanda.api.aigateway.v1.UserService service. +// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped +// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewUserServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) UserServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &userServiceClient{ + createUser: connect.NewClient[v1.CreateUserRequest, v1.CreateUserResponse]( + httpClient, + baseURL+UserServiceCreateUserProcedure, + connect.WithSchema(userServiceCreateUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getUser: connect.NewClient[v1.GetUserRequest, v1.GetUserResponse]( + httpClient, + baseURL+UserServiceGetUserProcedure, + connect.WithSchema(userServiceGetUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listUsers: connect.NewClient[v1.ListUsersRequest, v1.ListUsersResponse]( + httpClient, + baseURL+UserServiceListUsersProcedure, + connect.WithSchema(userServiceListUsersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateUser: connect.NewClient[v1.UpdateUserRequest, v1.UpdateUserResponse]( + httpClient, + baseURL+UserServiceUpdateUserProcedure, + connect.WithSchema(userServiceUpdateUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteUser: connect.NewClient[v1.DeleteUserRequest, v1.DeleteUserResponse]( + httpClient, + baseURL+UserServiceDeleteUserProcedure, + connect.WithSchema(userServiceDeleteUserMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listUserOrganizations: connect.NewClient[v1.ListUserOrganizationsRequest, v1.ListUserOrganizationsResponse]( + httpClient, + baseURL+UserServiceListUserOrganizationsProcedure, + connect.WithSchema(userServiceListUserOrganizationsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + addUserToOrganization: connect.NewClient[v1.AddUserToOrganizationRequest, v1.AddUserToOrganizationResponse]( + httpClient, + baseURL+UserServiceAddUserToOrganizationProcedure, + connect.WithSchema(userServiceAddUserToOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateUserOrganizationRole: connect.NewClient[v1.UpdateUserOrganizationRoleRequest, v1.UpdateUserOrganizationRoleResponse]( + httpClient, + baseURL+UserServiceUpdateUserOrganizationRoleProcedure, + connect.WithSchema(userServiceUpdateUserOrganizationRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + removeUserFromOrganization: connect.NewClient[v1.RemoveUserFromOrganizationRequest, v1.RemoveUserFromOrganizationResponse]( + httpClient, + baseURL+UserServiceRemoveUserFromOrganizationProcedure, + connect.WithSchema(userServiceRemoveUserFromOrganizationMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listUserTeams: connect.NewClient[v1.ListUserTeamsRequest, v1.ListUserTeamsResponse]( + httpClient, + baseURL+UserServiceListUserTeamsProcedure, + connect.WithSchema(userServiceListUserTeamsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getPersonalTokenInfo: connect.NewClient[v1.GetPersonalTokenInfoRequest, v1.GetPersonalTokenInfoResponse]( + httpClient, + baseURL+UserServiceGetPersonalTokenInfoProcedure, + connect.WithSchema(userServiceGetPersonalTokenInfoMethodDescriptor), + connect.WithClientOptions(opts...), + ), + rotatePersonalToken: connect.NewClient[v1.RotatePersonalTokenRequest, v1.RotatePersonalTokenResponse]( + httpClient, + baseURL+UserServiceRotatePersonalTokenProcedure, + connect.WithSchema(userServiceRotatePersonalTokenMethodDescriptor), + connect.WithClientOptions(opts...), + ), + revealPersonalToken: connect.NewClient[v1.RevealPersonalTokenRequest, v1.RevealPersonalTokenResponse]( + httpClient, + baseURL+UserServiceRevealPersonalTokenProcedure, + connect.WithSchema(userServiceRevealPersonalTokenMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// userServiceClient implements UserServiceClient. +type userServiceClient struct { + createUser *connect.Client[v1.CreateUserRequest, v1.CreateUserResponse] + getUser *connect.Client[v1.GetUserRequest, v1.GetUserResponse] + listUsers *connect.Client[v1.ListUsersRequest, v1.ListUsersResponse] + updateUser *connect.Client[v1.UpdateUserRequest, v1.UpdateUserResponse] + deleteUser *connect.Client[v1.DeleteUserRequest, v1.DeleteUserResponse] + listUserOrganizations *connect.Client[v1.ListUserOrganizationsRequest, v1.ListUserOrganizationsResponse] + addUserToOrganization *connect.Client[v1.AddUserToOrganizationRequest, v1.AddUserToOrganizationResponse] + updateUserOrganizationRole *connect.Client[v1.UpdateUserOrganizationRoleRequest, v1.UpdateUserOrganizationRoleResponse] + removeUserFromOrganization *connect.Client[v1.RemoveUserFromOrganizationRequest, v1.RemoveUserFromOrganizationResponse] + listUserTeams *connect.Client[v1.ListUserTeamsRequest, v1.ListUserTeamsResponse] + getPersonalTokenInfo *connect.Client[v1.GetPersonalTokenInfoRequest, v1.GetPersonalTokenInfoResponse] + rotatePersonalToken *connect.Client[v1.RotatePersonalTokenRequest, v1.RotatePersonalTokenResponse] + revealPersonalToken *connect.Client[v1.RevealPersonalTokenRequest, v1.RevealPersonalTokenResponse] +} + +// CreateUser calls redpanda.api.aigateway.v1.UserService.CreateUser. +func (c *userServiceClient) CreateUser(ctx context.Context, req *connect.Request[v1.CreateUserRequest]) (*connect.Response[v1.CreateUserResponse], error) { + return c.createUser.CallUnary(ctx, req) +} + +// GetUser calls redpanda.api.aigateway.v1.UserService.GetUser. +func (c *userServiceClient) GetUser(ctx context.Context, req *connect.Request[v1.GetUserRequest]) (*connect.Response[v1.GetUserResponse], error) { + return c.getUser.CallUnary(ctx, req) +} + +// ListUsers calls redpanda.api.aigateway.v1.UserService.ListUsers. +func (c *userServiceClient) ListUsers(ctx context.Context, req *connect.Request[v1.ListUsersRequest]) (*connect.Response[v1.ListUsersResponse], error) { + return c.listUsers.CallUnary(ctx, req) +} + +// UpdateUser calls redpanda.api.aigateway.v1.UserService.UpdateUser. +func (c *userServiceClient) UpdateUser(ctx context.Context, req *connect.Request[v1.UpdateUserRequest]) (*connect.Response[v1.UpdateUserResponse], error) { + return c.updateUser.CallUnary(ctx, req) +} + +// DeleteUser calls redpanda.api.aigateway.v1.UserService.DeleteUser. +func (c *userServiceClient) DeleteUser(ctx context.Context, req *connect.Request[v1.DeleteUserRequest]) (*connect.Response[v1.DeleteUserResponse], error) { + return c.deleteUser.CallUnary(ctx, req) +} + +// ListUserOrganizations calls redpanda.api.aigateway.v1.UserService.ListUserOrganizations. +func (c *userServiceClient) ListUserOrganizations(ctx context.Context, req *connect.Request[v1.ListUserOrganizationsRequest]) (*connect.Response[v1.ListUserOrganizationsResponse], error) { + return c.listUserOrganizations.CallUnary(ctx, req) +} + +// AddUserToOrganization calls redpanda.api.aigateway.v1.UserService.AddUserToOrganization. +func (c *userServiceClient) AddUserToOrganization(ctx context.Context, req *connect.Request[v1.AddUserToOrganizationRequest]) (*connect.Response[v1.AddUserToOrganizationResponse], error) { + return c.addUserToOrganization.CallUnary(ctx, req) +} + +// UpdateUserOrganizationRole calls +// redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole. +func (c *userServiceClient) UpdateUserOrganizationRole(ctx context.Context, req *connect.Request[v1.UpdateUserOrganizationRoleRequest]) (*connect.Response[v1.UpdateUserOrganizationRoleResponse], error) { + return c.updateUserOrganizationRole.CallUnary(ctx, req) +} + +// RemoveUserFromOrganization calls +// redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization. +func (c *userServiceClient) RemoveUserFromOrganization(ctx context.Context, req *connect.Request[v1.RemoveUserFromOrganizationRequest]) (*connect.Response[v1.RemoveUserFromOrganizationResponse], error) { + return c.removeUserFromOrganization.CallUnary(ctx, req) +} + +// ListUserTeams calls redpanda.api.aigateway.v1.UserService.ListUserTeams. +func (c *userServiceClient) ListUserTeams(ctx context.Context, req *connect.Request[v1.ListUserTeamsRequest]) (*connect.Response[v1.ListUserTeamsResponse], error) { + return c.listUserTeams.CallUnary(ctx, req) +} + +// GetPersonalTokenInfo calls redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo. +func (c *userServiceClient) GetPersonalTokenInfo(ctx context.Context, req *connect.Request[v1.GetPersonalTokenInfoRequest]) (*connect.Response[v1.GetPersonalTokenInfoResponse], error) { + return c.getPersonalTokenInfo.CallUnary(ctx, req) +} + +// RotatePersonalToken calls redpanda.api.aigateway.v1.UserService.RotatePersonalToken. +func (c *userServiceClient) RotatePersonalToken(ctx context.Context, req *connect.Request[v1.RotatePersonalTokenRequest]) (*connect.Response[v1.RotatePersonalTokenResponse], error) { + return c.rotatePersonalToken.CallUnary(ctx, req) +} + +// RevealPersonalToken calls redpanda.api.aigateway.v1.UserService.RevealPersonalToken. +func (c *userServiceClient) RevealPersonalToken(ctx context.Context, req *connect.Request[v1.RevealPersonalTokenRequest]) (*connect.Response[v1.RevealPersonalTokenResponse], error) { + return c.revealPersonalToken.CallUnary(ctx, req) +} + +// UserServiceHandler is an implementation of the redpanda.api.aigateway.v1.UserService service. +type UserServiceHandler interface { + // Creates a new user within an account. + CreateUser(context.Context, *connect.Request[v1.CreateUserRequest]) (*connect.Response[v1.CreateUserResponse], error) + // Gets a user by name. + GetUser(context.Context, *connect.Request[v1.GetUserRequest]) (*connect.Response[v1.GetUserResponse], error) + // Lists users within an account. + ListUsers(context.Context, *connect.Request[v1.ListUsersRequest]) (*connect.Response[v1.ListUsersResponse], error) + // Updates a user. + UpdateUser(context.Context, *connect.Request[v1.UpdateUserRequest]) (*connect.Response[v1.UpdateUserResponse], error) + // Deletes a user. + DeleteUser(context.Context, *connect.Request[v1.DeleteUserRequest]) (*connect.Response[v1.DeleteUserResponse], error) + // Lists organizations that a user belongs to. + ListUserOrganizations(context.Context, *connect.Request[v1.ListUserOrganizationsRequest]) (*connect.Response[v1.ListUserOrganizationsResponse], error) + // Adds a user to an organization. + AddUserToOrganization(context.Context, *connect.Request[v1.AddUserToOrganizationRequest]) (*connect.Response[v1.AddUserToOrganizationResponse], error) + // Updates a user's role in an organization. + UpdateUserOrganizationRole(context.Context, *connect.Request[v1.UpdateUserOrganizationRoleRequest]) (*connect.Response[v1.UpdateUserOrganizationRoleResponse], error) + // Removes a user from an organization. + RemoveUserFromOrganization(context.Context, *connect.Request[v1.RemoveUserFromOrganizationRequest]) (*connect.Response[v1.RemoveUserFromOrganizationResponse], error) + // Lists teams that a user belongs to. + ListUserTeams(context.Context, *connect.Request[v1.ListUserTeamsRequest]) (*connect.Response[v1.ListUserTeamsResponse], error) + // Gets information about a user's personal access token (non-secret info only). + GetPersonalTokenInfo(context.Context, *connect.Request[v1.GetPersonalTokenInfoRequest]) (*connect.Response[v1.GetPersonalTokenInfoResponse], error) + // Rotates a user's personal access token. + // The old token is invalidated and a new one is generated. + // The new token is returned only once and should be stored securely. + RotatePersonalToken(context.Context, *connect.Request[v1.RotatePersonalTokenRequest]) (*connect.Response[v1.RotatePersonalTokenResponse], error) + // Reveals the user's personal access token. + // Requires re-authentication with the user's password for security. + RevealPersonalToken(context.Context, *connect.Request[v1.RevealPersonalTokenRequest]) (*connect.Response[v1.RevealPersonalTokenResponse], error) +} + +// NewUserServiceHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewUserServiceHandler(svc UserServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + userServiceCreateUserHandler := connect.NewUnaryHandler( + UserServiceCreateUserProcedure, + svc.CreateUser, + connect.WithSchema(userServiceCreateUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceGetUserHandler := connect.NewUnaryHandler( + UserServiceGetUserProcedure, + svc.GetUser, + connect.WithSchema(userServiceGetUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceListUsersHandler := connect.NewUnaryHandler( + UserServiceListUsersProcedure, + svc.ListUsers, + connect.WithSchema(userServiceListUsersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceUpdateUserHandler := connect.NewUnaryHandler( + UserServiceUpdateUserProcedure, + svc.UpdateUser, + connect.WithSchema(userServiceUpdateUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceDeleteUserHandler := connect.NewUnaryHandler( + UserServiceDeleteUserProcedure, + svc.DeleteUser, + connect.WithSchema(userServiceDeleteUserMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceListUserOrganizationsHandler := connect.NewUnaryHandler( + UserServiceListUserOrganizationsProcedure, + svc.ListUserOrganizations, + connect.WithSchema(userServiceListUserOrganizationsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceAddUserToOrganizationHandler := connect.NewUnaryHandler( + UserServiceAddUserToOrganizationProcedure, + svc.AddUserToOrganization, + connect.WithSchema(userServiceAddUserToOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceUpdateUserOrganizationRoleHandler := connect.NewUnaryHandler( + UserServiceUpdateUserOrganizationRoleProcedure, + svc.UpdateUserOrganizationRole, + connect.WithSchema(userServiceUpdateUserOrganizationRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceRemoveUserFromOrganizationHandler := connect.NewUnaryHandler( + UserServiceRemoveUserFromOrganizationProcedure, + svc.RemoveUserFromOrganization, + connect.WithSchema(userServiceRemoveUserFromOrganizationMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceListUserTeamsHandler := connect.NewUnaryHandler( + UserServiceListUserTeamsProcedure, + svc.ListUserTeams, + connect.WithSchema(userServiceListUserTeamsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceGetPersonalTokenInfoHandler := connect.NewUnaryHandler( + UserServiceGetPersonalTokenInfoProcedure, + svc.GetPersonalTokenInfo, + connect.WithSchema(userServiceGetPersonalTokenInfoMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceRotatePersonalTokenHandler := connect.NewUnaryHandler( + UserServiceRotatePersonalTokenProcedure, + svc.RotatePersonalToken, + connect.WithSchema(userServiceRotatePersonalTokenMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + userServiceRevealPersonalTokenHandler := connect.NewUnaryHandler( + UserServiceRevealPersonalTokenProcedure, + svc.RevealPersonalToken, + connect.WithSchema(userServiceRevealPersonalTokenMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.UserService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case UserServiceCreateUserProcedure: + userServiceCreateUserHandler.ServeHTTP(w, r) + case UserServiceGetUserProcedure: + userServiceGetUserHandler.ServeHTTP(w, r) + case UserServiceListUsersProcedure: + userServiceListUsersHandler.ServeHTTP(w, r) + case UserServiceUpdateUserProcedure: + userServiceUpdateUserHandler.ServeHTTP(w, r) + case UserServiceDeleteUserProcedure: + userServiceDeleteUserHandler.ServeHTTP(w, r) + case UserServiceListUserOrganizationsProcedure: + userServiceListUserOrganizationsHandler.ServeHTTP(w, r) + case UserServiceAddUserToOrganizationProcedure: + userServiceAddUserToOrganizationHandler.ServeHTTP(w, r) + case UserServiceUpdateUserOrganizationRoleProcedure: + userServiceUpdateUserOrganizationRoleHandler.ServeHTTP(w, r) + case UserServiceRemoveUserFromOrganizationProcedure: + userServiceRemoveUserFromOrganizationHandler.ServeHTTP(w, r) + case UserServiceListUserTeamsProcedure: + userServiceListUserTeamsHandler.ServeHTTP(w, r) + case UserServiceGetPersonalTokenInfoProcedure: + userServiceGetPersonalTokenInfoHandler.ServeHTTP(w, r) + case UserServiceRotatePersonalTokenProcedure: + userServiceRotatePersonalTokenHandler.ServeHTTP(w, r) + case UserServiceRevealPersonalTokenProcedure: + userServiceRevealPersonalTokenHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedUserServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedUserServiceHandler struct{} + +func (UnimplementedUserServiceHandler) CreateUser(context.Context, *connect.Request[v1.CreateUserRequest]) (*connect.Response[v1.CreateUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.CreateUser is not implemented")) +} + +func (UnimplementedUserServiceHandler) GetUser(context.Context, *connect.Request[v1.GetUserRequest]) (*connect.Response[v1.GetUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.GetUser is not implemented")) +} + +func (UnimplementedUserServiceHandler) ListUsers(context.Context, *connect.Request[v1.ListUsersRequest]) (*connect.Response[v1.ListUsersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.ListUsers is not implemented")) +} + +func (UnimplementedUserServiceHandler) UpdateUser(context.Context, *connect.Request[v1.UpdateUserRequest]) (*connect.Response[v1.UpdateUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.UpdateUser is not implemented")) +} + +func (UnimplementedUserServiceHandler) DeleteUser(context.Context, *connect.Request[v1.DeleteUserRequest]) (*connect.Response[v1.DeleteUserResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.DeleteUser is not implemented")) +} + +func (UnimplementedUserServiceHandler) ListUserOrganizations(context.Context, *connect.Request[v1.ListUserOrganizationsRequest]) (*connect.Response[v1.ListUserOrganizationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.ListUserOrganizations is not implemented")) +} + +func (UnimplementedUserServiceHandler) AddUserToOrganization(context.Context, *connect.Request[v1.AddUserToOrganizationRequest]) (*connect.Response[v1.AddUserToOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.AddUserToOrganization is not implemented")) +} + +func (UnimplementedUserServiceHandler) UpdateUserOrganizationRole(context.Context, *connect.Request[v1.UpdateUserOrganizationRoleRequest]) (*connect.Response[v1.UpdateUserOrganizationRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole is not implemented")) +} + +func (UnimplementedUserServiceHandler) RemoveUserFromOrganization(context.Context, *connect.Request[v1.RemoveUserFromOrganizationRequest]) (*connect.Response[v1.RemoveUserFromOrganizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization is not implemented")) +} + +func (UnimplementedUserServiceHandler) ListUserTeams(context.Context, *connect.Request[v1.ListUserTeamsRequest]) (*connect.Response[v1.ListUserTeamsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.ListUserTeams is not implemented")) +} + +func (UnimplementedUserServiceHandler) GetPersonalTokenInfo(context.Context, *connect.Request[v1.GetPersonalTokenInfoRequest]) (*connect.Response[v1.GetPersonalTokenInfoResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo is not implemented")) +} + +func (UnimplementedUserServiceHandler) RotatePersonalToken(context.Context, *connect.Request[v1.RotatePersonalTokenRequest]) (*connect.Response[v1.RotatePersonalTokenResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.RotatePersonalToken is not implemented")) +} + +func (UnimplementedUserServiceHandler) RevealPersonalToken(context.Context, *connect.Request[v1.RevealPersonalTokenRequest]) (*connect.Response[v1.RevealPersonalTokenResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.UserService.RevealPersonalToken is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.gw.go new file mode 100644 index 0000000000..e8ae244e0d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/user.connect.gw.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/user.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// UserServiceGatewayServer implements the gRPC server API for the UserService service. +type UserServiceGatewayServer struct { + v1.UnimplementedUserServiceServer + createUser connect_gateway.UnaryHandler[v1.CreateUserRequest, v1.CreateUserResponse] + getUser connect_gateway.UnaryHandler[v1.GetUserRequest, v1.GetUserResponse] + listUsers connect_gateway.UnaryHandler[v1.ListUsersRequest, v1.ListUsersResponse] + updateUser connect_gateway.UnaryHandler[v1.UpdateUserRequest, v1.UpdateUserResponse] + deleteUser connect_gateway.UnaryHandler[v1.DeleteUserRequest, v1.DeleteUserResponse] + listUserOrganizations connect_gateway.UnaryHandler[v1.ListUserOrganizationsRequest, v1.ListUserOrganizationsResponse] + addUserToOrganization connect_gateway.UnaryHandler[v1.AddUserToOrganizationRequest, v1.AddUserToOrganizationResponse] + updateUserOrganizationRole connect_gateway.UnaryHandler[v1.UpdateUserOrganizationRoleRequest, v1.UpdateUserOrganizationRoleResponse] + removeUserFromOrganization connect_gateway.UnaryHandler[v1.RemoveUserFromOrganizationRequest, v1.RemoveUserFromOrganizationResponse] + listUserTeams connect_gateway.UnaryHandler[v1.ListUserTeamsRequest, v1.ListUserTeamsResponse] + getPersonalTokenInfo connect_gateway.UnaryHandler[v1.GetPersonalTokenInfoRequest, v1.GetPersonalTokenInfoResponse] + rotatePersonalToken connect_gateway.UnaryHandler[v1.RotatePersonalTokenRequest, v1.RotatePersonalTokenResponse] + revealPersonalToken connect_gateway.UnaryHandler[v1.RevealPersonalTokenRequest, v1.RevealPersonalTokenResponse] +} + +// NewUserServiceGatewayServer constructs a Connect-Gateway gRPC server for the UserService service. +func NewUserServiceGatewayServer(svc UserServiceHandler, opts ...connect_gateway.HandlerOption) *UserServiceGatewayServer { + return &UserServiceGatewayServer{ + createUser: connect_gateway.NewUnaryHandler(UserServiceCreateUserProcedure, svc.CreateUser, opts...), + getUser: connect_gateway.NewUnaryHandler(UserServiceGetUserProcedure, svc.GetUser, opts...), + listUsers: connect_gateway.NewUnaryHandler(UserServiceListUsersProcedure, svc.ListUsers, opts...), + updateUser: connect_gateway.NewUnaryHandler(UserServiceUpdateUserProcedure, svc.UpdateUser, opts...), + deleteUser: connect_gateway.NewUnaryHandler(UserServiceDeleteUserProcedure, svc.DeleteUser, opts...), + listUserOrganizations: connect_gateway.NewUnaryHandler(UserServiceListUserOrganizationsProcedure, svc.ListUserOrganizations, opts...), + addUserToOrganization: connect_gateway.NewUnaryHandler(UserServiceAddUserToOrganizationProcedure, svc.AddUserToOrganization, opts...), + updateUserOrganizationRole: connect_gateway.NewUnaryHandler(UserServiceUpdateUserOrganizationRoleProcedure, svc.UpdateUserOrganizationRole, opts...), + removeUserFromOrganization: connect_gateway.NewUnaryHandler(UserServiceRemoveUserFromOrganizationProcedure, svc.RemoveUserFromOrganization, opts...), + listUserTeams: connect_gateway.NewUnaryHandler(UserServiceListUserTeamsProcedure, svc.ListUserTeams, opts...), + getPersonalTokenInfo: connect_gateway.NewUnaryHandler(UserServiceGetPersonalTokenInfoProcedure, svc.GetPersonalTokenInfo, opts...), + rotatePersonalToken: connect_gateway.NewUnaryHandler(UserServiceRotatePersonalTokenProcedure, svc.RotatePersonalToken, opts...), + revealPersonalToken: connect_gateway.NewUnaryHandler(UserServiceRevealPersonalTokenProcedure, svc.RevealPersonalToken, opts...), + } +} + +func (s *UserServiceGatewayServer) CreateUser(ctx context.Context, req *v1.CreateUserRequest) (*v1.CreateUserResponse, error) { + return s.createUser(ctx, req) +} + +func (s *UserServiceGatewayServer) GetUser(ctx context.Context, req *v1.GetUserRequest) (*v1.GetUserResponse, error) { + return s.getUser(ctx, req) +} + +func (s *UserServiceGatewayServer) ListUsers(ctx context.Context, req *v1.ListUsersRequest) (*v1.ListUsersResponse, error) { + return s.listUsers(ctx, req) +} + +func (s *UserServiceGatewayServer) UpdateUser(ctx context.Context, req *v1.UpdateUserRequest) (*v1.UpdateUserResponse, error) { + return s.updateUser(ctx, req) +} + +func (s *UserServiceGatewayServer) DeleteUser(ctx context.Context, req *v1.DeleteUserRequest) (*v1.DeleteUserResponse, error) { + return s.deleteUser(ctx, req) +} + +func (s *UserServiceGatewayServer) ListUserOrganizations(ctx context.Context, req *v1.ListUserOrganizationsRequest) (*v1.ListUserOrganizationsResponse, error) { + return s.listUserOrganizations(ctx, req) +} + +func (s *UserServiceGatewayServer) AddUserToOrganization(ctx context.Context, req *v1.AddUserToOrganizationRequest) (*v1.AddUserToOrganizationResponse, error) { + return s.addUserToOrganization(ctx, req) +} + +func (s *UserServiceGatewayServer) UpdateUserOrganizationRole(ctx context.Context, req *v1.UpdateUserOrganizationRoleRequest) (*v1.UpdateUserOrganizationRoleResponse, error) { + return s.updateUserOrganizationRole(ctx, req) +} + +func (s *UserServiceGatewayServer) RemoveUserFromOrganization(ctx context.Context, req *v1.RemoveUserFromOrganizationRequest) (*v1.RemoveUserFromOrganizationResponse, error) { + return s.removeUserFromOrganization(ctx, req) +} + +func (s *UserServiceGatewayServer) ListUserTeams(ctx context.Context, req *v1.ListUserTeamsRequest) (*v1.ListUserTeamsResponse, error) { + return s.listUserTeams(ctx, req) +} + +func (s *UserServiceGatewayServer) GetPersonalTokenInfo(ctx context.Context, req *v1.GetPersonalTokenInfoRequest) (*v1.GetPersonalTokenInfoResponse, error) { + return s.getPersonalTokenInfo(ctx, req) +} + +func (s *UserServiceGatewayServer) RotatePersonalToken(ctx context.Context, req *v1.RotatePersonalTokenRequest) (*v1.RotatePersonalTokenResponse, error) { + return s.rotatePersonalToken(ctx, req) +} + +func (s *UserServiceGatewayServer) RevealPersonalToken(ctx context.Context, req *v1.RevealPersonalTokenRequest) (*v1.RevealPersonalTokenResponse, error) { + return s.revealPersonalToken(ctx, req) +} + +// RegisterUserServiceHandlerGatewayServer registers the Connect handlers for the UserService "svc" +// to "mux". +func RegisterUserServiceHandlerGatewayServer(mux *runtime.ServeMux, svc UserServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterUserServiceHandlerServer(context.TODO(), mux, NewUserServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.go new file mode 100644 index 0000000000..bcc3a2e3d9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.go @@ -0,0 +1,185 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/visual_metadata.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // VisualMetadataServiceName is the fully-qualified name of the VisualMetadataService service. + VisualMetadataServiceName = "redpanda.api.aigateway.v1.VisualMetadataService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // VisualMetadataServiceGetVisualMetadataProcedure is the fully-qualified name of the + // VisualMetadataService's GetVisualMetadata RPC. + VisualMetadataServiceGetVisualMetadataProcedure = "/redpanda.api.aigateway.v1.VisualMetadataService/GetVisualMetadata" + // VisualMetadataServiceSaveVisualMetadataProcedure is the fully-qualified name of the + // VisualMetadataService's SaveVisualMetadata RPC. + VisualMetadataServiceSaveVisualMetadataProcedure = "/redpanda.api.aigateway.v1.VisualMetadataService/SaveVisualMetadata" + // VisualMetadataServiceDeleteVisualMetadataProcedure is the fully-qualified name of the + // VisualMetadataService's DeleteVisualMetadata RPC. + VisualMetadataServiceDeleteVisualMetadataProcedure = "/redpanda.api.aigateway.v1.VisualMetadataService/DeleteVisualMetadata" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + visualMetadataServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_visual_metadata_proto.Services().ByName("VisualMetadataService") + visualMetadataServiceGetVisualMetadataMethodDescriptor = visualMetadataServiceServiceDescriptor.Methods().ByName("GetVisualMetadata") + visualMetadataServiceSaveVisualMetadataMethodDescriptor = visualMetadataServiceServiceDescriptor.Methods().ByName("SaveVisualMetadata") + visualMetadataServiceDeleteVisualMetadataMethodDescriptor = visualMetadataServiceServiceDescriptor.Methods().ByName("DeleteVisualMetadata") +) + +// VisualMetadataServiceClient is a client for the redpanda.api.aigateway.v1.VisualMetadataService +// service. +type VisualMetadataServiceClient interface { + // Gets visual metadata for a gateway (optionally for a specific user). + GetVisualMetadata(context.Context, *connect.Request[v1.GetVisualMetadataRequest]) (*connect.Response[v1.GetVisualMetadataResponse], error) + // Creates or updates visual metadata for a gateway. + // Uses upsert semantics - creates if not exists, updates if exists. + SaveVisualMetadata(context.Context, *connect.Request[v1.SaveVisualMetadataRequest]) (*connect.Response[v1.SaveVisualMetadataResponse], error) + // Deletes visual metadata for a gateway. + DeleteVisualMetadata(context.Context, *connect.Request[v1.DeleteVisualMetadataRequest]) (*connect.Response[v1.DeleteVisualMetadataResponse], error) +} + +// NewVisualMetadataServiceClient constructs a client for the +// redpanda.api.aigateway.v1.VisualMetadataService service. By default, it uses the Connect protocol +// with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed requests. To +// use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or connect.WithGRPCWeb() +// options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewVisualMetadataServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) VisualMetadataServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &visualMetadataServiceClient{ + getVisualMetadata: connect.NewClient[v1.GetVisualMetadataRequest, v1.GetVisualMetadataResponse]( + httpClient, + baseURL+VisualMetadataServiceGetVisualMetadataProcedure, + connect.WithSchema(visualMetadataServiceGetVisualMetadataMethodDescriptor), + connect.WithClientOptions(opts...), + ), + saveVisualMetadata: connect.NewClient[v1.SaveVisualMetadataRequest, v1.SaveVisualMetadataResponse]( + httpClient, + baseURL+VisualMetadataServiceSaveVisualMetadataProcedure, + connect.WithSchema(visualMetadataServiceSaveVisualMetadataMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteVisualMetadata: connect.NewClient[v1.DeleteVisualMetadataRequest, v1.DeleteVisualMetadataResponse]( + httpClient, + baseURL+VisualMetadataServiceDeleteVisualMetadataProcedure, + connect.WithSchema(visualMetadataServiceDeleteVisualMetadataMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// visualMetadataServiceClient implements VisualMetadataServiceClient. +type visualMetadataServiceClient struct { + getVisualMetadata *connect.Client[v1.GetVisualMetadataRequest, v1.GetVisualMetadataResponse] + saveVisualMetadata *connect.Client[v1.SaveVisualMetadataRequest, v1.SaveVisualMetadataResponse] + deleteVisualMetadata *connect.Client[v1.DeleteVisualMetadataRequest, v1.DeleteVisualMetadataResponse] +} + +// GetVisualMetadata calls redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata. +func (c *visualMetadataServiceClient) GetVisualMetadata(ctx context.Context, req *connect.Request[v1.GetVisualMetadataRequest]) (*connect.Response[v1.GetVisualMetadataResponse], error) { + return c.getVisualMetadata.CallUnary(ctx, req) +} + +// SaveVisualMetadata calls redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata. +func (c *visualMetadataServiceClient) SaveVisualMetadata(ctx context.Context, req *connect.Request[v1.SaveVisualMetadataRequest]) (*connect.Response[v1.SaveVisualMetadataResponse], error) { + return c.saveVisualMetadata.CallUnary(ctx, req) +} + +// DeleteVisualMetadata calls redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata. +func (c *visualMetadataServiceClient) DeleteVisualMetadata(ctx context.Context, req *connect.Request[v1.DeleteVisualMetadataRequest]) (*connect.Response[v1.DeleteVisualMetadataResponse], error) { + return c.deleteVisualMetadata.CallUnary(ctx, req) +} + +// VisualMetadataServiceHandler is an implementation of the +// redpanda.api.aigateway.v1.VisualMetadataService service. +type VisualMetadataServiceHandler interface { + // Gets visual metadata for a gateway (optionally for a specific user). + GetVisualMetadata(context.Context, *connect.Request[v1.GetVisualMetadataRequest]) (*connect.Response[v1.GetVisualMetadataResponse], error) + // Creates or updates visual metadata for a gateway. + // Uses upsert semantics - creates if not exists, updates if exists. + SaveVisualMetadata(context.Context, *connect.Request[v1.SaveVisualMetadataRequest]) (*connect.Response[v1.SaveVisualMetadataResponse], error) + // Deletes visual metadata for a gateway. + DeleteVisualMetadata(context.Context, *connect.Request[v1.DeleteVisualMetadataRequest]) (*connect.Response[v1.DeleteVisualMetadataResponse], error) +} + +// NewVisualMetadataServiceHandler builds an HTTP handler from the service implementation. It +// returns the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewVisualMetadataServiceHandler(svc VisualMetadataServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + visualMetadataServiceGetVisualMetadataHandler := connect.NewUnaryHandler( + VisualMetadataServiceGetVisualMetadataProcedure, + svc.GetVisualMetadata, + connect.WithSchema(visualMetadataServiceGetVisualMetadataMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + visualMetadataServiceSaveVisualMetadataHandler := connect.NewUnaryHandler( + VisualMetadataServiceSaveVisualMetadataProcedure, + svc.SaveVisualMetadata, + connect.WithSchema(visualMetadataServiceSaveVisualMetadataMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + visualMetadataServiceDeleteVisualMetadataHandler := connect.NewUnaryHandler( + VisualMetadataServiceDeleteVisualMetadataProcedure, + svc.DeleteVisualMetadata, + connect.WithSchema(visualMetadataServiceDeleteVisualMetadataMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.VisualMetadataService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case VisualMetadataServiceGetVisualMetadataProcedure: + visualMetadataServiceGetVisualMetadataHandler.ServeHTTP(w, r) + case VisualMetadataServiceSaveVisualMetadataProcedure: + visualMetadataServiceSaveVisualMetadataHandler.ServeHTTP(w, r) + case VisualMetadataServiceDeleteVisualMetadataProcedure: + visualMetadataServiceDeleteVisualMetadataHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedVisualMetadataServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedVisualMetadataServiceHandler struct{} + +func (UnimplementedVisualMetadataServiceHandler) GetVisualMetadata(context.Context, *connect.Request[v1.GetVisualMetadataRequest]) (*connect.Response[v1.GetVisualMetadataResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata is not implemented")) +} + +func (UnimplementedVisualMetadataServiceHandler) SaveVisualMetadata(context.Context, *connect.Request[v1.SaveVisualMetadataRequest]) (*connect.Response[v1.SaveVisualMetadataResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata is not implemented")) +} + +func (UnimplementedVisualMetadataServiceHandler) DeleteVisualMetadata(context.Context, *connect.Request[v1.DeleteVisualMetadataRequest]) (*connect.Response[v1.DeleteVisualMetadataResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.gw.go new file mode 100644 index 0000000000..fd5fc5c3aa --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/visual_metadata.connect.gw.go @@ -0,0 +1,53 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/visual_metadata.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// VisualMetadataServiceGatewayServer implements the gRPC server API for the VisualMetadataService +// service. +type VisualMetadataServiceGatewayServer struct { + v1.UnimplementedVisualMetadataServiceServer + getVisualMetadata connect_gateway.UnaryHandler[v1.GetVisualMetadataRequest, v1.GetVisualMetadataResponse] + saveVisualMetadata connect_gateway.UnaryHandler[v1.SaveVisualMetadataRequest, v1.SaveVisualMetadataResponse] + deleteVisualMetadata connect_gateway.UnaryHandler[v1.DeleteVisualMetadataRequest, v1.DeleteVisualMetadataResponse] +} + +// NewVisualMetadataServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// VisualMetadataService service. +func NewVisualMetadataServiceGatewayServer(svc VisualMetadataServiceHandler, opts ...connect_gateway.HandlerOption) *VisualMetadataServiceGatewayServer { + return &VisualMetadataServiceGatewayServer{ + getVisualMetadata: connect_gateway.NewUnaryHandler(VisualMetadataServiceGetVisualMetadataProcedure, svc.GetVisualMetadata, opts...), + saveVisualMetadata: connect_gateway.NewUnaryHandler(VisualMetadataServiceSaveVisualMetadataProcedure, svc.SaveVisualMetadata, opts...), + deleteVisualMetadata: connect_gateway.NewUnaryHandler(VisualMetadataServiceDeleteVisualMetadataProcedure, svc.DeleteVisualMetadata, opts...), + } +} + +func (s *VisualMetadataServiceGatewayServer) GetVisualMetadata(ctx context.Context, req *v1.GetVisualMetadataRequest) (*v1.GetVisualMetadataResponse, error) { + return s.getVisualMetadata(ctx, req) +} + +func (s *VisualMetadataServiceGatewayServer) SaveVisualMetadata(ctx context.Context, req *v1.SaveVisualMetadataRequest) (*v1.SaveVisualMetadataResponse, error) { + return s.saveVisualMetadata(ctx, req) +} + +func (s *VisualMetadataServiceGatewayServer) DeleteVisualMetadata(ctx context.Context, req *v1.DeleteVisualMetadataRequest) (*v1.DeleteVisualMetadataResponse, error) { + return s.deleteVisualMetadata(ctx, req) +} + +// RegisterVisualMetadataServiceHandlerGatewayServer registers the Connect handlers for the +// VisualMetadataService "svc" to "mux". +func RegisterVisualMetadataServiceHandlerGatewayServer(mux *runtime.ServeMux, svc VisualMetadataServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterVisualMetadataServiceHandlerServer(context.TODO(), mux, NewVisualMetadataServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.go new file mode 100644 index 0000000000..1bc1389670 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.go @@ -0,0 +1,245 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/workspace.proto + +package aigatewayv1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // WorkspaceServiceName is the fully-qualified name of the WorkspaceService service. + WorkspaceServiceName = "redpanda.api.aigateway.v1.WorkspaceService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // WorkspaceServiceCreateWorkspaceProcedure is the fully-qualified name of the WorkspaceService's + // CreateWorkspace RPC. + WorkspaceServiceCreateWorkspaceProcedure = "/redpanda.api.aigateway.v1.WorkspaceService/CreateWorkspace" + // WorkspaceServiceGetWorkspaceProcedure is the fully-qualified name of the WorkspaceService's + // GetWorkspace RPC. + WorkspaceServiceGetWorkspaceProcedure = "/redpanda.api.aigateway.v1.WorkspaceService/GetWorkspace" + // WorkspaceServiceListWorkspacesProcedure is the fully-qualified name of the WorkspaceService's + // ListWorkspaces RPC. + WorkspaceServiceListWorkspacesProcedure = "/redpanda.api.aigateway.v1.WorkspaceService/ListWorkspaces" + // WorkspaceServiceUpdateWorkspaceProcedure is the fully-qualified name of the WorkspaceService's + // UpdateWorkspace RPC. + WorkspaceServiceUpdateWorkspaceProcedure = "/redpanda.api.aigateway.v1.WorkspaceService/UpdateWorkspace" + // WorkspaceServiceDeleteWorkspaceProcedure is the fully-qualified name of the WorkspaceService's + // DeleteWorkspace RPC. + WorkspaceServiceDeleteWorkspaceProcedure = "/redpanda.api.aigateway.v1.WorkspaceService/DeleteWorkspace" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + workspaceServiceServiceDescriptor = v1.File_redpanda_api_aigateway_v1_workspace_proto.Services().ByName("WorkspaceService") + workspaceServiceCreateWorkspaceMethodDescriptor = workspaceServiceServiceDescriptor.Methods().ByName("CreateWorkspace") + workspaceServiceGetWorkspaceMethodDescriptor = workspaceServiceServiceDescriptor.Methods().ByName("GetWorkspace") + workspaceServiceListWorkspacesMethodDescriptor = workspaceServiceServiceDescriptor.Methods().ByName("ListWorkspaces") + workspaceServiceUpdateWorkspaceMethodDescriptor = workspaceServiceServiceDescriptor.Methods().ByName("UpdateWorkspace") + workspaceServiceDeleteWorkspaceMethodDescriptor = workspaceServiceServiceDescriptor.Methods().ByName("DeleteWorkspace") +) + +// WorkspaceServiceClient is a client for the redpanda.api.aigateway.v1.WorkspaceService service. +type WorkspaceServiceClient interface { + // Creates a new workspace within an organization. + CreateWorkspace(context.Context, *connect.Request[v1.CreateWorkspaceRequest]) (*connect.Response[v1.CreateWorkspaceResponse], error) + // Gets a workspace by name. + GetWorkspace(context.Context, *connect.Request[v1.GetWorkspaceRequest]) (*connect.Response[v1.GetWorkspaceResponse], error) + // Lists workspaces within an organization. + ListWorkspaces(context.Context, *connect.Request[v1.ListWorkspacesRequest]) (*connect.Response[v1.ListWorkspacesResponse], error) + // Updates a workspace. + UpdateWorkspace(context.Context, *connect.Request[v1.UpdateWorkspaceRequest]) (*connect.Response[v1.UpdateWorkspaceResponse], error) + // Deletes a workspace. + DeleteWorkspace(context.Context, *connect.Request[v1.DeleteWorkspaceRequest]) (*connect.Response[v1.DeleteWorkspaceResponse], error) +} + +// NewWorkspaceServiceClient constructs a client for the redpanda.api.aigateway.v1.WorkspaceService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewWorkspaceServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) WorkspaceServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &workspaceServiceClient{ + createWorkspace: connect.NewClient[v1.CreateWorkspaceRequest, v1.CreateWorkspaceResponse]( + httpClient, + baseURL+WorkspaceServiceCreateWorkspaceProcedure, + connect.WithSchema(workspaceServiceCreateWorkspaceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getWorkspace: connect.NewClient[v1.GetWorkspaceRequest, v1.GetWorkspaceResponse]( + httpClient, + baseURL+WorkspaceServiceGetWorkspaceProcedure, + connect.WithSchema(workspaceServiceGetWorkspaceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listWorkspaces: connect.NewClient[v1.ListWorkspacesRequest, v1.ListWorkspacesResponse]( + httpClient, + baseURL+WorkspaceServiceListWorkspacesProcedure, + connect.WithSchema(workspaceServiceListWorkspacesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateWorkspace: connect.NewClient[v1.UpdateWorkspaceRequest, v1.UpdateWorkspaceResponse]( + httpClient, + baseURL+WorkspaceServiceUpdateWorkspaceProcedure, + connect.WithSchema(workspaceServiceUpdateWorkspaceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteWorkspace: connect.NewClient[v1.DeleteWorkspaceRequest, v1.DeleteWorkspaceResponse]( + httpClient, + baseURL+WorkspaceServiceDeleteWorkspaceProcedure, + connect.WithSchema(workspaceServiceDeleteWorkspaceMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// workspaceServiceClient implements WorkspaceServiceClient. +type workspaceServiceClient struct { + createWorkspace *connect.Client[v1.CreateWorkspaceRequest, v1.CreateWorkspaceResponse] + getWorkspace *connect.Client[v1.GetWorkspaceRequest, v1.GetWorkspaceResponse] + listWorkspaces *connect.Client[v1.ListWorkspacesRequest, v1.ListWorkspacesResponse] + updateWorkspace *connect.Client[v1.UpdateWorkspaceRequest, v1.UpdateWorkspaceResponse] + deleteWorkspace *connect.Client[v1.DeleteWorkspaceRequest, v1.DeleteWorkspaceResponse] +} + +// CreateWorkspace calls redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace. +func (c *workspaceServiceClient) CreateWorkspace(ctx context.Context, req *connect.Request[v1.CreateWorkspaceRequest]) (*connect.Response[v1.CreateWorkspaceResponse], error) { + return c.createWorkspace.CallUnary(ctx, req) +} + +// GetWorkspace calls redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace. +func (c *workspaceServiceClient) GetWorkspace(ctx context.Context, req *connect.Request[v1.GetWorkspaceRequest]) (*connect.Response[v1.GetWorkspaceResponse], error) { + return c.getWorkspace.CallUnary(ctx, req) +} + +// ListWorkspaces calls redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces. +func (c *workspaceServiceClient) ListWorkspaces(ctx context.Context, req *connect.Request[v1.ListWorkspacesRequest]) (*connect.Response[v1.ListWorkspacesResponse], error) { + return c.listWorkspaces.CallUnary(ctx, req) +} + +// UpdateWorkspace calls redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace. +func (c *workspaceServiceClient) UpdateWorkspace(ctx context.Context, req *connect.Request[v1.UpdateWorkspaceRequest]) (*connect.Response[v1.UpdateWorkspaceResponse], error) { + return c.updateWorkspace.CallUnary(ctx, req) +} + +// DeleteWorkspace calls redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace. +func (c *workspaceServiceClient) DeleteWorkspace(ctx context.Context, req *connect.Request[v1.DeleteWorkspaceRequest]) (*connect.Response[v1.DeleteWorkspaceResponse], error) { + return c.deleteWorkspace.CallUnary(ctx, req) +} + +// WorkspaceServiceHandler is an implementation of the redpanda.api.aigateway.v1.WorkspaceService +// service. +type WorkspaceServiceHandler interface { + // Creates a new workspace within an organization. + CreateWorkspace(context.Context, *connect.Request[v1.CreateWorkspaceRequest]) (*connect.Response[v1.CreateWorkspaceResponse], error) + // Gets a workspace by name. + GetWorkspace(context.Context, *connect.Request[v1.GetWorkspaceRequest]) (*connect.Response[v1.GetWorkspaceResponse], error) + // Lists workspaces within an organization. + ListWorkspaces(context.Context, *connect.Request[v1.ListWorkspacesRequest]) (*connect.Response[v1.ListWorkspacesResponse], error) + // Updates a workspace. + UpdateWorkspace(context.Context, *connect.Request[v1.UpdateWorkspaceRequest]) (*connect.Response[v1.UpdateWorkspaceResponse], error) + // Deletes a workspace. + DeleteWorkspace(context.Context, *connect.Request[v1.DeleteWorkspaceRequest]) (*connect.Response[v1.DeleteWorkspaceResponse], error) +} + +// NewWorkspaceServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewWorkspaceServiceHandler(svc WorkspaceServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + workspaceServiceCreateWorkspaceHandler := connect.NewUnaryHandler( + WorkspaceServiceCreateWorkspaceProcedure, + svc.CreateWorkspace, + connect.WithSchema(workspaceServiceCreateWorkspaceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceGetWorkspaceHandler := connect.NewUnaryHandler( + WorkspaceServiceGetWorkspaceProcedure, + svc.GetWorkspace, + connect.WithSchema(workspaceServiceGetWorkspaceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceListWorkspacesHandler := connect.NewUnaryHandler( + WorkspaceServiceListWorkspacesProcedure, + svc.ListWorkspaces, + connect.WithSchema(workspaceServiceListWorkspacesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceUpdateWorkspaceHandler := connect.NewUnaryHandler( + WorkspaceServiceUpdateWorkspaceProcedure, + svc.UpdateWorkspace, + connect.WithSchema(workspaceServiceUpdateWorkspaceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceDeleteWorkspaceHandler := connect.NewUnaryHandler( + WorkspaceServiceDeleteWorkspaceProcedure, + svc.DeleteWorkspace, + connect.WithSchema(workspaceServiceDeleteWorkspaceMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.aigateway.v1.WorkspaceService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case WorkspaceServiceCreateWorkspaceProcedure: + workspaceServiceCreateWorkspaceHandler.ServeHTTP(w, r) + case WorkspaceServiceGetWorkspaceProcedure: + workspaceServiceGetWorkspaceHandler.ServeHTTP(w, r) + case WorkspaceServiceListWorkspacesProcedure: + workspaceServiceListWorkspacesHandler.ServeHTTP(w, r) + case WorkspaceServiceUpdateWorkspaceProcedure: + workspaceServiceUpdateWorkspaceHandler.ServeHTTP(w, r) + case WorkspaceServiceDeleteWorkspaceProcedure: + workspaceServiceDeleteWorkspaceHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedWorkspaceServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedWorkspaceServiceHandler struct{} + +func (UnimplementedWorkspaceServiceHandler) CreateWorkspace(context.Context, *connect.Request[v1.CreateWorkspaceRequest]) (*connect.Response[v1.CreateWorkspaceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) GetWorkspace(context.Context, *connect.Request[v1.GetWorkspaceRequest]) (*connect.Response[v1.GetWorkspaceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) ListWorkspaces(context.Context, *connect.Request[v1.ListWorkspacesRequest]) (*connect.Response[v1.ListWorkspacesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) UpdateWorkspace(context.Context, *connect.Request[v1.UpdateWorkspaceRequest]) (*connect.Response[v1.UpdateWorkspaceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) DeleteWorkspace(context.Context, *connect.Request[v1.DeleteWorkspaceRequest]) (*connect.Response[v1.DeleteWorkspaceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.gw.go new file mode 100644 index 0000000000..28f14c1008 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/aigatewayv1connect/workspace.connect.gw.go @@ -0,0 +1,64 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/aigateway/v1/workspace.proto + +package aigatewayv1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + v1 "go.panda.dev/redpanda-aigw/protos/gen/redpanda/api/aigateway/v1" + connect_gateway "go.vallahaye.net/connect-gateway" +) + +// WorkspaceServiceGatewayServer implements the gRPC server API for the WorkspaceService service. +type WorkspaceServiceGatewayServer struct { + v1.UnimplementedWorkspaceServiceServer + createWorkspace connect_gateway.UnaryHandler[v1.CreateWorkspaceRequest, v1.CreateWorkspaceResponse] + getWorkspace connect_gateway.UnaryHandler[v1.GetWorkspaceRequest, v1.GetWorkspaceResponse] + listWorkspaces connect_gateway.UnaryHandler[v1.ListWorkspacesRequest, v1.ListWorkspacesResponse] + updateWorkspace connect_gateway.UnaryHandler[v1.UpdateWorkspaceRequest, v1.UpdateWorkspaceResponse] + deleteWorkspace connect_gateway.UnaryHandler[v1.DeleteWorkspaceRequest, v1.DeleteWorkspaceResponse] +} + +// NewWorkspaceServiceGatewayServer constructs a Connect-Gateway gRPC server for the +// WorkspaceService service. +func NewWorkspaceServiceGatewayServer(svc WorkspaceServiceHandler, opts ...connect_gateway.HandlerOption) *WorkspaceServiceGatewayServer { + return &WorkspaceServiceGatewayServer{ + createWorkspace: connect_gateway.NewUnaryHandler(WorkspaceServiceCreateWorkspaceProcedure, svc.CreateWorkspace, opts...), + getWorkspace: connect_gateway.NewUnaryHandler(WorkspaceServiceGetWorkspaceProcedure, svc.GetWorkspace, opts...), + listWorkspaces: connect_gateway.NewUnaryHandler(WorkspaceServiceListWorkspacesProcedure, svc.ListWorkspaces, opts...), + updateWorkspace: connect_gateway.NewUnaryHandler(WorkspaceServiceUpdateWorkspaceProcedure, svc.UpdateWorkspace, opts...), + deleteWorkspace: connect_gateway.NewUnaryHandler(WorkspaceServiceDeleteWorkspaceProcedure, svc.DeleteWorkspace, opts...), + } +} + +func (s *WorkspaceServiceGatewayServer) CreateWorkspace(ctx context.Context, req *v1.CreateWorkspaceRequest) (*v1.CreateWorkspaceResponse, error) { + return s.createWorkspace(ctx, req) +} + +func (s *WorkspaceServiceGatewayServer) GetWorkspace(ctx context.Context, req *v1.GetWorkspaceRequest) (*v1.GetWorkspaceResponse, error) { + return s.getWorkspace(ctx, req) +} + +func (s *WorkspaceServiceGatewayServer) ListWorkspaces(ctx context.Context, req *v1.ListWorkspacesRequest) (*v1.ListWorkspacesResponse, error) { + return s.listWorkspaces(ctx, req) +} + +func (s *WorkspaceServiceGatewayServer) UpdateWorkspace(ctx context.Context, req *v1.UpdateWorkspaceRequest) (*v1.UpdateWorkspaceResponse, error) { + return s.updateWorkspace(ctx, req) +} + +func (s *WorkspaceServiceGatewayServer) DeleteWorkspace(ctx context.Context, req *v1.DeleteWorkspaceRequest) (*v1.DeleteWorkspaceResponse, error) { + return s.deleteWorkspace(ctx, req) +} + +// RegisterWorkspaceServiceHandlerGatewayServer registers the Connect handlers for the +// WorkspaceService "svc" to "mux". +func RegisterWorkspaceServiceHandlerGatewayServer(mux *runtime.ServeMux, svc WorkspaceServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterWorkspaceServiceHandlerServer(context.TODO(), mux, NewWorkspaceServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.go new file mode 100644 index 0000000000..12192cd0c9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.go @@ -0,0 +1,1888 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/analytics.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// TimeRange specifies predefined time windows for analytics queries. +type TimeRange int32 + +const ( + TimeRange_TIME_RANGE_UNSPECIFIED TimeRange = 0 + TimeRange_TIME_RANGE_LAST_24H TimeRange = 1 // Last 24 hours + TimeRange_TIME_RANGE_LAST_7D TimeRange = 2 // Last 7 days + TimeRange_TIME_RANGE_LAST_30D TimeRange = 3 // Last 30 days + TimeRange_TIME_RANGE_CUSTOM TimeRange = 4 // Custom start/end dates +) + +// Enum value maps for TimeRange. +var ( + TimeRange_name = map[int32]string{ + 0: "TIME_RANGE_UNSPECIFIED", + 1: "TIME_RANGE_LAST_24H", + 2: "TIME_RANGE_LAST_7D", + 3: "TIME_RANGE_LAST_30D", + 4: "TIME_RANGE_CUSTOM", + } + TimeRange_value = map[string]int32{ + "TIME_RANGE_UNSPECIFIED": 0, + "TIME_RANGE_LAST_24H": 1, + "TIME_RANGE_LAST_7D": 2, + "TIME_RANGE_LAST_30D": 3, + "TIME_RANGE_CUSTOM": 4, + } +) + +func (x TimeRange) Enum() *TimeRange { + p := new(TimeRange) + *p = x + return p +} + +func (x TimeRange) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TimeRange) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[0].Descriptor() +} + +func (TimeRange) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[0] +} + +func (x TimeRange) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TimeRange.Descriptor instead. +func (TimeRange) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{0} +} + +// BreakdownDimension specifies how to group spending data. +type BreakdownDimension int32 + +const ( + BreakdownDimension_BREAKDOWN_DIMENSION_UNSPECIFIED BreakdownDimension = 0 + BreakdownDimension_BREAKDOWN_DIMENSION_PROVIDER BreakdownDimension = 1 // Group by LLM provider (openai, anthropic) + BreakdownDimension_BREAKDOWN_DIMENSION_MODEL BreakdownDimension = 2 // Group by model ID (gpt-4o, claude-3-5-sonnet) + BreakdownDimension_BREAKDOWN_DIMENSION_GATEWAY BreakdownDimension = 3 // Group by gateway/frontend ID + BreakdownDimension_BREAKDOWN_DIMENSION_TEAM BreakdownDimension = 4 // Group by team from OIDC claims + BreakdownDimension_BREAKDOWN_DIMENSION_ORGANIZATION BreakdownDimension = 5 // Group by organization from OIDC claims + BreakdownDimension_BREAKDOWN_DIMENSION_USER BreakdownDimension = 6 // Group by user from OIDC claims +) + +// Enum value maps for BreakdownDimension. +var ( + BreakdownDimension_name = map[int32]string{ + 0: "BREAKDOWN_DIMENSION_UNSPECIFIED", + 1: "BREAKDOWN_DIMENSION_PROVIDER", + 2: "BREAKDOWN_DIMENSION_MODEL", + 3: "BREAKDOWN_DIMENSION_GATEWAY", + 4: "BREAKDOWN_DIMENSION_TEAM", + 5: "BREAKDOWN_DIMENSION_ORGANIZATION", + 6: "BREAKDOWN_DIMENSION_USER", + } + BreakdownDimension_value = map[string]int32{ + "BREAKDOWN_DIMENSION_UNSPECIFIED": 0, + "BREAKDOWN_DIMENSION_PROVIDER": 1, + "BREAKDOWN_DIMENSION_MODEL": 2, + "BREAKDOWN_DIMENSION_GATEWAY": 3, + "BREAKDOWN_DIMENSION_TEAM": 4, + "BREAKDOWN_DIMENSION_ORGANIZATION": 5, + "BREAKDOWN_DIMENSION_USER": 6, + } +) + +func (x BreakdownDimension) Enum() *BreakdownDimension { + p := new(BreakdownDimension) + *p = x + return p +} + +func (x BreakdownDimension) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BreakdownDimension) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[1].Descriptor() +} + +func (BreakdownDimension) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[1] +} + +func (x BreakdownDimension) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BreakdownDimension.Descriptor instead. +func (BreakdownDimension) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{1} +} + +// Granularity specifies the time bucket size for time series data. +type Granularity int32 + +const ( + Granularity_GRANULARITY_UNSPECIFIED Granularity = 0 + Granularity_GRANULARITY_HOUR Granularity = 1 // Hourly buckets + Granularity_GRANULARITY_DAY Granularity = 2 // Daily buckets + Granularity_GRANULARITY_WEEK Granularity = 3 // Weekly buckets +) + +// Enum value maps for Granularity. +var ( + Granularity_name = map[int32]string{ + 0: "GRANULARITY_UNSPECIFIED", + 1: "GRANULARITY_HOUR", + 2: "GRANULARITY_DAY", + 3: "GRANULARITY_WEEK", + } + Granularity_value = map[string]int32{ + "GRANULARITY_UNSPECIFIED": 0, + "GRANULARITY_HOUR": 1, + "GRANULARITY_DAY": 2, + "GRANULARITY_WEEK": 3, + } +) + +func (x Granularity) Enum() *Granularity { + p := new(Granularity) + *p = x + return p +} + +func (x Granularity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Granularity) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[2].Descriptor() +} + +func (Granularity) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_analytics_proto_enumTypes[2] +} + +func (x Granularity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Granularity.Descriptor instead. +func (Granularity) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{2} +} + +// SpendingFilters allows filtering analytics queries by multiple dimensions. +type SpendingFilters struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Optional: Filter by specific gateways + Gateways []string `protobuf:"bytes,1,rep,name=gateways,proto3" json:"gateways,omitempty"` + // Optional: Filter by specific providers + Providers []string `protobuf:"bytes,2,rep,name=providers,proto3" json:"providers,omitempty"` + // Optional: Filter by specific models + Models []string `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty"` + // Optional: Filter by specific teams (JSONB extraction) + Teams []string `protobuf:"bytes,4,rep,name=teams,proto3" json:"teams,omitempty"` + // Optional: Filter by specific organizations (JSONB extraction) + Organizations []string `protobuf:"bytes,5,rep,name=organizations,proto3" json:"organizations,omitempty"` + // Optional: Filter by specific users (JSONB extraction) + Users []string `protobuf:"bytes,6,rep,name=users,proto3" json:"users,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendingFilters) Reset() { + *x = SpendingFilters{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendingFilters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendingFilters) ProtoMessage() {} + +func (x *SpendingFilters) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendingFilters.ProtoReflect.Descriptor instead. +func (*SpendingFilters) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{0} +} + +func (x *SpendingFilters) GetGateways() []string { + if x != nil { + return x.Gateways + } + return nil +} + +func (x *SpendingFilters) GetProviders() []string { + if x != nil { + return x.Providers + } + return nil +} + +func (x *SpendingFilters) GetModels() []string { + if x != nil { + return x.Models + } + return nil +} + +func (x *SpendingFilters) GetTeams() []string { + if x != nil { + return x.Teams + } + return nil +} + +func (x *SpendingFilters) GetOrganizations() []string { + if x != nil { + return x.Organizations + } + return nil +} + +func (x *SpendingFilters) GetUsers() []string { + if x != nil { + return x.Users + } + return nil +} + +// Request message for GetSpendingSummary +type GetSpendingSummaryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Time range for the summary + TimeRange TimeRange `protobuf:"varint,1,opt,name=time_range,json=timeRange,proto3,enum=redpanda.api.aigateway.v1.TimeRange" json:"time_range,omitempty"` + // Optional: Custom start date (required if time_range = CUSTOM) + StartDate *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + // Optional: Custom end date (required if time_range = CUSTOM) + EndDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` + // Optional: Filters to apply + Filters *SpendingFilters `protobuf:"bytes,4,opt,name=filters,proto3" json:"filters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingSummaryRequest) Reset() { + *x = GetSpendingSummaryRequest{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingSummaryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingSummaryRequest) ProtoMessage() {} + +func (x *GetSpendingSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetSpendingSummaryRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{1} +} + +func (x *GetSpendingSummaryRequest) GetTimeRange() TimeRange { + if x != nil { + return x.TimeRange + } + return TimeRange_TIME_RANGE_UNSPECIFIED +} + +func (x *GetSpendingSummaryRequest) GetStartDate() *timestamppb.Timestamp { + if x != nil { + return x.StartDate + } + return nil +} + +func (x *GetSpendingSummaryRequest) GetEndDate() *timestamppb.Timestamp { + if x != nil { + return x.EndDate + } + return nil +} + +func (x *GetSpendingSummaryRequest) GetFilters() *SpendingFilters { + if x != nil { + return x.Filters + } + return nil +} + +// Response message for GetSpendingSummary +type GetSpendingSummaryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Current period metrics + Current *SpendingSummary `protobuf:"bytes,1,opt,name=current,proto3" json:"current,omitempty"` + // Previous period metrics (for trend calculation) + Previous *SpendingSummary `protobuf:"bytes,2,opt,name=previous,proto3" json:"previous,omitempty"` + // Percentage change from previous period + Trends *TrendMetrics `protobuf:"bytes,3,opt,name=trends,proto3" json:"trends,omitempty"` + // Top model by cost in current period + TopModel string `protobuf:"bytes,4,opt,name=top_model,json=topModel,proto3" json:"top_model,omitempty"` + // Top provider by cost in current period + TopProvider string `protobuf:"bytes,5,opt,name=top_provider,json=topProvider,proto3" json:"top_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingSummaryResponse) Reset() { + *x = GetSpendingSummaryResponse{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingSummaryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingSummaryResponse) ProtoMessage() {} + +func (x *GetSpendingSummaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingSummaryResponse.ProtoReflect.Descriptor instead. +func (*GetSpendingSummaryResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{2} +} + +func (x *GetSpendingSummaryResponse) GetCurrent() *SpendingSummary { + if x != nil { + return x.Current + } + return nil +} + +func (x *GetSpendingSummaryResponse) GetPrevious() *SpendingSummary { + if x != nil { + return x.Previous + } + return nil +} + +func (x *GetSpendingSummaryResponse) GetTrends() *TrendMetrics { + if x != nil { + return x.Trends + } + return nil +} + +func (x *GetSpendingSummaryResponse) GetTopModel() string { + if x != nil { + return x.TopModel + } + return "" +} + +func (x *GetSpendingSummaryResponse) GetTopProvider() string { + if x != nil { + return x.TopProvider + } + return "" +} + +// SpendingSummary contains aggregated metrics for a time period. +type SpendingSummary struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Total cost in cents + TotalCostCents int64 `protobuf:"varint,1,opt,name=total_cost_cents,json=totalCostCents,proto3" json:"total_cost_cents,omitempty"` + // Total number of requests + TotalRequests int64 `protobuf:"varint,2,opt,name=total_requests,json=totalRequests,proto3" json:"total_requests,omitempty"` + // Total input tokens + TotalInputTokens int64 `protobuf:"varint,3,opt,name=total_input_tokens,json=totalInputTokens,proto3" json:"total_input_tokens,omitempty"` + // Total output tokens + TotalOutputTokens int64 `protobuf:"varint,4,opt,name=total_output_tokens,json=totalOutputTokens,proto3" json:"total_output_tokens,omitempty"` + // Total tokens (input + output) + TotalTokens int64 `protobuf:"varint,5,opt,name=total_tokens,json=totalTokens,proto3" json:"total_tokens,omitempty"` + // Average cost per request in cents + AvgCostPerRequestCents int64 `protobuf:"varint,6,opt,name=avg_cost_per_request_cents,json=avgCostPerRequestCents,proto3" json:"avg_cost_per_request_cents,omitempty"` + // Average tokens per request + AvgTokensPerRequest int64 `protobuf:"varint,7,opt,name=avg_tokens_per_request,json=avgTokensPerRequest,proto3" json:"avg_tokens_per_request,omitempty"` + // Period start time + PeriodStart *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=period_start,json=periodStart,proto3" json:"period_start,omitempty"` + // Period end time + PeriodEnd *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=period_end,json=periodEnd,proto3" json:"period_end,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendingSummary) Reset() { + *x = SpendingSummary{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendingSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendingSummary) ProtoMessage() {} + +func (x *SpendingSummary) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendingSummary.ProtoReflect.Descriptor instead. +func (*SpendingSummary) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{3} +} + +func (x *SpendingSummary) GetTotalCostCents() int64 { + if x != nil { + return x.TotalCostCents + } + return 0 +} + +func (x *SpendingSummary) GetTotalRequests() int64 { + if x != nil { + return x.TotalRequests + } + return 0 +} + +func (x *SpendingSummary) GetTotalInputTokens() int64 { + if x != nil { + return x.TotalInputTokens + } + return 0 +} + +func (x *SpendingSummary) GetTotalOutputTokens() int64 { + if x != nil { + return x.TotalOutputTokens + } + return 0 +} + +func (x *SpendingSummary) GetTotalTokens() int64 { + if x != nil { + return x.TotalTokens + } + return 0 +} + +func (x *SpendingSummary) GetAvgCostPerRequestCents() int64 { + if x != nil { + return x.AvgCostPerRequestCents + } + return 0 +} + +func (x *SpendingSummary) GetAvgTokensPerRequest() int64 { + if x != nil { + return x.AvgTokensPerRequest + } + return 0 +} + +func (x *SpendingSummary) GetPeriodStart() *timestamppb.Timestamp { + if x != nil { + return x.PeriodStart + } + return nil +} + +func (x *SpendingSummary) GetPeriodEnd() *timestamppb.Timestamp { + if x != nil { + return x.PeriodEnd + } + return nil +} + +// TrendMetrics contains percentage changes compared to previous period. +type TrendMetrics struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Cost change percentage (-100 to +infinity) + CostChangePercent float64 `protobuf:"fixed64,1,opt,name=cost_change_percent,json=costChangePercent,proto3" json:"cost_change_percent,omitempty"` + // Requests change percentage + RequestsChangePercent float64 `protobuf:"fixed64,2,opt,name=requests_change_percent,json=requestsChangePercent,proto3" json:"requests_change_percent,omitempty"` + // Tokens change percentage + TokensChangePercent float64 `protobuf:"fixed64,3,opt,name=tokens_change_percent,json=tokensChangePercent,proto3" json:"tokens_change_percent,omitempty"` + // Average cost per request change percentage + AvgCostChangePercent float64 `protobuf:"fixed64,4,opt,name=avg_cost_change_percent,json=avgCostChangePercent,proto3" json:"avg_cost_change_percent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TrendMetrics) Reset() { + *x = TrendMetrics{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TrendMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrendMetrics) ProtoMessage() {} + +func (x *TrendMetrics) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrendMetrics.ProtoReflect.Descriptor instead. +func (*TrendMetrics) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{4} +} + +func (x *TrendMetrics) GetCostChangePercent() float64 { + if x != nil { + return x.CostChangePercent + } + return 0 +} + +func (x *TrendMetrics) GetRequestsChangePercent() float64 { + if x != nil { + return x.RequestsChangePercent + } + return 0 +} + +func (x *TrendMetrics) GetTokensChangePercent() float64 { + if x != nil { + return x.TokensChangePercent + } + return 0 +} + +func (x *TrendMetrics) GetAvgCostChangePercent() float64 { + if x != nil { + return x.AvgCostChangePercent + } + return 0 +} + +// Request message for GetSpendingTimeSeries +type GetSpendingTimeSeriesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Time range + TimeRange TimeRange `protobuf:"varint,1,opt,name=time_range,json=timeRange,proto3,enum=redpanda.api.aigateway.v1.TimeRange" json:"time_range,omitempty"` + // Optional: Custom start date (required if time_range = CUSTOM) + StartDate *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + // Optional: Custom end date (required if time_range = CUSTOM) + EndDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` + // Optional: Filters to apply + Filters *SpendingFilters `protobuf:"bytes,4,opt,name=filters,proto3" json:"filters,omitempty"` + // Optional: Granularity (auto-selected if not specified) + Granularity Granularity `protobuf:"varint,5,opt,name=granularity,proto3,enum=redpanda.api.aigateway.v1.Granularity" json:"granularity,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingTimeSeriesRequest) Reset() { + *x = GetSpendingTimeSeriesRequest{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingTimeSeriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingTimeSeriesRequest) ProtoMessage() {} + +func (x *GetSpendingTimeSeriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingTimeSeriesRequest.ProtoReflect.Descriptor instead. +func (*GetSpendingTimeSeriesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{5} +} + +func (x *GetSpendingTimeSeriesRequest) GetTimeRange() TimeRange { + if x != nil { + return x.TimeRange + } + return TimeRange_TIME_RANGE_UNSPECIFIED +} + +func (x *GetSpendingTimeSeriesRequest) GetStartDate() *timestamppb.Timestamp { + if x != nil { + return x.StartDate + } + return nil +} + +func (x *GetSpendingTimeSeriesRequest) GetEndDate() *timestamppb.Timestamp { + if x != nil { + return x.EndDate + } + return nil +} + +func (x *GetSpendingTimeSeriesRequest) GetFilters() *SpendingFilters { + if x != nil { + return x.Filters + } + return nil +} + +func (x *GetSpendingTimeSeriesRequest) GetGranularity() Granularity { + if x != nil { + return x.Granularity + } + return Granularity_GRANULARITY_UNSPECIFIED +} + +// Response message for GetSpendingTimeSeries +type GetSpendingTimeSeriesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Time series data points + DataPoints []*TimeSeriesDataPoint `protobuf:"bytes,1,rep,name=data_points,json=dataPoints,proto3" json:"data_points,omitempty"` + // Granularity used for the time series + Granularity Granularity `protobuf:"varint,2,opt,name=granularity,proto3,enum=redpanda.api.aigateway.v1.Granularity" json:"granularity,omitempty"` + // Total metrics across all data points + Totals *SpendingSummary `protobuf:"bytes,3,opt,name=totals,proto3" json:"totals,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingTimeSeriesResponse) Reset() { + *x = GetSpendingTimeSeriesResponse{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingTimeSeriesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingTimeSeriesResponse) ProtoMessage() {} + +func (x *GetSpendingTimeSeriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingTimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*GetSpendingTimeSeriesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{6} +} + +func (x *GetSpendingTimeSeriesResponse) GetDataPoints() []*TimeSeriesDataPoint { + if x != nil { + return x.DataPoints + } + return nil +} + +func (x *GetSpendingTimeSeriesResponse) GetGranularity() Granularity { + if x != nil { + return x.Granularity + } + return Granularity_GRANULARITY_UNSPECIFIED +} + +func (x *GetSpendingTimeSeriesResponse) GetTotals() *SpendingSummary { + if x != nil { + return x.Totals + } + return nil +} + +// TimeSeriesDataPoint represents metrics for a single time bucket. +type TimeSeriesDataPoint struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Timestamp for this bucket (start of period) + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Cost in cents for this period + CostCents int64 `protobuf:"varint,2,opt,name=cost_cents,json=costCents,proto3" json:"cost_cents,omitempty"` + // Number of requests in this period + Requests int64 `protobuf:"varint,3,opt,name=requests,proto3" json:"requests,omitempty"` + // Total tokens in this period + Tokens int64 `protobuf:"varint,4,opt,name=tokens,proto3" json:"tokens,omitempty"` + // Input tokens in this period + InputTokens int64 `protobuf:"varint,5,opt,name=input_tokens,json=inputTokens,proto3" json:"input_tokens,omitempty"` + // Output tokens in this period + OutputTokens int64 `protobuf:"varint,6,opt,name=output_tokens,json=outputTokens,proto3" json:"output_tokens,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TimeSeriesDataPoint) Reset() { + *x = TimeSeriesDataPoint{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TimeSeriesDataPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TimeSeriesDataPoint) ProtoMessage() {} + +func (x *TimeSeriesDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TimeSeriesDataPoint.ProtoReflect.Descriptor instead. +func (*TimeSeriesDataPoint) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{7} +} + +func (x *TimeSeriesDataPoint) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *TimeSeriesDataPoint) GetCostCents() int64 { + if x != nil { + return x.CostCents + } + return 0 +} + +func (x *TimeSeriesDataPoint) GetRequests() int64 { + if x != nil { + return x.Requests + } + return 0 +} + +func (x *TimeSeriesDataPoint) GetTokens() int64 { + if x != nil { + return x.Tokens + } + return 0 +} + +func (x *TimeSeriesDataPoint) GetInputTokens() int64 { + if x != nil { + return x.InputTokens + } + return 0 +} + +func (x *TimeSeriesDataPoint) GetOutputTokens() int64 { + if x != nil { + return x.OutputTokens + } + return 0 +} + +// Request message for GetSpendingBreakdown +type GetSpendingBreakdownRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Dimension to break down by + Dimension BreakdownDimension `protobuf:"varint,1,opt,name=dimension,proto3,enum=redpanda.api.aigateway.v1.BreakdownDimension" json:"dimension,omitempty"` + // Required: Time range + TimeRange TimeRange `protobuf:"varint,2,opt,name=time_range,json=timeRange,proto3,enum=redpanda.api.aigateway.v1.TimeRange" json:"time_range,omitempty"` + // Optional: Custom start date (required if time_range = CUSTOM) + StartDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + // Optional: Custom end date (required if time_range = CUSTOM) + EndDate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` + // Optional: Filters to apply + Filters *SpendingFilters `protobuf:"bytes,5,opt,name=filters,proto3" json:"filters,omitempty"` + // Optional: Maximum number of results (default: 20, max: 100) + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingBreakdownRequest) Reset() { + *x = GetSpendingBreakdownRequest{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingBreakdownRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingBreakdownRequest) ProtoMessage() {} + +func (x *GetSpendingBreakdownRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingBreakdownRequest.ProtoReflect.Descriptor instead. +func (*GetSpendingBreakdownRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{8} +} + +func (x *GetSpendingBreakdownRequest) GetDimension() BreakdownDimension { + if x != nil { + return x.Dimension + } + return BreakdownDimension_BREAKDOWN_DIMENSION_UNSPECIFIED +} + +func (x *GetSpendingBreakdownRequest) GetTimeRange() TimeRange { + if x != nil { + return x.TimeRange + } + return TimeRange_TIME_RANGE_UNSPECIFIED +} + +func (x *GetSpendingBreakdownRequest) GetStartDate() *timestamppb.Timestamp { + if x != nil { + return x.StartDate + } + return nil +} + +func (x *GetSpendingBreakdownRequest) GetEndDate() *timestamppb.Timestamp { + if x != nil { + return x.EndDate + } + return nil +} + +func (x *GetSpendingBreakdownRequest) GetFilters() *SpendingFilters { + if x != nil { + return x.Filters + } + return nil +} + +func (x *GetSpendingBreakdownRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +// Response message for GetSpendingBreakdown +type GetSpendingBreakdownResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Breakdown entries sorted by cost descending + Entries []*BreakdownEntry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + // Total cost across all entries + TotalCostCents int64 `protobuf:"varint,2,opt,name=total_cost_cents,json=totalCostCents,proto3" json:"total_cost_cents,omitempty"` + // Dimension used for breakdown + Dimension BreakdownDimension `protobuf:"varint,3,opt,name=dimension,proto3,enum=redpanda.api.aigateway.v1.BreakdownDimension" json:"dimension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendingBreakdownResponse) Reset() { + *x = GetSpendingBreakdownResponse{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendingBreakdownResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendingBreakdownResponse) ProtoMessage() {} + +func (x *GetSpendingBreakdownResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendingBreakdownResponse.ProtoReflect.Descriptor instead. +func (*GetSpendingBreakdownResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{9} +} + +func (x *GetSpendingBreakdownResponse) GetEntries() []*BreakdownEntry { + if x != nil { + return x.Entries + } + return nil +} + +func (x *GetSpendingBreakdownResponse) GetTotalCostCents() int64 { + if x != nil { + return x.TotalCostCents + } + return 0 +} + +func (x *GetSpendingBreakdownResponse) GetDimension() BreakdownDimension { + if x != nil { + return x.Dimension + } + return BreakdownDimension_BREAKDOWN_DIMENSION_UNSPECIFIED +} + +// BreakdownEntry represents spending for a single dimension value. +type BreakdownEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Dimension value (e.g., "openai", "gpt-4o", "gateway-1", "team-a") + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Display name (if different from name) + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Cost in cents + CostCents int64 `protobuf:"varint,3,opt,name=cost_cents,json=costCents,proto3" json:"cost_cents,omitempty"` + // Number of requests + Requests int64 `protobuf:"varint,4,opt,name=requests,proto3" json:"requests,omitempty"` + // Total tokens + Tokens int64 `protobuf:"varint,5,opt,name=tokens,proto3" json:"tokens,omitempty"` + // Input tokens + InputTokens int64 `protobuf:"varint,6,opt,name=input_tokens,json=inputTokens,proto3" json:"input_tokens,omitempty"` + // Output tokens + OutputTokens int64 `protobuf:"varint,7,opt,name=output_tokens,json=outputTokens,proto3" json:"output_tokens,omitempty"` + // Percentage of total cost + Percentage float64 `protobuf:"fixed64,8,opt,name=percentage,proto3" json:"percentage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BreakdownEntry) Reset() { + *x = BreakdownEntry{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BreakdownEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BreakdownEntry) ProtoMessage() {} + +func (x *BreakdownEntry) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BreakdownEntry.ProtoReflect.Descriptor instead. +func (*BreakdownEntry) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{10} +} + +func (x *BreakdownEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BreakdownEntry) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *BreakdownEntry) GetCostCents() int64 { + if x != nil { + return x.CostCents + } + return 0 +} + +func (x *BreakdownEntry) GetRequests() int64 { + if x != nil { + return x.Requests + } + return 0 +} + +func (x *BreakdownEntry) GetTokens() int64 { + if x != nil { + return x.Tokens + } + return 0 +} + +func (x *BreakdownEntry) GetInputTokens() int64 { + if x != nil { + return x.InputTokens + } + return 0 +} + +func (x *BreakdownEntry) GetOutputTokens() int64 { + if x != nil { + return x.OutputTokens + } + return 0 +} + +func (x *BreakdownEntry) GetPercentage() float64 { + if x != nil { + return x.Percentage + } + return 0 +} + +// Request message for GetTopSpenders +type GetTopSpendersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Dimension to rank by + Dimension BreakdownDimension `protobuf:"varint,1,opt,name=dimension,proto3,enum=redpanda.api.aigateway.v1.BreakdownDimension" json:"dimension,omitempty"` + // Required: Time range + TimeRange TimeRange `protobuf:"varint,2,opt,name=time_range,json=timeRange,proto3,enum=redpanda.api.aigateway.v1.TimeRange" json:"time_range,omitempty"` + // Optional: Custom start date (required if time_range = CUSTOM) + StartDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + // Optional: Custom end date (required if time_range = CUSTOM) + EndDate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` + // Optional: Filters to apply + Filters *SpendingFilters `protobuf:"bytes,5,opt,name=filters,proto3" json:"filters,omitempty"` + // Optional: Maximum number of results (default: 10, max: 100) + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTopSpendersRequest) Reset() { + *x = GetTopSpendersRequest{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTopSpendersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTopSpendersRequest) ProtoMessage() {} + +func (x *GetTopSpendersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTopSpendersRequest.ProtoReflect.Descriptor instead. +func (*GetTopSpendersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{11} +} + +func (x *GetTopSpendersRequest) GetDimension() BreakdownDimension { + if x != nil { + return x.Dimension + } + return BreakdownDimension_BREAKDOWN_DIMENSION_UNSPECIFIED +} + +func (x *GetTopSpendersRequest) GetTimeRange() TimeRange { + if x != nil { + return x.TimeRange + } + return TimeRange_TIME_RANGE_UNSPECIFIED +} + +func (x *GetTopSpendersRequest) GetStartDate() *timestamppb.Timestamp { + if x != nil { + return x.StartDate + } + return nil +} + +func (x *GetTopSpendersRequest) GetEndDate() *timestamppb.Timestamp { + if x != nil { + return x.EndDate + } + return nil +} + +func (x *GetTopSpendersRequest) GetFilters() *SpendingFilters { + if x != nil { + return x.Filters + } + return nil +} + +func (x *GetTopSpendersRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +// Response message for GetTopSpenders +type GetTopSpendersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Top spenders sorted by cost descending + Entries []*TopSpenderEntry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + // Dimension used for ranking + Dimension BreakdownDimension `protobuf:"varint,2,opt,name=dimension,proto3,enum=redpanda.api.aigateway.v1.BreakdownDimension" json:"dimension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTopSpendersResponse) Reset() { + *x = GetTopSpendersResponse{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTopSpendersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTopSpendersResponse) ProtoMessage() {} + +func (x *GetTopSpendersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTopSpendersResponse.ProtoReflect.Descriptor instead. +func (*GetTopSpendersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{12} +} + +func (x *GetTopSpendersResponse) GetEntries() []*TopSpenderEntry { + if x != nil { + return x.Entries + } + return nil +} + +func (x *GetTopSpendersResponse) GetDimension() BreakdownDimension { + if x != nil { + return x.Dimension + } + return BreakdownDimension_BREAKDOWN_DIMENSION_UNSPECIFIED +} + +// TopSpenderEntry represents a single top spender. +type TopSpenderEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Rank (1 = highest spender) + Rank int32 `protobuf:"varint,1,opt,name=rank,proto3" json:"rank,omitempty"` + // Dimension value (e.g., user ID, team name) + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Display name (if different from name) + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Cost in cents + CostCents int64 `protobuf:"varint,4,opt,name=cost_cents,json=costCents,proto3" json:"cost_cents,omitempty"` + // Number of requests + Requests int64 `protobuf:"varint,5,opt,name=requests,proto3" json:"requests,omitempty"` + // Total tokens + Tokens int64 `protobuf:"varint,6,opt,name=tokens,proto3" json:"tokens,omitempty"` + // Average cost per request in cents + AvgCostPerRequestCents int64 `protobuf:"varint,7,opt,name=avg_cost_per_request_cents,json=avgCostPerRequestCents,proto3" json:"avg_cost_per_request_cents,omitempty"` + // Most used model + TopModel string `protobuf:"bytes,8,opt,name=top_model,json=topModel,proto3" json:"top_model,omitempty"` + // Most used provider + TopProvider string `protobuf:"bytes,9,opt,name=top_provider,json=topProvider,proto3" json:"top_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TopSpenderEntry) Reset() { + *x = TopSpenderEntry{} + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TopSpenderEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopSpenderEntry) ProtoMessage() {} + +func (x *TopSpenderEntry) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_analytics_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TopSpenderEntry.ProtoReflect.Descriptor instead. +func (*TopSpenderEntry) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP(), []int{13} +} + +func (x *TopSpenderEntry) GetRank() int32 { + if x != nil { + return x.Rank + } + return 0 +} + +func (x *TopSpenderEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *TopSpenderEntry) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *TopSpenderEntry) GetCostCents() int64 { + if x != nil { + return x.CostCents + } + return 0 +} + +func (x *TopSpenderEntry) GetRequests() int64 { + if x != nil { + return x.Requests + } + return 0 +} + +func (x *TopSpenderEntry) GetTokens() int64 { + if x != nil { + return x.Tokens + } + return 0 +} + +func (x *TopSpenderEntry) GetAvgCostPerRequestCents() int64 { + if x != nil { + return x.AvgCostPerRequestCents + } + return 0 +} + +func (x *TopSpenderEntry) GetTopModel() string { + if x != nil { + return x.TopModel + } + return "" +} + +func (x *TopSpenderEntry) GetTopProvider() string { + if x != nil { + return x.TopProvider + } + return "" +} + +var File_redpanda_api_aigateway_v1_analytics_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_analytics_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb5, 0x01, 0x0a, + 0x0f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, + 0x74, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xc4, 0x02, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x06, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x06, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x74, 0x6f, + 0x70, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0c, + 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x22, 0xce, 0x03, 0x0a, 0x0f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x43, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x61, 0x76, + 0x67, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, + 0x61, 0x76, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x61, 0x76, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x50, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x22, 0xe1, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x32, + 0x0a, 0x15, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x17, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x61, 0x76, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x88, 0x03, 0x0a, 0x1c, 0x47, 0x65, + 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, + 0x01, 0x20, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x22, 0x8d, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x0b, + 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, + 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, + 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x06, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x06, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x73, 0x22, 0xea, 0x01, 0x0a, 0x13, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x73, 0x74, + 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0xb8, 0x03, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x5a, 0x0a, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, + 0x20, 0x00, 0x52, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x82, + 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x49, 0x0a, + 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x06, 0x1a, + 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe9, 0x01, 0x0a, + 0x1c, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, + 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x64, 0x6f, 0x77, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, + 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x44, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x64, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x02, 0x0a, 0x0e, 0x42, 0x72, 0x65, + 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0xb2, 0x03, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, + 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0d, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x22, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, + 0x41, 0x01, 0xba, 0x48, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, + 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x09, 0x64, 0x69, 0x6d, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, + 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x09, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x02, 0x0a, 0x0f, 0x54, + 0x6f, 0x70, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x61, + 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x6f, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x1a, + 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x16, 0x61, 0x76, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x70, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2a, 0x88, 0x01, 0x0a, 0x09, 0x54, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, + 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, + 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x32, 0x34, 0x48, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x37, + 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, + 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x33, 0x30, 0x44, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, + 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, + 0x4d, 0x10, 0x04, 0x2a, 0xfd, 0x01, 0x0a, 0x12, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, + 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x52, + 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, 0x49, 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x20, 0x0a, 0x1c, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, 0x49, 0x4d, + 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x10, + 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, + 0x49, 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x10, 0x02, + 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, 0x49, + 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, + 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, + 0x49, 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x04, 0x12, + 0x24, 0x0a, 0x20, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x44, 0x49, 0x4d, + 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x44, 0x4f, + 0x57, 0x4e, 0x5f, 0x44, 0x49, 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, + 0x52, 0x10, 0x06, 0x2a, 0x6b, 0x0a, 0x0b, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x47, 0x52, 0x41, 0x4e, 0x55, 0x4c, 0x41, 0x52, 0x49, 0x54, + 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x14, 0x0a, 0x10, 0x47, 0x52, 0x41, 0x4e, 0x55, 0x4c, 0x41, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, + 0x4f, 0x55, 0x52, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x47, 0x52, 0x41, 0x4e, 0x55, 0x4c, 0x41, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x41, 0x59, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x52, + 0x41, 0x4e, 0x55, 0x4c, 0x41, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x57, 0x45, 0x45, 0x4b, 0x10, 0x03, + 0x32, 0xeb, 0x05, 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x34, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0xb6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0xb1, 0x01, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x2f, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0xa2, + 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x6f, 0x70, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, + 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x2f, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x6f, 0x70, 0x2d, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x83, + 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x42, 0x0e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, + 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, + 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_analytics_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_analytics_proto_rawDescData = file_redpanda_api_aigateway_v1_analytics_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_analytics_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_analytics_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_analytics_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_analytics_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_analytics_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_analytics_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_redpanda_api_aigateway_v1_analytics_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_redpanda_api_aigateway_v1_analytics_proto_goTypes = []any{ + (TimeRange)(0), // 0: redpanda.api.aigateway.v1.TimeRange + (BreakdownDimension)(0), // 1: redpanda.api.aigateway.v1.BreakdownDimension + (Granularity)(0), // 2: redpanda.api.aigateway.v1.Granularity + (*SpendingFilters)(nil), // 3: redpanda.api.aigateway.v1.SpendingFilters + (*GetSpendingSummaryRequest)(nil), // 4: redpanda.api.aigateway.v1.GetSpendingSummaryRequest + (*GetSpendingSummaryResponse)(nil), // 5: redpanda.api.aigateway.v1.GetSpendingSummaryResponse + (*SpendingSummary)(nil), // 6: redpanda.api.aigateway.v1.SpendingSummary + (*TrendMetrics)(nil), // 7: redpanda.api.aigateway.v1.TrendMetrics + (*GetSpendingTimeSeriesRequest)(nil), // 8: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest + (*GetSpendingTimeSeriesResponse)(nil), // 9: redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse + (*TimeSeriesDataPoint)(nil), // 10: redpanda.api.aigateway.v1.TimeSeriesDataPoint + (*GetSpendingBreakdownRequest)(nil), // 11: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest + (*GetSpendingBreakdownResponse)(nil), // 12: redpanda.api.aigateway.v1.GetSpendingBreakdownResponse + (*BreakdownEntry)(nil), // 13: redpanda.api.aigateway.v1.BreakdownEntry + (*GetTopSpendersRequest)(nil), // 14: redpanda.api.aigateway.v1.GetTopSpendersRequest + (*GetTopSpendersResponse)(nil), // 15: redpanda.api.aigateway.v1.GetTopSpendersResponse + (*TopSpenderEntry)(nil), // 16: redpanda.api.aigateway.v1.TopSpenderEntry + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_analytics_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.GetSpendingSummaryRequest.time_range:type_name -> redpanda.api.aigateway.v1.TimeRange + 17, // 1: redpanda.api.aigateway.v1.GetSpendingSummaryRequest.start_date:type_name -> google.protobuf.Timestamp + 17, // 2: redpanda.api.aigateway.v1.GetSpendingSummaryRequest.end_date:type_name -> google.protobuf.Timestamp + 3, // 3: redpanda.api.aigateway.v1.GetSpendingSummaryRequest.filters:type_name -> redpanda.api.aigateway.v1.SpendingFilters + 6, // 4: redpanda.api.aigateway.v1.GetSpendingSummaryResponse.current:type_name -> redpanda.api.aigateway.v1.SpendingSummary + 6, // 5: redpanda.api.aigateway.v1.GetSpendingSummaryResponse.previous:type_name -> redpanda.api.aigateway.v1.SpendingSummary + 7, // 6: redpanda.api.aigateway.v1.GetSpendingSummaryResponse.trends:type_name -> redpanda.api.aigateway.v1.TrendMetrics + 17, // 7: redpanda.api.aigateway.v1.SpendingSummary.period_start:type_name -> google.protobuf.Timestamp + 17, // 8: redpanda.api.aigateway.v1.SpendingSummary.period_end:type_name -> google.protobuf.Timestamp + 0, // 9: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest.time_range:type_name -> redpanda.api.aigateway.v1.TimeRange + 17, // 10: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest.start_date:type_name -> google.protobuf.Timestamp + 17, // 11: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest.end_date:type_name -> google.protobuf.Timestamp + 3, // 12: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest.filters:type_name -> redpanda.api.aigateway.v1.SpendingFilters + 2, // 13: redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest.granularity:type_name -> redpanda.api.aigateway.v1.Granularity + 10, // 14: redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse.data_points:type_name -> redpanda.api.aigateway.v1.TimeSeriesDataPoint + 2, // 15: redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse.granularity:type_name -> redpanda.api.aigateway.v1.Granularity + 6, // 16: redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse.totals:type_name -> redpanda.api.aigateway.v1.SpendingSummary + 17, // 17: redpanda.api.aigateway.v1.TimeSeriesDataPoint.timestamp:type_name -> google.protobuf.Timestamp + 1, // 18: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest.dimension:type_name -> redpanda.api.aigateway.v1.BreakdownDimension + 0, // 19: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest.time_range:type_name -> redpanda.api.aigateway.v1.TimeRange + 17, // 20: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest.start_date:type_name -> google.protobuf.Timestamp + 17, // 21: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest.end_date:type_name -> google.protobuf.Timestamp + 3, // 22: redpanda.api.aigateway.v1.GetSpendingBreakdownRequest.filters:type_name -> redpanda.api.aigateway.v1.SpendingFilters + 13, // 23: redpanda.api.aigateway.v1.GetSpendingBreakdownResponse.entries:type_name -> redpanda.api.aigateway.v1.BreakdownEntry + 1, // 24: redpanda.api.aigateway.v1.GetSpendingBreakdownResponse.dimension:type_name -> redpanda.api.aigateway.v1.BreakdownDimension + 1, // 25: redpanda.api.aigateway.v1.GetTopSpendersRequest.dimension:type_name -> redpanda.api.aigateway.v1.BreakdownDimension + 0, // 26: redpanda.api.aigateway.v1.GetTopSpendersRequest.time_range:type_name -> redpanda.api.aigateway.v1.TimeRange + 17, // 27: redpanda.api.aigateway.v1.GetTopSpendersRequest.start_date:type_name -> google.protobuf.Timestamp + 17, // 28: redpanda.api.aigateway.v1.GetTopSpendersRequest.end_date:type_name -> google.protobuf.Timestamp + 3, // 29: redpanda.api.aigateway.v1.GetTopSpendersRequest.filters:type_name -> redpanda.api.aigateway.v1.SpendingFilters + 16, // 30: redpanda.api.aigateway.v1.GetTopSpendersResponse.entries:type_name -> redpanda.api.aigateway.v1.TopSpenderEntry + 1, // 31: redpanda.api.aigateway.v1.GetTopSpendersResponse.dimension:type_name -> redpanda.api.aigateway.v1.BreakdownDimension + 4, // 32: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary:input_type -> redpanda.api.aigateway.v1.GetSpendingSummaryRequest + 8, // 33: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries:input_type -> redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest + 11, // 34: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown:input_type -> redpanda.api.aigateway.v1.GetSpendingBreakdownRequest + 14, // 35: redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders:input_type -> redpanda.api.aigateway.v1.GetTopSpendersRequest + 5, // 36: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary:output_type -> redpanda.api.aigateway.v1.GetSpendingSummaryResponse + 9, // 37: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries:output_type -> redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse + 12, // 38: redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown:output_type -> redpanda.api.aigateway.v1.GetSpendingBreakdownResponse + 15, // 39: redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders:output_type -> redpanda.api.aigateway.v1.GetTopSpendersResponse + 36, // [36:40] is the sub-list for method output_type + 32, // [32:36] is the sub-list for method input_type + 32, // [32:32] is the sub-list for extension type_name + 32, // [32:32] is the sub-list for extension extendee + 0, // [0:32] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_analytics_proto_init() } +func file_redpanda_api_aigateway_v1_analytics_proto_init() { + if File_redpanda_api_aigateway_v1_analytics_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_analytics_proto_rawDesc, + NumEnums: 3, + NumMessages: 14, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_analytics_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_analytics_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_analytics_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_analytics_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_analytics_proto = out.File + file_redpanda_api_aigateway_v1_analytics_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_analytics_proto_goTypes = nil + file_redpanda_api_aigateway_v1_analytics_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.gw.go new file mode 100644 index 0000000000..e9cb9ef13a --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics.pb.gw.go @@ -0,0 +1,387 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/analytics.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_AnalyticsService_GetSpendingSummary_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AnalyticsService_GetSpendingSummary_0(ctx context.Context, marshaler runtime.Marshaler, client AnalyticsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingSummaryRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingSummary_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetSpendingSummary(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AnalyticsService_GetSpendingSummary_0(ctx context.Context, marshaler runtime.Marshaler, server AnalyticsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingSummaryRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingSummary_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetSpendingSummary(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AnalyticsService_GetSpendingTimeSeries_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AnalyticsService_GetSpendingTimeSeries_0(ctx context.Context, marshaler runtime.Marshaler, client AnalyticsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingTimeSeriesRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingTimeSeries_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetSpendingTimeSeries(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AnalyticsService_GetSpendingTimeSeries_0(ctx context.Context, marshaler runtime.Marshaler, server AnalyticsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingTimeSeriesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingTimeSeries_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetSpendingTimeSeries(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AnalyticsService_GetSpendingBreakdown_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AnalyticsService_GetSpendingBreakdown_0(ctx context.Context, marshaler runtime.Marshaler, client AnalyticsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingBreakdownRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingBreakdown_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetSpendingBreakdown(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AnalyticsService_GetSpendingBreakdown_0(ctx context.Context, marshaler runtime.Marshaler, server AnalyticsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendingBreakdownRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetSpendingBreakdown_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetSpendingBreakdown(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AnalyticsService_GetTopSpenders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AnalyticsService_GetTopSpenders_0(ctx context.Context, marshaler runtime.Marshaler, client AnalyticsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTopSpendersRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetTopSpenders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetTopSpenders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AnalyticsService_GetTopSpenders_0(ctx context.Context, marshaler runtime.Marshaler, server AnalyticsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTopSpendersRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AnalyticsService_GetTopSpenders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetTopSpenders(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterAnalyticsServiceHandlerServer registers the http handlers for service AnalyticsService to "mux". +// UnaryRPC :call AnalyticsServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAnalyticsServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterAnalyticsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AnalyticsServiceServer) error { + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingSummary_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingSummary", runtime.WithHTTPPathPattern("/v1/analytics/spending/summary")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AnalyticsService_GetSpendingSummary_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingSummary_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingTimeSeries_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingTimeSeries", runtime.WithHTTPPathPattern("/v1/analytics/spending/time-series")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AnalyticsService_GetSpendingTimeSeries_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingTimeSeries_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingBreakdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingBreakdown", runtime.WithHTTPPathPattern("/v1/analytics/spending/breakdown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AnalyticsService_GetSpendingBreakdown_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingBreakdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetTopSpenders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetTopSpenders", runtime.WithHTTPPathPattern("/v1/analytics/spending/top-spenders")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AnalyticsService_GetTopSpenders_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetTopSpenders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterAnalyticsServiceHandlerFromEndpoint is same as RegisterAnalyticsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAnalyticsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterAnalyticsServiceHandler(ctx, mux, conn) +} + +// RegisterAnalyticsServiceHandler registers the http handlers for service AnalyticsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAnalyticsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAnalyticsServiceHandlerClient(ctx, mux, NewAnalyticsServiceClient(conn)) +} + +// RegisterAnalyticsServiceHandlerClient registers the http handlers for service AnalyticsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AnalyticsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AnalyticsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AnalyticsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterAnalyticsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AnalyticsServiceClient) error { + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingSummary_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingSummary", runtime.WithHTTPPathPattern("/v1/analytics/spending/summary")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AnalyticsService_GetSpendingSummary_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingSummary_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingTimeSeries_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingTimeSeries", runtime.WithHTTPPathPattern("/v1/analytics/spending/time-series")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AnalyticsService_GetSpendingTimeSeries_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingTimeSeries_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetSpendingBreakdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingBreakdown", runtime.WithHTTPPathPattern("/v1/analytics/spending/breakdown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AnalyticsService_GetSpendingBreakdown_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetSpendingBreakdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AnalyticsService_GetTopSpenders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AnalyticsService/GetTopSpenders", runtime.WithHTTPPathPattern("/v1/analytics/spending/top-spenders")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AnalyticsService_GetTopSpenders_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AnalyticsService_GetTopSpenders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_AnalyticsService_GetSpendingSummary_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "analytics", "spending", "summary"}, "")) + pattern_AnalyticsService_GetSpendingTimeSeries_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "analytics", "spending", "time-series"}, "")) + pattern_AnalyticsService_GetSpendingBreakdown_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "analytics", "spending", "breakdown"}, "")) + pattern_AnalyticsService_GetTopSpenders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "analytics", "spending", "top-spenders"}, "")) +) + +var ( + forward_AnalyticsService_GetSpendingSummary_0 = runtime.ForwardResponseMessage + forward_AnalyticsService_GetSpendingTimeSeries_0 = runtime.ForwardResponseMessage + forward_AnalyticsService_GetSpendingBreakdown_0 = runtime.ForwardResponseMessage + forward_AnalyticsService_GetTopSpenders_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics_grpc.pb.go new file mode 100644 index 0000000000..15c4794d4b --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/analytics_grpc.pb.go @@ -0,0 +1,258 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/analytics.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AnalyticsService_GetSpendingSummary_FullMethodName = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingSummary" + AnalyticsService_GetSpendingTimeSeries_FullMethodName = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingTimeSeries" + AnalyticsService_GetSpendingBreakdown_FullMethodName = "/redpanda.api.aigateway.v1.AnalyticsService/GetSpendingBreakdown" + AnalyticsService_GetTopSpenders_FullMethodName = "/redpanda.api.aigateway.v1.AnalyticsService/GetTopSpenders" +) + +// AnalyticsServiceClient is the client API for AnalyticsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AnalyticsService provides spending analytics and insights across all gateways. +// It aggregates token usage and cost data from the token tracker database. +type AnalyticsServiceClient interface { + // GetSpendingSummary returns high-level spending metrics for the dashboard. + // Includes total cost, requests, tokens, and trends compared to previous period. + GetSpendingSummary(ctx context.Context, in *GetSpendingSummaryRequest, opts ...grpc.CallOption) (*GetSpendingSummaryResponse, error) + // GetSpendingTimeSeries returns spending over time for line charts. + // Automatically selects granularity (hour/day/week) based on time range. + GetSpendingTimeSeries(ctx context.Context, in *GetSpendingTimeSeriesRequest, opts ...grpc.CallOption) (*GetSpendingTimeSeriesResponse, error) + // GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + // Used for pie charts and bar charts showing distribution. + GetSpendingBreakdown(ctx context.Context, in *GetSpendingBreakdownRequest, opts ...grpc.CallOption) (*GetSpendingBreakdownResponse, error) + // GetTopSpenders returns the highest spending entities for a given dimension. + // Used for tables showing top users, teams, organizations, etc. + GetTopSpenders(ctx context.Context, in *GetTopSpendersRequest, opts ...grpc.CallOption) (*GetTopSpendersResponse, error) +} + +type analyticsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAnalyticsServiceClient(cc grpc.ClientConnInterface) AnalyticsServiceClient { + return &analyticsServiceClient{cc} +} + +func (c *analyticsServiceClient) GetSpendingSummary(ctx context.Context, in *GetSpendingSummaryRequest, opts ...grpc.CallOption) (*GetSpendingSummaryResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSpendingSummaryResponse) + err := c.cc.Invoke(ctx, AnalyticsService_GetSpendingSummary_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *analyticsServiceClient) GetSpendingTimeSeries(ctx context.Context, in *GetSpendingTimeSeriesRequest, opts ...grpc.CallOption) (*GetSpendingTimeSeriesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSpendingTimeSeriesResponse) + err := c.cc.Invoke(ctx, AnalyticsService_GetSpendingTimeSeries_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *analyticsServiceClient) GetSpendingBreakdown(ctx context.Context, in *GetSpendingBreakdownRequest, opts ...grpc.CallOption) (*GetSpendingBreakdownResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSpendingBreakdownResponse) + err := c.cc.Invoke(ctx, AnalyticsService_GetSpendingBreakdown_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *analyticsServiceClient) GetTopSpenders(ctx context.Context, in *GetTopSpendersRequest, opts ...grpc.CallOption) (*GetTopSpendersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetTopSpendersResponse) + err := c.cc.Invoke(ctx, AnalyticsService_GetTopSpenders_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AnalyticsServiceServer is the server API for AnalyticsService service. +// All implementations must embed UnimplementedAnalyticsServiceServer +// for forward compatibility. +// +// AnalyticsService provides spending analytics and insights across all gateways. +// It aggregates token usage and cost data from the token tracker database. +type AnalyticsServiceServer interface { + // GetSpendingSummary returns high-level spending metrics for the dashboard. + // Includes total cost, requests, tokens, and trends compared to previous period. + GetSpendingSummary(context.Context, *GetSpendingSummaryRequest) (*GetSpendingSummaryResponse, error) + // GetSpendingTimeSeries returns spending over time for line charts. + // Automatically selects granularity (hour/day/week) based on time range. + GetSpendingTimeSeries(context.Context, *GetSpendingTimeSeriesRequest) (*GetSpendingTimeSeriesResponse, error) + // GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + // Used for pie charts and bar charts showing distribution. + GetSpendingBreakdown(context.Context, *GetSpendingBreakdownRequest) (*GetSpendingBreakdownResponse, error) + // GetTopSpenders returns the highest spending entities for a given dimension. + // Used for tables showing top users, teams, organizations, etc. + GetTopSpenders(context.Context, *GetTopSpendersRequest) (*GetTopSpendersResponse, error) + mustEmbedUnimplementedAnalyticsServiceServer() +} + +// UnimplementedAnalyticsServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAnalyticsServiceServer struct{} + +func (UnimplementedAnalyticsServiceServer) GetSpendingSummary(context.Context, *GetSpendingSummaryRequest) (*GetSpendingSummaryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSpendingSummary not implemented") +} +func (UnimplementedAnalyticsServiceServer) GetSpendingTimeSeries(context.Context, *GetSpendingTimeSeriesRequest) (*GetSpendingTimeSeriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSpendingTimeSeries not implemented") +} +func (UnimplementedAnalyticsServiceServer) GetSpendingBreakdown(context.Context, *GetSpendingBreakdownRequest) (*GetSpendingBreakdownResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSpendingBreakdown not implemented") +} +func (UnimplementedAnalyticsServiceServer) GetTopSpenders(context.Context, *GetTopSpendersRequest) (*GetTopSpendersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTopSpenders not implemented") +} +func (UnimplementedAnalyticsServiceServer) mustEmbedUnimplementedAnalyticsServiceServer() {} +func (UnimplementedAnalyticsServiceServer) testEmbeddedByValue() {} + +// UnsafeAnalyticsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AnalyticsServiceServer will +// result in compilation errors. +type UnsafeAnalyticsServiceServer interface { + mustEmbedUnimplementedAnalyticsServiceServer() +} + +func RegisterAnalyticsServiceServer(s grpc.ServiceRegistrar, srv AnalyticsServiceServer) { + // If the following call pancis, it indicates UnimplementedAnalyticsServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AnalyticsService_ServiceDesc, srv) +} + +func _AnalyticsService_GetSpendingSummary_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSpendingSummaryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AnalyticsServiceServer).GetSpendingSummary(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AnalyticsService_GetSpendingSummary_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AnalyticsServiceServer).GetSpendingSummary(ctx, req.(*GetSpendingSummaryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AnalyticsService_GetSpendingTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSpendingTimeSeriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AnalyticsServiceServer).GetSpendingTimeSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AnalyticsService_GetSpendingTimeSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AnalyticsServiceServer).GetSpendingTimeSeries(ctx, req.(*GetSpendingTimeSeriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AnalyticsService_GetSpendingBreakdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSpendingBreakdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AnalyticsServiceServer).GetSpendingBreakdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AnalyticsService_GetSpendingBreakdown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AnalyticsServiceServer).GetSpendingBreakdown(ctx, req.(*GetSpendingBreakdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AnalyticsService_GetTopSpenders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTopSpendersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AnalyticsServiceServer).GetTopSpenders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AnalyticsService_GetTopSpenders_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AnalyticsServiceServer).GetTopSpenders(ctx, req.(*GetTopSpendersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AnalyticsService_ServiceDesc is the grpc.ServiceDesc for AnalyticsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AnalyticsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.AnalyticsService", + HandlerType: (*AnalyticsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSpendingSummary", + Handler: _AnalyticsService_GetSpendingSummary_Handler, + }, + { + MethodName: "GetSpendingTimeSeries", + Handler: _AnalyticsService_GetSpendingTimeSeries_Handler, + }, + { + MethodName: "GetSpendingBreakdown", + Handler: _AnalyticsService_GetSpendingBreakdown_Handler, + }, + { + MethodName: "GetTopSpenders", + Handler: _AnalyticsService_GetTopSpenders_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/analytics.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.go new file mode 100644 index 0000000000..834e1a5db5 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.go @@ -0,0 +1,1287 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/audit.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// OCSF Activity types for Entity Management (class 3004) +type AuditActivityType int32 + +const ( + AuditActivityType_AUDIT_ACTIVITY_TYPE_UNSPECIFIED AuditActivityType = 0 + AuditActivityType_AUDIT_ACTIVITY_TYPE_CREATE AuditActivityType = 1 // Resource was created + AuditActivityType_AUDIT_ACTIVITY_TYPE_READ AuditActivityType = 2 // Resource was read/accessed + AuditActivityType_AUDIT_ACTIVITY_TYPE_UPDATE AuditActivityType = 3 // Resource was modified + AuditActivityType_AUDIT_ACTIVITY_TYPE_DELETE AuditActivityType = 4 // Resource was deleted + AuditActivityType_AUDIT_ACTIVITY_TYPE_ENABLE AuditActivityType = 8 // Resource was enabled + AuditActivityType_AUDIT_ACTIVITY_TYPE_DISABLE AuditActivityType = 9 // Resource was disabled +) + +// Enum value maps for AuditActivityType. +var ( + AuditActivityType_name = map[int32]string{ + 0: "AUDIT_ACTIVITY_TYPE_UNSPECIFIED", + 1: "AUDIT_ACTIVITY_TYPE_CREATE", + 2: "AUDIT_ACTIVITY_TYPE_READ", + 3: "AUDIT_ACTIVITY_TYPE_UPDATE", + 4: "AUDIT_ACTIVITY_TYPE_DELETE", + 8: "AUDIT_ACTIVITY_TYPE_ENABLE", + 9: "AUDIT_ACTIVITY_TYPE_DISABLE", + } + AuditActivityType_value = map[string]int32{ + "AUDIT_ACTIVITY_TYPE_UNSPECIFIED": 0, + "AUDIT_ACTIVITY_TYPE_CREATE": 1, + "AUDIT_ACTIVITY_TYPE_READ": 2, + "AUDIT_ACTIVITY_TYPE_UPDATE": 3, + "AUDIT_ACTIVITY_TYPE_DELETE": 4, + "AUDIT_ACTIVITY_TYPE_ENABLE": 8, + "AUDIT_ACTIVITY_TYPE_DISABLE": 9, + } +) + +func (x AuditActivityType) Enum() *AuditActivityType { + p := new(AuditActivityType) + *p = x + return p +} + +func (x AuditActivityType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuditActivityType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_audit_proto_enumTypes[0].Descriptor() +} + +func (AuditActivityType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_audit_proto_enumTypes[0] +} + +func (x AuditActivityType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuditActivityType.Descriptor instead. +func (AuditActivityType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{0} +} + +// OCSF Severity levels +type AuditSeverity int32 + +const ( + AuditSeverity_AUDIT_SEVERITY_UNSPECIFIED AuditSeverity = 0 + AuditSeverity_AUDIT_SEVERITY_INFORMATIONAL AuditSeverity = 1 + AuditSeverity_AUDIT_SEVERITY_LOW AuditSeverity = 2 + AuditSeverity_AUDIT_SEVERITY_MEDIUM AuditSeverity = 3 + AuditSeverity_AUDIT_SEVERITY_HIGH AuditSeverity = 4 + AuditSeverity_AUDIT_SEVERITY_CRITICAL AuditSeverity = 5 + AuditSeverity_AUDIT_SEVERITY_FATAL AuditSeverity = 6 +) + +// Enum value maps for AuditSeverity. +var ( + AuditSeverity_name = map[int32]string{ + 0: "AUDIT_SEVERITY_UNSPECIFIED", + 1: "AUDIT_SEVERITY_INFORMATIONAL", + 2: "AUDIT_SEVERITY_LOW", + 3: "AUDIT_SEVERITY_MEDIUM", + 4: "AUDIT_SEVERITY_HIGH", + 5: "AUDIT_SEVERITY_CRITICAL", + 6: "AUDIT_SEVERITY_FATAL", + } + AuditSeverity_value = map[string]int32{ + "AUDIT_SEVERITY_UNSPECIFIED": 0, + "AUDIT_SEVERITY_INFORMATIONAL": 1, + "AUDIT_SEVERITY_LOW": 2, + "AUDIT_SEVERITY_MEDIUM": 3, + "AUDIT_SEVERITY_HIGH": 4, + "AUDIT_SEVERITY_CRITICAL": 5, + "AUDIT_SEVERITY_FATAL": 6, + } +) + +func (x AuditSeverity) Enum() *AuditSeverity { + p := new(AuditSeverity) + *p = x + return p +} + +func (x AuditSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuditSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_audit_proto_enumTypes[1].Descriptor() +} + +func (AuditSeverity) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_audit_proto_enumTypes[1] +} + +func (x AuditSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuditSeverity.Descriptor instead. +func (AuditSeverity) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{1} +} + +// OCSF Status values +type AuditStatus int32 + +const ( + AuditStatus_AUDIT_STATUS_UNSPECIFIED AuditStatus = 0 + AuditStatus_AUDIT_STATUS_SUCCESS AuditStatus = 1 + AuditStatus_AUDIT_STATUS_FAILURE AuditStatus = 2 +) + +// Enum value maps for AuditStatus. +var ( + AuditStatus_name = map[int32]string{ + 0: "AUDIT_STATUS_UNSPECIFIED", + 1: "AUDIT_STATUS_SUCCESS", + 2: "AUDIT_STATUS_FAILURE", + } + AuditStatus_value = map[string]int32{ + "AUDIT_STATUS_UNSPECIFIED": 0, + "AUDIT_STATUS_SUCCESS": 1, + "AUDIT_STATUS_FAILURE": 2, + } +) + +func (x AuditStatus) Enum() *AuditStatus { + p := new(AuditStatus) + *p = x + return p +} + +func (x AuditStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuditStatus) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_audit_proto_enumTypes[2].Descriptor() +} + +func (AuditStatus) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_audit_proto_enumTypes[2] +} + +func (x AuditStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuditStatus.Descriptor instead. +func (AuditStatus) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{2} +} + +// AuditLog represents an OCSF Entity Management event (class 3004). +// https://schema.ocsf.io/1.0.0/classes/entity_management +type AuditLog struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Unique identifier for this audit log entry. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // OCSF Base Event fields + ClassUid int32 `protobuf:"varint,2,opt,name=class_uid,json=classUid,proto3" json:"class_uid,omitempty"` // 3004 = Entity Management + CategoryUid int32 `protobuf:"varint,3,opt,name=category_uid,json=categoryUid,proto3" json:"category_uid,omitempty"` // 3 = Identity & Access Management + ActivityId AuditActivityType `protobuf:"varint,4,opt,name=activity_id,json=activityId,proto3,enum=redpanda.api.aigateway.v1.AuditActivityType" json:"activity_id,omitempty"` + TypeUid int64 `protobuf:"varint,5,opt,name=type_uid,json=typeUid,proto3" json:"type_uid,omitempty"` // class_uid * 100 + activity_id + Activity string `protobuf:"bytes,6,opt,name=activity,proto3" json:"activity,omitempty"` // Human-readable: "Create", "Update", "Delete" + // Temporal + Time *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=time,proto3" json:"time,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + // Severity & Status + SeverityId AuditSeverity `protobuf:"varint,20,opt,name=severity_id,json=severityId,proto3,enum=redpanda.api.aigateway.v1.AuditSeverity" json:"severity_id,omitempty"` + Severity string `protobuf:"bytes,21,opt,name=severity,proto3" json:"severity,omitempty"` // "Informational", "Low", etc. + StatusId AuditStatus `protobuf:"varint,22,opt,name=status_id,json=statusId,proto3,enum=redpanda.api.aigateway.v1.AuditStatus" json:"status_id,omitempty"` + Status string `protobuf:"bytes,23,opt,name=status,proto3" json:"status,omitempty"` // "Success", "Failure" + StatusDetail string `protobuf:"bytes,24,opt,name=status_detail,json=statusDetail,proto3" json:"status_detail,omitempty"` // Error message if failed + // Actor (who performed the action) + Actor *AuditActor `protobuf:"bytes,30,opt,name=actor,proto3" json:"actor,omitempty"` + // Entity (resource being managed) + Entity *AuditEntity `protobuf:"bytes,40,opt,name=entity,proto3" json:"entity,omitempty"` + EntityResult *AuditEntity `protobuf:"bytes,41,opt,name=entity_result,json=entityResult,proto3" json:"entity_result,omitempty"` // State after change + // Field-level changes (stored in OCSF unmapped field) + Unmapped []*FieldChange `protobuf:"bytes,50,rep,name=unmapped,proto3" json:"unmapped,omitempty"` + // Context + Message string `protobuf:"bytes,60,opt,name=message,proto3" json:"message,omitempty"` // Human-readable event description + Comment string `protobuf:"bytes,61,opt,name=comment,proto3" json:"comment,omitempty"` // User-provided rationale + GatewayId string `protobuf:"bytes,62,opt,name=gateway_id,json=gatewayId,proto3" json:"gateway_id,omitempty"` // Parent gateway ID for scoping + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditLog) Reset() { + *x = AuditLog{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditLog) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditLog) ProtoMessage() {} + +func (x *AuditLog) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditLog.ProtoReflect.Descriptor instead. +func (*AuditLog) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{0} +} + +func (x *AuditLog) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AuditLog) GetClassUid() int32 { + if x != nil { + return x.ClassUid + } + return 0 +} + +func (x *AuditLog) GetCategoryUid() int32 { + if x != nil { + return x.CategoryUid + } + return 0 +} + +func (x *AuditLog) GetActivityId() AuditActivityType { + if x != nil { + return x.ActivityId + } + return AuditActivityType_AUDIT_ACTIVITY_TYPE_UNSPECIFIED +} + +func (x *AuditLog) GetTypeUid() int64 { + if x != nil { + return x.TypeUid + } + return 0 +} + +func (x *AuditLog) GetActivity() string { + if x != nil { + return x.Activity + } + return "" +} + +func (x *AuditLog) GetTime() *timestamppb.Timestamp { + if x != nil { + return x.Time + } + return nil +} + +func (x *AuditLog) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *AuditLog) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *AuditLog) GetSeverityId() AuditSeverity { + if x != nil { + return x.SeverityId + } + return AuditSeverity_AUDIT_SEVERITY_UNSPECIFIED +} + +func (x *AuditLog) GetSeverity() string { + if x != nil { + return x.Severity + } + return "" +} + +func (x *AuditLog) GetStatusId() AuditStatus { + if x != nil { + return x.StatusId + } + return AuditStatus_AUDIT_STATUS_UNSPECIFIED +} + +func (x *AuditLog) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *AuditLog) GetStatusDetail() string { + if x != nil { + return x.StatusDetail + } + return "" +} + +func (x *AuditLog) GetActor() *AuditActor { + if x != nil { + return x.Actor + } + return nil +} + +func (x *AuditLog) GetEntity() *AuditEntity { + if x != nil { + return x.Entity + } + return nil +} + +func (x *AuditLog) GetEntityResult() *AuditEntity { + if x != nil { + return x.EntityResult + } + return nil +} + +func (x *AuditLog) GetUnmapped() []*FieldChange { + if x != nil { + return x.Unmapped + } + return nil +} + +func (x *AuditLog) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *AuditLog) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +func (x *AuditLog) GetGatewayId() string { + if x != nil { + return x.GatewayId + } + return "" +} + +// AuditActor represents who performed the action (OCSF Actor object). +type AuditActor struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The user who performed the action + User *AuditUser `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + // Session information + Session *AuditSession `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` + // Application name (e.g., "webui", "api", "cli") + AppName string `protobuf:"bytes,3,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditActor) Reset() { + *x = AuditActor{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditActor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditActor) ProtoMessage() {} + +func (x *AuditActor) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditActor.ProtoReflect.Descriptor instead. +func (*AuditActor) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{1} +} + +func (x *AuditActor) GetUser() *AuditUser { + if x != nil { + return x.User + } + return nil +} + +func (x *AuditActor) GetSession() *AuditSession { + if x != nil { + return x.Session + } + return nil +} + +func (x *AuditActor) GetAppName() string { + if x != nil { + return x.AppName + } + return "" +} + +// AuditUser represents the authenticated user info in audit context. +type AuditUser struct { + state protoimpl.MessageState `protogen:"open.v1"` + // User unique identifier + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + // User email address + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // User display name + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditUser) Reset() { + *x = AuditUser{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditUser) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditUser) ProtoMessage() {} + +func (x *AuditUser) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditUser.ProtoReflect.Descriptor instead. +func (*AuditUser) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{2} +} + +func (x *AuditUser) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *AuditUser) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *AuditUser) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// AuditSession represents the session context (OCSF Session object). +type AuditSession struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Session unique identifier + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditSession) Reset() { + *x = AuditSession{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditSession) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditSession) ProtoMessage() {} + +func (x *AuditSession) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditSession.ProtoReflect.Descriptor instead. +func (*AuditSession) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{3} +} + +func (x *AuditSession) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +// AuditEntity represents the managed resource (OCSF Managed Entity object). +type AuditEntity struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource unique identifier + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + // Full resource name path (e.g., "gateways/xxx/backendPools/yyy") + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Resource type (e.g., "gateway", "backend_pool", "routing_rule") + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + // Resource data/state as a JSON structure + Data *structpb.Struct `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditEntity) Reset() { + *x = AuditEntity{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditEntity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditEntity) ProtoMessage() {} + +func (x *AuditEntity) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditEntity.ProtoReflect.Descriptor instead. +func (*AuditEntity) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{4} +} + +func (x *AuditEntity) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *AuditEntity) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AuditEntity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *AuditEntity) GetData() *structpb.Struct { + if x != nil { + return x.Data + } + return nil +} + +// FieldChange represents a single field that was changed. +type FieldChange struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The name of the field that changed. + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + // The old value (before the change). + OldValue *structpb.Value `protobuf:"bytes,2,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + // The new value (after the change). + NewValue *structpb.Value `protobuf:"bytes,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FieldChange) Reset() { + *x = FieldChange{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FieldChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FieldChange) ProtoMessage() {} + +func (x *FieldChange) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FieldChange.ProtoReflect.Descriptor instead. +func (*FieldChange) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{5} +} + +func (x *FieldChange) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *FieldChange) GetOldValue() *structpb.Value { + if x != nil { + return x.OldValue + } + return nil +} + +func (x *FieldChange) GetNewValue() *structpb.Value { + if x != nil { + return x.NewValue + } + return nil +} + +// ListAuditLogsRequest is the request for ListAuditLogs. +type ListAuditLogsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. The gateway to list audit logs for. + // Format: gateways/{gateway_id} + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Optional. Filter by entity type (e.g., "backend_pool", "routing_rule"). + EntityType string `protobuf:"bytes,2,opt,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"` + // Optional. Filter by activity type. + ActivityId AuditActivityType `protobuf:"varint,3,opt,name=activity_id,json=activityId,proto3,enum=redpanda.api.aigateway.v1.AuditActivityType" json:"activity_id,omitempty"` + // Optional. Filter by actor (user ID). + ActorId string `protobuf:"bytes,4,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + // Optional. Only return logs since this timestamp. + Since *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=since,proto3" json:"since,omitempty"` + // Maximum number of results to return. Default: 50, Max: 200. + PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token for pagination. + PageToken string `protobuf:"bytes,7,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAuditLogsRequest) Reset() { + *x = ListAuditLogsRequest{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAuditLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAuditLogsRequest) ProtoMessage() {} + +func (x *ListAuditLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAuditLogsRequest.ProtoReflect.Descriptor instead. +func (*ListAuditLogsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{6} +} + +func (x *ListAuditLogsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListAuditLogsRequest) GetEntityType() string { + if x != nil { + return x.EntityType + } + return "" +} + +func (x *ListAuditLogsRequest) GetActivityId() AuditActivityType { + if x != nil { + return x.ActivityId + } + return AuditActivityType_AUDIT_ACTIVITY_TYPE_UNSPECIFIED +} + +func (x *ListAuditLogsRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *ListAuditLogsRequest) GetSince() *timestamppb.Timestamp { + if x != nil { + return x.Since + } + return nil +} + +func (x *ListAuditLogsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListAuditLogsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListAuditLogsResponse is the response for ListAuditLogs. +type ListAuditLogsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The audit log entries. + AuditLogs []*AuditLog `protobuf:"bytes,1,rep,name=audit_logs,json=auditLogs,proto3" json:"audit_logs,omitempty"` + // Token to retrieve the next page. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total number of audit logs matching the filter. + TotalCount int32 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAuditLogsResponse) Reset() { + *x = ListAuditLogsResponse{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAuditLogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAuditLogsResponse) ProtoMessage() {} + +func (x *ListAuditLogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAuditLogsResponse.ProtoReflect.Descriptor instead. +func (*ListAuditLogsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{7} +} + +func (x *ListAuditLogsResponse) GetAuditLogs() []*AuditLog { + if x != nil { + return x.AuditLogs + } + return nil +} + +func (x *ListAuditLogsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListAuditLogsResponse) GetTotalCount() int32 { + if x != nil { + return x.TotalCount + } + return 0 +} + +// GetAuditLogRequest is the request for GetAuditLog. +type GetAuditLogRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. The audit log entry to retrieve. + // Format: auditLogs/{audit_log_id} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAuditLogRequest) Reset() { + *x = GetAuditLogRequest{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAuditLogRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAuditLogRequest) ProtoMessage() {} + +func (x *GetAuditLogRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAuditLogRequest.ProtoReflect.Descriptor instead. +func (*GetAuditLogRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{8} +} + +func (x *GetAuditLogRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// GetAuditLogResponse is the response for GetAuditLog. +type GetAuditLogResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The audit log entry. + AuditLog *AuditLog `protobuf:"bytes,1,opt,name=audit_log,json=auditLog,proto3" json:"audit_log,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAuditLogResponse) Reset() { + *x = GetAuditLogResponse{} + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAuditLogResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAuditLogResponse) ProtoMessage() {} + +func (x *GetAuditLogResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_audit_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAuditLogResponse.ProtoReflect.Descriptor instead. +func (*GetAuditLogResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP(), []int{9} +} + +func (x *GetAuditLogResponse) GetAuditLog() *AuditLog { + if x != nil { + return x.AuditLog + } + return nil +} + +var File_redpanda_api_aigateway_v1_audit_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_audit_proto_rawDesc = []byte{ + 0x0a, 0x25, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, + 0x07, 0x0a, 0x08, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x55, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x55, 0x69, 0x64, 0x12, 0x4d, 0x0a, 0x0b, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x79, + 0x70, 0x65, 0x55, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, + 0x74, 0x79, 0x52, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x09, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x3b, 0x0a, 0x05, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x41, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x06, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x0d, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x08, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x08, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x22, 0xa4, 0x01, + 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x09, 0x41, 0x75, 0x64, 0x69, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x0a, + 0x0c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, + 0x74, 0x0a, 0x0b, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6f, + 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x33, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbc, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x4d, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x0a, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xc8, 0x01, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa4, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0a, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x61, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x57, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x6c, + 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x2a, 0xf7, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x1f, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, + 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, + 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, + 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x08, + 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x09, 0x2a, 0xd4, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x65, 0x76, 0x65, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, + 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x19, 0x0a, + 0x15, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, + 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x55, 0x44, 0x49, + 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, + 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, + 0x49, 0x54, 0x59, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x18, + 0x0a, 0x14, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x06, 0x2a, 0x5f, 0x0a, 0x0b, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x55, 0x44, 0x49, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, + 0x18, 0x0a, 0x14, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x02, 0x32, 0xf0, 0x01, 0x0a, 0x0c, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0d, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x2d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xff, 0x01, 0x0a, + 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0a, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, + 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, + 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_audit_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_audit_proto_rawDescData = file_redpanda_api_aigateway_v1_audit_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_audit_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_audit_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_audit_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_audit_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_audit_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_audit_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_redpanda_api_aigateway_v1_audit_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_redpanda_api_aigateway_v1_audit_proto_goTypes = []any{ + (AuditActivityType)(0), // 0: redpanda.api.aigateway.v1.AuditActivityType + (AuditSeverity)(0), // 1: redpanda.api.aigateway.v1.AuditSeverity + (AuditStatus)(0), // 2: redpanda.api.aigateway.v1.AuditStatus + (*AuditLog)(nil), // 3: redpanda.api.aigateway.v1.AuditLog + (*AuditActor)(nil), // 4: redpanda.api.aigateway.v1.AuditActor + (*AuditUser)(nil), // 5: redpanda.api.aigateway.v1.AuditUser + (*AuditSession)(nil), // 6: redpanda.api.aigateway.v1.AuditSession + (*AuditEntity)(nil), // 7: redpanda.api.aigateway.v1.AuditEntity + (*FieldChange)(nil), // 8: redpanda.api.aigateway.v1.FieldChange + (*ListAuditLogsRequest)(nil), // 9: redpanda.api.aigateway.v1.ListAuditLogsRequest + (*ListAuditLogsResponse)(nil), // 10: redpanda.api.aigateway.v1.ListAuditLogsResponse + (*GetAuditLogRequest)(nil), // 11: redpanda.api.aigateway.v1.GetAuditLogRequest + (*GetAuditLogResponse)(nil), // 12: redpanda.api.aigateway.v1.GetAuditLogResponse + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 14: google.protobuf.Struct + (*structpb.Value)(nil), // 15: google.protobuf.Value +} +var file_redpanda_api_aigateway_v1_audit_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.AuditLog.activity_id:type_name -> redpanda.api.aigateway.v1.AuditActivityType + 13, // 1: redpanda.api.aigateway.v1.AuditLog.time:type_name -> google.protobuf.Timestamp + 13, // 2: redpanda.api.aigateway.v1.AuditLog.start_time:type_name -> google.protobuf.Timestamp + 13, // 3: redpanda.api.aigateway.v1.AuditLog.end_time:type_name -> google.protobuf.Timestamp + 1, // 4: redpanda.api.aigateway.v1.AuditLog.severity_id:type_name -> redpanda.api.aigateway.v1.AuditSeverity + 2, // 5: redpanda.api.aigateway.v1.AuditLog.status_id:type_name -> redpanda.api.aigateway.v1.AuditStatus + 4, // 6: redpanda.api.aigateway.v1.AuditLog.actor:type_name -> redpanda.api.aigateway.v1.AuditActor + 7, // 7: redpanda.api.aigateway.v1.AuditLog.entity:type_name -> redpanda.api.aigateway.v1.AuditEntity + 7, // 8: redpanda.api.aigateway.v1.AuditLog.entity_result:type_name -> redpanda.api.aigateway.v1.AuditEntity + 8, // 9: redpanda.api.aigateway.v1.AuditLog.unmapped:type_name -> redpanda.api.aigateway.v1.FieldChange + 5, // 10: redpanda.api.aigateway.v1.AuditActor.user:type_name -> redpanda.api.aigateway.v1.AuditUser + 6, // 11: redpanda.api.aigateway.v1.AuditActor.session:type_name -> redpanda.api.aigateway.v1.AuditSession + 14, // 12: redpanda.api.aigateway.v1.AuditEntity.data:type_name -> google.protobuf.Struct + 15, // 13: redpanda.api.aigateway.v1.FieldChange.old_value:type_name -> google.protobuf.Value + 15, // 14: redpanda.api.aigateway.v1.FieldChange.new_value:type_name -> google.protobuf.Value + 0, // 15: redpanda.api.aigateway.v1.ListAuditLogsRequest.activity_id:type_name -> redpanda.api.aigateway.v1.AuditActivityType + 13, // 16: redpanda.api.aigateway.v1.ListAuditLogsRequest.since:type_name -> google.protobuf.Timestamp + 3, // 17: redpanda.api.aigateway.v1.ListAuditLogsResponse.audit_logs:type_name -> redpanda.api.aigateway.v1.AuditLog + 3, // 18: redpanda.api.aigateway.v1.GetAuditLogResponse.audit_log:type_name -> redpanda.api.aigateway.v1.AuditLog + 9, // 19: redpanda.api.aigateway.v1.AuditService.ListAuditLogs:input_type -> redpanda.api.aigateway.v1.ListAuditLogsRequest + 11, // 20: redpanda.api.aigateway.v1.AuditService.GetAuditLog:input_type -> redpanda.api.aigateway.v1.GetAuditLogRequest + 10, // 21: redpanda.api.aigateway.v1.AuditService.ListAuditLogs:output_type -> redpanda.api.aigateway.v1.ListAuditLogsResponse + 12, // 22: redpanda.api.aigateway.v1.AuditService.GetAuditLog:output_type -> redpanda.api.aigateway.v1.GetAuditLogResponse + 21, // [21:23] is the sub-list for method output_type + 19, // [19:21] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_audit_proto_init() } +func file_redpanda_api_aigateway_v1_audit_proto_init() { + if File_redpanda_api_aigateway_v1_audit_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_audit_proto_rawDesc, + NumEnums: 3, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_audit_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_audit_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_audit_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_audit_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_audit_proto = out.File + file_redpanda_api_aigateway_v1_audit_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_audit_proto_goTypes = nil + file_redpanda_api_aigateway_v1_audit_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.gw.go new file mode 100644 index 0000000000..bd5fdfad95 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit.pb.gw.go @@ -0,0 +1,223 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/audit.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_AuditService_ListAuditLogs_0(ctx context.Context, marshaler runtime.Marshaler, client AuditServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListAuditLogsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.ListAuditLogs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuditService_ListAuditLogs_0(ctx context.Context, marshaler runtime.Marshaler, server AuditServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListAuditLogsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListAuditLogs(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuditService_GetAuditLog_0(ctx context.Context, marshaler runtime.Marshaler, client AuditServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAuditLogRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetAuditLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuditService_GetAuditLog_0(ctx context.Context, marshaler runtime.Marshaler, server AuditServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAuditLogRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetAuditLog(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterAuditServiceHandlerServer registers the http handlers for service AuditService to "mux". +// UnaryRPC :call AuditServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuditServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterAuditServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuditServiceServer) error { + mux.Handle(http.MethodPost, pattern_AuditService_ListAuditLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuditService/ListAuditLogs", runtime.WithHTTPPathPattern("/redpanda.api.aigateway.v1.AuditService/ListAuditLogs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuditService_ListAuditLogs_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuditService_ListAuditLogs_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuditService_GetAuditLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuditService/GetAuditLog", runtime.WithHTTPPathPattern("/redpanda.api.aigateway.v1.AuditService/GetAuditLog")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuditService_GetAuditLog_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuditService_GetAuditLog_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterAuditServiceHandlerFromEndpoint is same as RegisterAuditServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAuditServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterAuditServiceHandler(ctx, mux, conn) +} + +// RegisterAuditServiceHandler registers the http handlers for service AuditService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAuditServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAuditServiceHandlerClient(ctx, mux, NewAuditServiceClient(conn)) +} + +// RegisterAuditServiceHandlerClient registers the http handlers for service AuditService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuditServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuditServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AuditServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterAuditServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuditServiceClient) error { + mux.Handle(http.MethodPost, pattern_AuditService_ListAuditLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuditService/ListAuditLogs", runtime.WithHTTPPathPattern("/redpanda.api.aigateway.v1.AuditService/ListAuditLogs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuditService_ListAuditLogs_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuditService_ListAuditLogs_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuditService_GetAuditLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuditService/GetAuditLog", runtime.WithHTTPPathPattern("/redpanda.api.aigateway.v1.AuditService/GetAuditLog")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuditService_GetAuditLog_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuditService_GetAuditLog_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_AuditService_ListAuditLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"redpanda.api.aigateway.v1.AuditService", "ListAuditLogs"}, "")) + pattern_AuditService_GetAuditLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"redpanda.api.aigateway.v1.AuditService", "GetAuditLog"}, "")) +) + +var ( + forward_AuditService_ListAuditLogs_0 = runtime.ForwardResponseMessage + forward_AuditService_GetAuditLog_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/audit_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit_grpc.pb.go new file mode 100644 index 0000000000..0431c2d16a --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/audit_grpc.pb.go @@ -0,0 +1,170 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/audit.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AuditService_ListAuditLogs_FullMethodName = "/redpanda.api.aigateway.v1.AuditService/ListAuditLogs" + AuditService_GetAuditLog_FullMethodName = "/redpanda.api.aigateway.v1.AuditService/GetAuditLog" +) + +// AuditServiceClient is the client API for AuditService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AuditService provides access to the OCSF-compliant audit log for tracking resource changes. +// Implements the Entity Management event class (3004) from the Open Cybersecurity Schema Framework. +type AuditServiceClient interface { + // ListAuditLogs returns audit log entries for a gateway. + ListAuditLogs(ctx context.Context, in *ListAuditLogsRequest, opts ...grpc.CallOption) (*ListAuditLogsResponse, error) + // GetAuditLog returns a single audit log entry. + GetAuditLog(ctx context.Context, in *GetAuditLogRequest, opts ...grpc.CallOption) (*GetAuditLogResponse, error) +} + +type auditServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAuditServiceClient(cc grpc.ClientConnInterface) AuditServiceClient { + return &auditServiceClient{cc} +} + +func (c *auditServiceClient) ListAuditLogs(ctx context.Context, in *ListAuditLogsRequest, opts ...grpc.CallOption) (*ListAuditLogsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListAuditLogsResponse) + err := c.cc.Invoke(ctx, AuditService_ListAuditLogs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *auditServiceClient) GetAuditLog(ctx context.Context, in *GetAuditLogRequest, opts ...grpc.CallOption) (*GetAuditLogResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAuditLogResponse) + err := c.cc.Invoke(ctx, AuditService_GetAuditLog_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuditServiceServer is the server API for AuditService service. +// All implementations must embed UnimplementedAuditServiceServer +// for forward compatibility. +// +// AuditService provides access to the OCSF-compliant audit log for tracking resource changes. +// Implements the Entity Management event class (3004) from the Open Cybersecurity Schema Framework. +type AuditServiceServer interface { + // ListAuditLogs returns audit log entries for a gateway. + ListAuditLogs(context.Context, *ListAuditLogsRequest) (*ListAuditLogsResponse, error) + // GetAuditLog returns a single audit log entry. + GetAuditLog(context.Context, *GetAuditLogRequest) (*GetAuditLogResponse, error) + mustEmbedUnimplementedAuditServiceServer() +} + +// UnimplementedAuditServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAuditServiceServer struct{} + +func (UnimplementedAuditServiceServer) ListAuditLogs(context.Context, *ListAuditLogsRequest) (*ListAuditLogsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListAuditLogs not implemented") +} +func (UnimplementedAuditServiceServer) GetAuditLog(context.Context, *GetAuditLogRequest) (*GetAuditLogResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAuditLog not implemented") +} +func (UnimplementedAuditServiceServer) mustEmbedUnimplementedAuditServiceServer() {} +func (UnimplementedAuditServiceServer) testEmbeddedByValue() {} + +// UnsafeAuditServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuditServiceServer will +// result in compilation errors. +type UnsafeAuditServiceServer interface { + mustEmbedUnimplementedAuditServiceServer() +} + +func RegisterAuditServiceServer(s grpc.ServiceRegistrar, srv AuditServiceServer) { + // If the following call pancis, it indicates UnimplementedAuditServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AuditService_ServiceDesc, srv) +} + +func _AuditService_ListAuditLogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAuditLogsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuditServiceServer).ListAuditLogs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuditService_ListAuditLogs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuditServiceServer).ListAuditLogs(ctx, req.(*ListAuditLogsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuditService_GetAuditLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAuditLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuditServiceServer).GetAuditLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuditService_GetAuditLog_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuditServiceServer).GetAuditLog(ctx, req.(*GetAuditLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AuditService_ServiceDesc is the grpc.ServiceDesc for AuditService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuditService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.AuditService", + HandlerType: (*AuditServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListAuditLogs", + Handler: _AuditService_ListAuditLogs_Handler, + }, + { + MethodName: "GetAuditLog", + Handler: _AuditService_GetAuditLog_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/audit.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.go new file mode 100644 index 0000000000..950a914d5b --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.go @@ -0,0 +1,2162 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/auth.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Request message for Register RPC. +type RegisterRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Email address (must be unique). + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` + // Required: Password (min 8 characters). + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + // Required: Display name. + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional: Organization name for the personal org. + // If empty, uses "{display_name}'s Organization". + OrganizationName string `protobuf:"bytes,4,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RegisterRequest) Reset() { + *x = RegisterRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RegisterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterRequest) ProtoMessage() {} + +func (x *RegisterRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead. +func (*RegisterRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *RegisterRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *RegisterRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *RegisterRequest) GetOrganizationName() string { + if x != nil { + return x.OrganizationName + } + return "" +} + +// Response message for Register RPC. +type RegisterResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The created user's ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // The created organization's ID. + OrganizationId string `protobuf:"bytes,2,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + // Message about email verification. + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RegisterResponse) Reset() { + *x = RegisterResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RegisterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterResponse) ProtoMessage() {} + +func (x *RegisterResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead. +func (*RegisterResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{1} +} + +func (x *RegisterResponse) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *RegisterResponse) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *RegisterResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for Login RPC. +type LoginRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Email address. + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` + // Required: Password. + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoginRequest) Reset() { + *x = LoginRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginRequest) ProtoMessage() {} + +func (x *LoginRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. +func (*LoginRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{2} +} + +func (x *LoginRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *LoginRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +// Response message for Login RPC. +type LoginResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // JWT access token (also set as cookie). + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // Token type (always "Bearer"). + TokenType string `protobuf:"bytes,2,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` + // Seconds until access token expires. + ExpiresIn int64 `protobuf:"varint,3,opt,name=expires_in,json=expiresIn,proto3" json:"expires_in,omitempty"` + // User information. + User *AuthUser `protobuf:"bytes,4,opt,name=user,proto3" json:"user,omitempty"` + // If true, user must change password before continuing. + ForcePasswordChange bool `protobuf:"varint,5,opt,name=force_password_change,json=forcePasswordChange,proto3" json:"force_password_change,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoginResponse) Reset() { + *x = LoginResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginResponse) ProtoMessage() {} + +func (x *LoginResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead. +func (*LoginResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{3} +} + +func (x *LoginResponse) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +func (x *LoginResponse) GetTokenType() string { + if x != nil { + return x.TokenType + } + return "" +} + +func (x *LoginResponse) GetExpiresIn() int64 { + if x != nil { + return x.ExpiresIn + } + return 0 +} + +func (x *LoginResponse) GetUser() *AuthUser { + if x != nil { + return x.User + } + return nil +} + +func (x *LoginResponse) GetForcePasswordChange() bool { + if x != nil { + return x.ForcePasswordChange + } + return false +} + +// Request message for Logout RPC. +type LogoutRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LogoutRequest) Reset() { + *x = LogoutRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LogoutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogoutRequest) ProtoMessage() {} + +func (x *LogoutRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogoutRequest.ProtoReflect.Descriptor instead. +func (*LogoutRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{4} +} + +// Response message for Logout RPC. +type LogoutResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LogoutResponse) Reset() { + *x = LogoutResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LogoutResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogoutResponse) ProtoMessage() {} + +func (x *LogoutResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogoutResponse.ProtoReflect.Descriptor instead. +func (*LogoutResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{5} +} + +// Request message for RefreshToken RPC. +type RefreshTokenRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RefreshTokenRequest) Reset() { + *x = RefreshTokenRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RefreshTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RefreshTokenRequest) ProtoMessage() {} + +func (x *RefreshTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RefreshTokenRequest.ProtoReflect.Descriptor instead. +func (*RefreshTokenRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{6} +} + +// Response message for RefreshToken RPC. +type RefreshTokenResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // New JWT access token. + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // Token type (always "Bearer"). + TokenType string `protobuf:"bytes,2,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` + // Seconds until access token expires. + ExpiresIn int64 `protobuf:"varint,3,opt,name=expires_in,json=expiresIn,proto3" json:"expires_in,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RefreshTokenResponse) Reset() { + *x = RefreshTokenResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RefreshTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RefreshTokenResponse) ProtoMessage() {} + +func (x *RefreshTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RefreshTokenResponse.ProtoReflect.Descriptor instead. +func (*RefreshTokenResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{7} +} + +func (x *RefreshTokenResponse) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +func (x *RefreshTokenResponse) GetTokenType() string { + if x != nil { + return x.TokenType + } + return "" +} + +func (x *RefreshTokenResponse) GetExpiresIn() int64 { + if x != nil { + return x.ExpiresIn + } + return 0 +} + +// Request message for RequestPasswordReset RPC. +type RequestPasswordResetRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Email address to send reset link to. + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RequestPasswordResetRequest) Reset() { + *x = RequestPasswordResetRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestPasswordResetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestPasswordResetRequest) ProtoMessage() {} + +func (x *RequestPasswordResetRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestPasswordResetRequest.ProtoReflect.Descriptor instead. +func (*RequestPasswordResetRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{8} +} + +func (x *RequestPasswordResetRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +// Response message for RequestPasswordReset RPC. +// Always returns success to prevent email enumeration. +type RequestPasswordResetResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RequestPasswordResetResponse) Reset() { + *x = RequestPasswordResetResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestPasswordResetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestPasswordResetResponse) ProtoMessage() {} + +func (x *RequestPasswordResetResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestPasswordResetResponse.ProtoReflect.Descriptor instead. +func (*RequestPasswordResetResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{9} +} + +func (x *RequestPasswordResetResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for ResetPassword RPC. +type ResetPasswordRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Password reset token from email link. + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + // Required: New password (min 8 characters). + NewPassword string `protobuf:"bytes,2,opt,name=new_password,json=newPassword,proto3" json:"new_password,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResetPasswordRequest) Reset() { + *x = ResetPasswordRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResetPasswordRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetPasswordRequest) ProtoMessage() {} + +func (x *ResetPasswordRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResetPasswordRequest.ProtoReflect.Descriptor instead. +func (*ResetPasswordRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{10} +} + +func (x *ResetPasswordRequest) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *ResetPasswordRequest) GetNewPassword() string { + if x != nil { + return x.NewPassword + } + return "" +} + +// Response message for ResetPassword RPC. +type ResetPasswordResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResetPasswordResponse) Reset() { + *x = ResetPasswordResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResetPasswordResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetPasswordResponse) ProtoMessage() {} + +func (x *ResetPasswordResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResetPasswordResponse.ProtoReflect.Descriptor instead. +func (*ResetPasswordResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{11} +} + +func (x *ResetPasswordResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for ChangePassword RPC. +type ChangePasswordRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Current password for verification. + CurrentPassword string `protobuf:"bytes,1,opt,name=current_password,json=currentPassword,proto3" json:"current_password,omitempty"` + // Required: New password (min 8 characters). + NewPassword string `protobuf:"bytes,2,opt,name=new_password,json=newPassword,proto3" json:"new_password,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ChangePasswordRequest) Reset() { + *x = ChangePasswordRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ChangePasswordRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordRequest) ProtoMessage() {} + +func (x *ChangePasswordRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordRequest.ProtoReflect.Descriptor instead. +func (*ChangePasswordRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{12} +} + +func (x *ChangePasswordRequest) GetCurrentPassword() string { + if x != nil { + return x.CurrentPassword + } + return "" +} + +func (x *ChangePasswordRequest) GetNewPassword() string { + if x != nil { + return x.NewPassword + } + return "" +} + +// Response message for ChangePassword RPC. +type ChangePasswordResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ChangePasswordResponse) Reset() { + *x = ChangePasswordResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ChangePasswordResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordResponse) ProtoMessage() {} + +func (x *ChangePasswordResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordResponse.ProtoReflect.Descriptor instead. +func (*ChangePasswordResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{13} +} + +func (x *ChangePasswordResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for VerifyEmail RPC. +type VerifyEmailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Email verification token from email link. + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyEmailRequest) Reset() { + *x = VerifyEmailRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyEmailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyEmailRequest) ProtoMessage() {} + +func (x *VerifyEmailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyEmailRequest.ProtoReflect.Descriptor instead. +func (*VerifyEmailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{14} +} + +func (x *VerifyEmailRequest) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// Response message for VerifyEmail RPC. +type VerifyEmailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyEmailResponse) Reset() { + *x = VerifyEmailResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyEmailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyEmailResponse) ProtoMessage() {} + +func (x *VerifyEmailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyEmailResponse.ProtoReflect.Descriptor instead. +func (*VerifyEmailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{15} +} + +func (x *VerifyEmailResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for InviteUser RPC. +type InviteUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Organization to invite user to. + // Format: `accounts/{account}/organizations/{organization}` + Organization string `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + // Required: Email address to invite. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // Optional: Team assignments for the invited user. + TeamAssignments []*TeamAssignment `protobuf:"bytes,3,rep,name=team_assignments,json=teamAssignments,proto3" json:"team_assignments,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InviteUserRequest) Reset() { + *x = InviteUserRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InviteUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InviteUserRequest) ProtoMessage() {} + +func (x *InviteUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InviteUserRequest.ProtoReflect.Descriptor instead. +func (*InviteUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{16} +} + +func (x *InviteUserRequest) GetOrganization() string { + if x != nil { + return x.Organization + } + return "" +} + +func (x *InviteUserRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *InviteUserRequest) GetTeamAssignments() []*TeamAssignment { + if x != nil { + return x.TeamAssignments + } + return nil +} + +// Team assignment for invited user. +type TeamAssignment struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Team ID to add user to. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Role in the team (e.g., "member", "admin"). + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TeamAssignment) Reset() { + *x = TeamAssignment{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TeamAssignment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamAssignment) ProtoMessage() {} + +func (x *TeamAssignment) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamAssignment.ProtoReflect.Descriptor instead. +func (*TeamAssignment) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{17} +} + +func (x *TeamAssignment) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *TeamAssignment) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +// Response message for InviteUser RPC. +type InviteUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The created invite. + Invite *Invite `protobuf:"bytes,1,opt,name=invite,proto3" json:"invite,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InviteUserResponse) Reset() { + *x = InviteUserResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InviteUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InviteUserResponse) ProtoMessage() {} + +func (x *InviteUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InviteUserResponse.ProtoReflect.Descriptor instead. +func (*InviteUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{18} +} + +func (x *InviteUserResponse) GetInvite() *Invite { + if x != nil { + return x.Invite + } + return nil +} + +// Request message for AcceptInvite RPC. +type AcceptInviteRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Invite token from email link. + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + // Required: Display name for the new user. + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Required: Password for the new account. + Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AcceptInviteRequest) Reset() { + *x = AcceptInviteRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AcceptInviteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AcceptInviteRequest) ProtoMessage() {} + +func (x *AcceptInviteRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AcceptInviteRequest.ProtoReflect.Descriptor instead. +func (*AcceptInviteRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{19} +} + +func (x *AcceptInviteRequest) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *AcceptInviteRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AcceptInviteRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +// Response message for AcceptInvite RPC. +type AcceptInviteResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The created user's ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // The organization the user joined. + OrganizationId string `protobuf:"bytes,2,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AcceptInviteResponse) Reset() { + *x = AcceptInviteResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AcceptInviteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AcceptInviteResponse) ProtoMessage() {} + +func (x *AcceptInviteResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AcceptInviteResponse.ProtoReflect.Descriptor instead. +func (*AcceptInviteResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{20} +} + +func (x *AcceptInviteResponse) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *AcceptInviteResponse) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *AcceptInviteResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Request message for ListInvites RPC. +type ListInvitesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + // Format: `accounts/{account}/organizations/{organization}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number to return (max 100). + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from previous call. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by status: pending, accepted, expired, revoked. + StatusFilter string `protobuf:"bytes,4,opt,name=status_filter,json=statusFilter,proto3" json:"status_filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListInvitesRequest) Reset() { + *x = ListInvitesRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListInvitesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListInvitesRequest) ProtoMessage() {} + +func (x *ListInvitesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListInvitesRequest.ProtoReflect.Descriptor instead. +func (*ListInvitesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{21} +} + +func (x *ListInvitesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListInvitesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListInvitesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListInvitesRequest) GetStatusFilter() string { + if x != nil { + return x.StatusFilter + } + return "" +} + +// Response message for ListInvites RPC. +type ListInvitesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Invites []*Invite `protobuf:"bytes,1,rep,name=invites,proto3" json:"invites,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListInvitesResponse) Reset() { + *x = ListInvitesResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListInvitesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListInvitesResponse) ProtoMessage() {} + +func (x *ListInvitesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListInvitesResponse.ProtoReflect.Descriptor instead. +func (*ListInvitesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{22} +} + +func (x *ListInvitesResponse) GetInvites() []*Invite { + if x != nil { + return x.Invites + } + return nil +} + +func (x *ListInvitesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListInvitesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for RevokeInvite RPC. +type RevokeInviteRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the invite. + // Format: `accounts/{account}/organizations/{organization}/invites/{invite}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeInviteRequest) Reset() { + *x = RevokeInviteRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeInviteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeInviteRequest) ProtoMessage() {} + +func (x *RevokeInviteRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevokeInviteRequest.ProtoReflect.Descriptor instead. +func (*RevokeInviteRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{23} +} + +func (x *RevokeInviteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RevokeInvite RPC. +type RevokeInviteResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeInviteResponse) Reset() { + *x = RevokeInviteResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeInviteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeInviteResponse) ProtoMessage() {} + +func (x *RevokeInviteResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevokeInviteResponse.ProtoReflect.Descriptor instead. +func (*RevokeInviteResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{24} +} + +// Request message for GetCurrentUser RPC. +type GetCurrentUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetCurrentUserRequest) Reset() { + *x = GetCurrentUserRequest{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetCurrentUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCurrentUserRequest) ProtoMessage() {} + +func (x *GetCurrentUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCurrentUserRequest.ProtoReflect.Descriptor instead. +func (*GetCurrentUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{25} +} + +// Response message for GetCurrentUser RPC. +type GetCurrentUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + User *AuthUser `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetCurrentUserResponse) Reset() { + *x = GetCurrentUserResponse{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetCurrentUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCurrentUserResponse) ProtoMessage() {} + +func (x *GetCurrentUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCurrentUserResponse.ProtoReflect.Descriptor instead. +func (*GetCurrentUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{26} +} + +func (x *GetCurrentUserResponse) GetUser() *AuthUser { + if x != nil { + return x.User + } + return nil +} + +// AuthUser represents authenticated user information. +type AuthUser struct { + state protoimpl.MessageState `protogen:"open.v1"` + // User ID. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // User's email address. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // User's display name. + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Organization ID the user belongs to. + OrganizationId string `protobuf:"bytes,4,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + // Account ID the organization belongs to. + AccountId string `protobuf:"bytes,5,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + // User's roles (e.g., ["admin", "member"]). + Roles []string `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + // Whether email is verified. + EmailVerified bool `protobuf:"varint,7,opt,name=email_verified,json=emailVerified,proto3" json:"email_verified,omitempty"` + // Profile picture URL (if available). + AvatarUrl string `protobuf:"bytes,8,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` + // OAuth provider if logged in via social auth. + SocialAuthProvider string `protobuf:"bytes,9,opt,name=social_auth_provider,json=socialAuthProvider,proto3" json:"social_auth_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuthUser) Reset() { + *x = AuthUser{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuthUser) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthUser) ProtoMessage() {} + +func (x *AuthUser) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthUser.ProtoReflect.Descriptor instead. +func (*AuthUser) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{27} +} + +func (x *AuthUser) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AuthUser) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *AuthUser) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AuthUser) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *AuthUser) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *AuthUser) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +func (x *AuthUser) GetEmailVerified() bool { + if x != nil { + return x.EmailVerified + } + return false +} + +func (x *AuthUser) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *AuthUser) GetSocialAuthProvider() string { + if x != nil { + return x.SocialAuthProvider + } + return "" +} + +// Invite represents a user invitation. +type Invite struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. + // Format: `accounts/{account}/organizations/{organization}/invites/{invite}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Email address invited. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // Organization display name. + OrganizationName string `protobuf:"bytes,3,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + // User ID who sent the invite. + InvitedBy string `protobuf:"bytes,4,opt,name=invited_by,json=invitedBy,proto3" json:"invited_by,omitempty"` + // Invite status: pending, accepted, expired, revoked. + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + // Team assignments. + TeamAssignments []*TeamAssignment `protobuf:"bytes,6,rep,name=team_assignments,json=teamAssignments,proto3" json:"team_assignments,omitempty"` + // When the invite expires. + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // When the invite was created. + CreateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // When the invite was accepted (if applicable). + AcceptedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=accepted_at,json=acceptedAt,proto3" json:"accepted_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Invite) Reset() { + *x = Invite{} + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Invite) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Invite) ProtoMessage() {} + +func (x *Invite) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_auth_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Invite.ProtoReflect.Descriptor instead. +func (*Invite) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP(), []int{28} +} + +func (x *Invite) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Invite) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Invite) GetOrganizationName() string { + if x != nil { + return x.OrganizationName + } + return "" +} + +func (x *Invite) GetInvitedBy() string { + if x != nil { + return x.InvitedBy + } + return "" +} + +func (x *Invite) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *Invite) GetTeamAssignments() []*TeamAssignment { + if x != nil { + return x.TeamAssignments + } + return nil +} + +func (x *Invite) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *Invite) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Invite) GetAcceptedAt() *timestamppb.Timestamp { + if x != nil { + return x.AcceptedAt + } + return nil +} + +var File_redpanda_api_aigateway_v1_auth_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_auth_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x29, 0x0a, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x08, 0x18, 0x80, 0x01, 0x52, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6e, 0x0a, 0x10, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x58, 0x0a, 0x0c, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x26, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x77, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x22, 0x3f, 0x0a, 0x1b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x38, 0x0a, 0x1c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x30, + 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x08, + 0x18, 0x80, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x22, 0x31, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x07, 0x72, 0x05, 0x10, 0x08, 0x18, 0x80, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x32, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0c, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, + 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x54, 0x0a, 0x10, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0f, 0x74, 0x65, 0x61, 0x6d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x47, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x12, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x39, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x13, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x07, 0x72, 0x05, 0x10, 0x08, 0x18, 0x80, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x22, 0x72, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x29, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x06, 0x1a, 0x04, 0x18, 0x64, + 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x35, 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, + 0x14, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x22, 0xa9, 0x02, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa1, 0x03, + 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x54, 0x0a, 0x10, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x74, 0x65, 0x61, + 0x6d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x32, 0xa7, 0x0f, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x81, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2a, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, + 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x75, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x27, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x79, 0x0a, 0x06, + 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, + 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0xb3, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, + 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, + 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x96, 0x01, 0x0a, + 0x0d, 0x52, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2f, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, + 0x74, 0x68, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x6d, 0x61, + 0x69, 0x6c, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2d, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x85, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, + 0x61, 0x75, 0x74, 0x68, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x0c, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, + 0x74, 0x68, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x12, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x65, 0x12, 0xa5, 0x01, + 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x2a, + 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x2a, 0x7d, + 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0xfe, 0x01, 0x0a, 0x1d, + 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x41, + 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_auth_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_auth_proto_rawDescData = file_redpanda_api_aigateway_v1_auth_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_auth_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_auth_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_auth_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_auth_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_redpanda_api_aigateway_v1_auth_proto_goTypes = []any{ + (*RegisterRequest)(nil), // 0: redpanda.api.aigateway.v1.RegisterRequest + (*RegisterResponse)(nil), // 1: redpanda.api.aigateway.v1.RegisterResponse + (*LoginRequest)(nil), // 2: redpanda.api.aigateway.v1.LoginRequest + (*LoginResponse)(nil), // 3: redpanda.api.aigateway.v1.LoginResponse + (*LogoutRequest)(nil), // 4: redpanda.api.aigateway.v1.LogoutRequest + (*LogoutResponse)(nil), // 5: redpanda.api.aigateway.v1.LogoutResponse + (*RefreshTokenRequest)(nil), // 6: redpanda.api.aigateway.v1.RefreshTokenRequest + (*RefreshTokenResponse)(nil), // 7: redpanda.api.aigateway.v1.RefreshTokenResponse + (*RequestPasswordResetRequest)(nil), // 8: redpanda.api.aigateway.v1.RequestPasswordResetRequest + (*RequestPasswordResetResponse)(nil), // 9: redpanda.api.aigateway.v1.RequestPasswordResetResponse + (*ResetPasswordRequest)(nil), // 10: redpanda.api.aigateway.v1.ResetPasswordRequest + (*ResetPasswordResponse)(nil), // 11: redpanda.api.aigateway.v1.ResetPasswordResponse + (*ChangePasswordRequest)(nil), // 12: redpanda.api.aigateway.v1.ChangePasswordRequest + (*ChangePasswordResponse)(nil), // 13: redpanda.api.aigateway.v1.ChangePasswordResponse + (*VerifyEmailRequest)(nil), // 14: redpanda.api.aigateway.v1.VerifyEmailRequest + (*VerifyEmailResponse)(nil), // 15: redpanda.api.aigateway.v1.VerifyEmailResponse + (*InviteUserRequest)(nil), // 16: redpanda.api.aigateway.v1.InviteUserRequest + (*TeamAssignment)(nil), // 17: redpanda.api.aigateway.v1.TeamAssignment + (*InviteUserResponse)(nil), // 18: redpanda.api.aigateway.v1.InviteUserResponse + (*AcceptInviteRequest)(nil), // 19: redpanda.api.aigateway.v1.AcceptInviteRequest + (*AcceptInviteResponse)(nil), // 20: redpanda.api.aigateway.v1.AcceptInviteResponse + (*ListInvitesRequest)(nil), // 21: redpanda.api.aigateway.v1.ListInvitesRequest + (*ListInvitesResponse)(nil), // 22: redpanda.api.aigateway.v1.ListInvitesResponse + (*RevokeInviteRequest)(nil), // 23: redpanda.api.aigateway.v1.RevokeInviteRequest + (*RevokeInviteResponse)(nil), // 24: redpanda.api.aigateway.v1.RevokeInviteResponse + (*GetCurrentUserRequest)(nil), // 25: redpanda.api.aigateway.v1.GetCurrentUserRequest + (*GetCurrentUserResponse)(nil), // 26: redpanda.api.aigateway.v1.GetCurrentUserResponse + (*AuthUser)(nil), // 27: redpanda.api.aigateway.v1.AuthUser + (*Invite)(nil), // 28: redpanda.api.aigateway.v1.Invite + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_auth_proto_depIdxs = []int32{ + 27, // 0: redpanda.api.aigateway.v1.LoginResponse.user:type_name -> redpanda.api.aigateway.v1.AuthUser + 17, // 1: redpanda.api.aigateway.v1.InviteUserRequest.team_assignments:type_name -> redpanda.api.aigateway.v1.TeamAssignment + 28, // 2: redpanda.api.aigateway.v1.InviteUserResponse.invite:type_name -> redpanda.api.aigateway.v1.Invite + 28, // 3: redpanda.api.aigateway.v1.ListInvitesResponse.invites:type_name -> redpanda.api.aigateway.v1.Invite + 27, // 4: redpanda.api.aigateway.v1.GetCurrentUserResponse.user:type_name -> redpanda.api.aigateway.v1.AuthUser + 17, // 5: redpanda.api.aigateway.v1.Invite.team_assignments:type_name -> redpanda.api.aigateway.v1.TeamAssignment + 29, // 6: redpanda.api.aigateway.v1.Invite.expires_at:type_name -> google.protobuf.Timestamp + 29, // 7: redpanda.api.aigateway.v1.Invite.create_time:type_name -> google.protobuf.Timestamp + 29, // 8: redpanda.api.aigateway.v1.Invite.accepted_at:type_name -> google.protobuf.Timestamp + 0, // 9: redpanda.api.aigateway.v1.AuthService.Register:input_type -> redpanda.api.aigateway.v1.RegisterRequest + 2, // 10: redpanda.api.aigateway.v1.AuthService.Login:input_type -> redpanda.api.aigateway.v1.LoginRequest + 4, // 11: redpanda.api.aigateway.v1.AuthService.Logout:input_type -> redpanda.api.aigateway.v1.LogoutRequest + 6, // 12: redpanda.api.aigateway.v1.AuthService.RefreshToken:input_type -> redpanda.api.aigateway.v1.RefreshTokenRequest + 8, // 13: redpanda.api.aigateway.v1.AuthService.RequestPasswordReset:input_type -> redpanda.api.aigateway.v1.RequestPasswordResetRequest + 10, // 14: redpanda.api.aigateway.v1.AuthService.ResetPassword:input_type -> redpanda.api.aigateway.v1.ResetPasswordRequest + 12, // 15: redpanda.api.aigateway.v1.AuthService.ChangePassword:input_type -> redpanda.api.aigateway.v1.ChangePasswordRequest + 14, // 16: redpanda.api.aigateway.v1.AuthService.VerifyEmail:input_type -> redpanda.api.aigateway.v1.VerifyEmailRequest + 16, // 17: redpanda.api.aigateway.v1.AuthService.InviteUser:input_type -> redpanda.api.aigateway.v1.InviteUserRequest + 19, // 18: redpanda.api.aigateway.v1.AuthService.AcceptInvite:input_type -> redpanda.api.aigateway.v1.AcceptInviteRequest + 25, // 19: redpanda.api.aigateway.v1.AuthService.GetCurrentUser:input_type -> redpanda.api.aigateway.v1.GetCurrentUserRequest + 21, // 20: redpanda.api.aigateway.v1.AuthService.ListInvites:input_type -> redpanda.api.aigateway.v1.ListInvitesRequest + 23, // 21: redpanda.api.aigateway.v1.AuthService.RevokeInvite:input_type -> redpanda.api.aigateway.v1.RevokeInviteRequest + 1, // 22: redpanda.api.aigateway.v1.AuthService.Register:output_type -> redpanda.api.aigateway.v1.RegisterResponse + 3, // 23: redpanda.api.aigateway.v1.AuthService.Login:output_type -> redpanda.api.aigateway.v1.LoginResponse + 5, // 24: redpanda.api.aigateway.v1.AuthService.Logout:output_type -> redpanda.api.aigateway.v1.LogoutResponse + 7, // 25: redpanda.api.aigateway.v1.AuthService.RefreshToken:output_type -> redpanda.api.aigateway.v1.RefreshTokenResponse + 9, // 26: redpanda.api.aigateway.v1.AuthService.RequestPasswordReset:output_type -> redpanda.api.aigateway.v1.RequestPasswordResetResponse + 11, // 27: redpanda.api.aigateway.v1.AuthService.ResetPassword:output_type -> redpanda.api.aigateway.v1.ResetPasswordResponse + 13, // 28: redpanda.api.aigateway.v1.AuthService.ChangePassword:output_type -> redpanda.api.aigateway.v1.ChangePasswordResponse + 15, // 29: redpanda.api.aigateway.v1.AuthService.VerifyEmail:output_type -> redpanda.api.aigateway.v1.VerifyEmailResponse + 18, // 30: redpanda.api.aigateway.v1.AuthService.InviteUser:output_type -> redpanda.api.aigateway.v1.InviteUserResponse + 20, // 31: redpanda.api.aigateway.v1.AuthService.AcceptInvite:output_type -> redpanda.api.aigateway.v1.AcceptInviteResponse + 26, // 32: redpanda.api.aigateway.v1.AuthService.GetCurrentUser:output_type -> redpanda.api.aigateway.v1.GetCurrentUserResponse + 22, // 33: redpanda.api.aigateway.v1.AuthService.ListInvites:output_type -> redpanda.api.aigateway.v1.ListInvitesResponse + 24, // 34: redpanda.api.aigateway.v1.AuthService.RevokeInvite:output_type -> redpanda.api.aigateway.v1.RevokeInviteResponse + 22, // [22:35] is the sub-list for method output_type + 9, // [9:22] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_auth_proto_init() } +func file_redpanda_api_aigateway_v1_auth_proto_init() { + if File_redpanda_api_aigateway_v1_auth_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_auth_proto_rawDesc, + NumEnums: 0, + NumMessages: 29, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_auth_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_auth_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_auth_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_auth_proto = out.File + file_redpanda_api_aigateway_v1_auth_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_auth_proto_goTypes = nil + file_redpanda_api_aigateway_v1_auth_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.gw.go new file mode 100644 index 0000000000..21a06f5230 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth.pb.gw.go @@ -0,0 +1,981 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/auth.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_AuthService_Register_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RegisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.Register(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_Register_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RegisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.Register(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LoginRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LoginRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.Login(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.Logout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.Logout(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_RefreshToken_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RefreshTokenRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.RefreshToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_RefreshToken_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RefreshTokenRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.RefreshToken(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_RequestPasswordReset_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RequestPasswordResetRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.RequestPasswordReset(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_RequestPasswordReset_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RequestPasswordResetRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.RequestPasswordReset(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_ResetPassword_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ResetPasswordRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.ResetPassword(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_ResetPassword_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ResetPasswordRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ResetPassword(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_ChangePassword_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ChangePasswordRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.ChangePassword(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_ChangePassword_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ChangePasswordRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ChangePassword(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_VerifyEmail_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq VerifyEmailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.VerifyEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_VerifyEmail_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq VerifyEmailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.VerifyEmail(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_InviteUser_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq InviteUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.InviteUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_InviteUser_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq InviteUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.InviteUser(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_AcceptInvite_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AcceptInviteRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.AcceptInvite(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_AcceptInvite_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AcceptInviteRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.AcceptInvite(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_GetCurrentUser_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetCurrentUserRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetCurrentUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_GetCurrentUser_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetCurrentUserRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetCurrentUser(ctx, &protoReq) + return msg, metadata, err +} + +var filter_AuthService_ListInvites_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_AuthService_ListInvites_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListInvitesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_ListInvites_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListInvites(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_ListInvites_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListInvitesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_ListInvites_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListInvites(ctx, &protoReq) + return msg, metadata, err +} + +func request_AuthService_RevokeInvite_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RevokeInviteRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RevokeInvite(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AuthService_RevokeInvite_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RevokeInviteRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RevokeInvite(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterAuthServiceHandlerServer registers the http handlers for service AuthService to "mux". +// UnaryRPC :call AuthServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthServiceServer) error { + mux.Handle(http.MethodPost, pattern_AuthService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Register", runtime.WithHTTPPathPattern("/v1/auth/register")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_Register_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Register_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Login", runtime.WithHTTPPathPattern("/v1/auth/login")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_Login_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Login_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Logout", runtime.WithHTTPPathPattern("/v1/auth/logout")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_Logout_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Logout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_RefreshToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RefreshToken", runtime.WithHTTPPathPattern("/v1/auth/refresh")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_RefreshToken_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RefreshToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_RequestPasswordReset_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RequestPasswordReset", runtime.WithHTTPPathPattern("/v1/auth/password/reset-request")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_RequestPasswordReset_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RequestPasswordReset_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_ResetPassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ResetPassword", runtime.WithHTTPPathPattern("/v1/auth/password/reset")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_ResetPassword_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ResetPassword_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_ChangePassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ChangePassword", runtime.WithHTTPPathPattern("/v1/auth/password/change")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_ChangePassword_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ChangePassword_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_VerifyEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/VerifyEmail", runtime.WithHTTPPathPattern("/v1/auth/verify-email")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_VerifyEmail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_VerifyEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_InviteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/InviteUser", runtime.WithHTTPPathPattern("/v1/auth/invite")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_InviteUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_InviteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_AcceptInvite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/AcceptInvite", runtime.WithHTTPPathPattern("/v1/auth/invite/accept")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_AcceptInvite_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_AcceptInvite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AuthService_GetCurrentUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/GetCurrentUser", runtime.WithHTTPPathPattern("/v1/auth/me")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_GetCurrentUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_GetCurrentUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AuthService_ListInvites_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ListInvites", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/invites")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_ListInvites_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ListInvites_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AuthService_RevokeInvite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RevokeInvite", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/invites/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_RevokeInvite_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RevokeInvite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterAuthServiceHandlerFromEndpoint is same as RegisterAuthServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAuthServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterAuthServiceHandler(ctx, mux, conn) +} + +// RegisterAuthServiceHandler registers the http handlers for service AuthService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAuthServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAuthServiceHandlerClient(ctx, mux, NewAuthServiceClient(conn)) +} + +// RegisterAuthServiceHandlerClient registers the http handlers for service AuthService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuthServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuthServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AuthServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthServiceClient) error { + mux.Handle(http.MethodPost, pattern_AuthService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Register", runtime.WithHTTPPathPattern("/v1/auth/register")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_Register_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Register_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Login", runtime.WithHTTPPathPattern("/v1/auth/login")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_Login_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Login_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/Logout", runtime.WithHTTPPathPattern("/v1/auth/logout")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_Logout_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_Logout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_RefreshToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RefreshToken", runtime.WithHTTPPathPattern("/v1/auth/refresh")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_RefreshToken_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RefreshToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_RequestPasswordReset_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RequestPasswordReset", runtime.WithHTTPPathPattern("/v1/auth/password/reset-request")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_RequestPasswordReset_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RequestPasswordReset_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_ResetPassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ResetPassword", runtime.WithHTTPPathPattern("/v1/auth/password/reset")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_ResetPassword_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ResetPassword_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_ChangePassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ChangePassword", runtime.WithHTTPPathPattern("/v1/auth/password/change")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_ChangePassword_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ChangePassword_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_VerifyEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/VerifyEmail", runtime.WithHTTPPathPattern("/v1/auth/verify-email")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_VerifyEmail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_VerifyEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_InviteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/InviteUser", runtime.WithHTTPPathPattern("/v1/auth/invite")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_InviteUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_InviteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_AuthService_AcceptInvite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/AcceptInvite", runtime.WithHTTPPathPattern("/v1/auth/invite/accept")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_AcceptInvite_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_AcceptInvite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AuthService_GetCurrentUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/GetCurrentUser", runtime.WithHTTPPathPattern("/v1/auth/me")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_GetCurrentUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_GetCurrentUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_AuthService_ListInvites_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/ListInvites", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/invites")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_ListInvites_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_ListInvites_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_AuthService_RevokeInvite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.AuthService/RevokeInvite", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/invites/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_RevokeInvite_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AuthService_RevokeInvite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_AuthService_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "register"}, "")) + pattern_AuthService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "login"}, "")) + pattern_AuthService_Logout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "logout"}, "")) + pattern_AuthService_RefreshToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "refresh"}, "")) + pattern_AuthService_RequestPasswordReset_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "auth", "password", "reset-request"}, "")) + pattern_AuthService_ResetPassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "auth", "password", "reset"}, "")) + pattern_AuthService_ChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "auth", "password", "change"}, "")) + pattern_AuthService_VerifyEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "verify-email"}, "")) + pattern_AuthService_InviteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "invite"}, "")) + pattern_AuthService_AcceptInvite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "auth", "invite", "accept"}, "")) + pattern_AuthService_GetCurrentUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "auth", "me"}, "")) + pattern_AuthService_ListInvites_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "invites"}, "")) + pattern_AuthService_RevokeInvite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "invites", "name"}, "")) +) + +var ( + forward_AuthService_Register_0 = runtime.ForwardResponseMessage + forward_AuthService_Login_0 = runtime.ForwardResponseMessage + forward_AuthService_Logout_0 = runtime.ForwardResponseMessage + forward_AuthService_RefreshToken_0 = runtime.ForwardResponseMessage + forward_AuthService_RequestPasswordReset_0 = runtime.ForwardResponseMessage + forward_AuthService_ResetPassword_0 = runtime.ForwardResponseMessage + forward_AuthService_ChangePassword_0 = runtime.ForwardResponseMessage + forward_AuthService_VerifyEmail_0 = runtime.ForwardResponseMessage + forward_AuthService_InviteUser_0 = runtime.ForwardResponseMessage + forward_AuthService_AcceptInvite_0 = runtime.ForwardResponseMessage + forward_AuthService_GetCurrentUser_0 = runtime.ForwardResponseMessage + forward_AuthService_ListInvites_0 = runtime.ForwardResponseMessage + forward_AuthService_RevokeInvite_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/auth_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth_grpc.pb.go new file mode 100644 index 0000000000..99e5d9025f --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/auth_grpc.pb.go @@ -0,0 +1,622 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/auth.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AuthService_Register_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/Register" + AuthService_Login_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/Login" + AuthService_Logout_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/Logout" + AuthService_RefreshToken_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/RefreshToken" + AuthService_RequestPasswordReset_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/RequestPasswordReset" + AuthService_ResetPassword_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/ResetPassword" + AuthService_ChangePassword_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/ChangePassword" + AuthService_VerifyEmail_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/VerifyEmail" + AuthService_InviteUser_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/InviteUser" + AuthService_AcceptInvite_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/AcceptInvite" + AuthService_GetCurrentUser_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/GetCurrentUser" + AuthService_ListInvites_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/ListInvites" + AuthService_RevokeInvite_FullMethodName = "/redpanda.api.aigateway.v1.AuthService/RevokeInvite" +) + +// AuthServiceClient is the client API for AuthService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AuthService provides authentication and session management. +// Handles email/password login, registration, password reset, and invitations. +// Social OAuth (Google, GitHub) uses HTTP redirects and is handled separately. +type AuthServiceClient interface { + // Registers a new user with email and password. + // Creates a personal organization for the user. + // Sends email verification link. + Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) + // Authenticates a user with email and password. + // Returns session cookie and access token. + Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) + // Logs out the current user by invalidating their session. + Logout(ctx context.Context, in *LogoutRequest, opts ...grpc.CallOption) (*LogoutResponse, error) + // Refreshes the access token using the session cookie. + RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error) + // Requests a password reset email. + // Always returns success to prevent email enumeration. + RequestPasswordReset(ctx context.Context, in *RequestPasswordResetRequest, opts ...grpc.CallOption) (*RequestPasswordResetResponse, error) + // Resets password using a reset token. + ResetPassword(ctx context.Context, in *ResetPasswordRequest, opts ...grpc.CallOption) (*ResetPasswordResponse, error) + // Changes password for authenticated user. + ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*ChangePasswordResponse, error) + // Verifies email using verification token. + VerifyEmail(ctx context.Context, in *VerifyEmailRequest, opts ...grpc.CallOption) (*VerifyEmailResponse, error) + // Invites a user to join an organization. + // Requires admin permissions in the organization. + InviteUser(ctx context.Context, in *InviteUserRequest, opts ...grpc.CallOption) (*InviteUserResponse, error) + // Accepts an invitation and creates user account. + AcceptInvite(ctx context.Context, in *AcceptInviteRequest, opts ...grpc.CallOption) (*AcceptInviteResponse, error) + // Gets the current authenticated user's info. + GetCurrentUser(ctx context.Context, in *GetCurrentUserRequest, opts ...grpc.CallOption) (*GetCurrentUserResponse, error) + // Lists pending invitations for an organization. + ListInvites(ctx context.Context, in *ListInvitesRequest, opts ...grpc.CallOption) (*ListInvitesResponse, error) + // Revokes a pending invitation. + RevokeInvite(ctx context.Context, in *RevokeInviteRequest, opts ...grpc.CallOption) (*RevokeInviteResponse, error) +} + +type authServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient { + return &authServiceClient{cc} +} + +func (c *authServiceClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RegisterResponse) + err := c.cc.Invoke(ctx, AuthService_Register_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(LoginResponse) + err := c.cc.Invoke(ctx, AuthService_Login_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) Logout(ctx context.Context, in *LogoutRequest, opts ...grpc.CallOption) (*LogoutResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(LogoutResponse) + err := c.cc.Invoke(ctx, AuthService_Logout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RefreshTokenResponse) + err := c.cc.Invoke(ctx, AuthService_RefreshToken_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) RequestPasswordReset(ctx context.Context, in *RequestPasswordResetRequest, opts ...grpc.CallOption) (*RequestPasswordResetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RequestPasswordResetResponse) + err := c.cc.Invoke(ctx, AuthService_RequestPasswordReset_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) ResetPassword(ctx context.Context, in *ResetPasswordRequest, opts ...grpc.CallOption) (*ResetPasswordResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResetPasswordResponse) + err := c.cc.Invoke(ctx, AuthService_ResetPassword_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*ChangePasswordResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ChangePasswordResponse) + err := c.cc.Invoke(ctx, AuthService_ChangePassword_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) VerifyEmail(ctx context.Context, in *VerifyEmailRequest, opts ...grpc.CallOption) (*VerifyEmailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(VerifyEmailResponse) + err := c.cc.Invoke(ctx, AuthService_VerifyEmail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) InviteUser(ctx context.Context, in *InviteUserRequest, opts ...grpc.CallOption) (*InviteUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(InviteUserResponse) + err := c.cc.Invoke(ctx, AuthService_InviteUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) AcceptInvite(ctx context.Context, in *AcceptInviteRequest, opts ...grpc.CallOption) (*AcceptInviteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AcceptInviteResponse) + err := c.cc.Invoke(ctx, AuthService_AcceptInvite_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) GetCurrentUser(ctx context.Context, in *GetCurrentUserRequest, opts ...grpc.CallOption) (*GetCurrentUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetCurrentUserResponse) + err := c.cc.Invoke(ctx, AuthService_GetCurrentUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) ListInvites(ctx context.Context, in *ListInvitesRequest, opts ...grpc.CallOption) (*ListInvitesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListInvitesResponse) + err := c.cc.Invoke(ctx, AuthService_ListInvites_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) RevokeInvite(ctx context.Context, in *RevokeInviteRequest, opts ...grpc.CallOption) (*RevokeInviteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RevokeInviteResponse) + err := c.cc.Invoke(ctx, AuthService_RevokeInvite_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuthServiceServer is the server API for AuthService service. +// All implementations must embed UnimplementedAuthServiceServer +// for forward compatibility. +// +// AuthService provides authentication and session management. +// Handles email/password login, registration, password reset, and invitations. +// Social OAuth (Google, GitHub) uses HTTP redirects and is handled separately. +type AuthServiceServer interface { + // Registers a new user with email and password. + // Creates a personal organization for the user. + // Sends email verification link. + Register(context.Context, *RegisterRequest) (*RegisterResponse, error) + // Authenticates a user with email and password. + // Returns session cookie and access token. + Login(context.Context, *LoginRequest) (*LoginResponse, error) + // Logs out the current user by invalidating their session. + Logout(context.Context, *LogoutRequest) (*LogoutResponse, error) + // Refreshes the access token using the session cookie. + RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error) + // Requests a password reset email. + // Always returns success to prevent email enumeration. + RequestPasswordReset(context.Context, *RequestPasswordResetRequest) (*RequestPasswordResetResponse, error) + // Resets password using a reset token. + ResetPassword(context.Context, *ResetPasswordRequest) (*ResetPasswordResponse, error) + // Changes password for authenticated user. + ChangePassword(context.Context, *ChangePasswordRequest) (*ChangePasswordResponse, error) + // Verifies email using verification token. + VerifyEmail(context.Context, *VerifyEmailRequest) (*VerifyEmailResponse, error) + // Invites a user to join an organization. + // Requires admin permissions in the organization. + InviteUser(context.Context, *InviteUserRequest) (*InviteUserResponse, error) + // Accepts an invitation and creates user account. + AcceptInvite(context.Context, *AcceptInviteRequest) (*AcceptInviteResponse, error) + // Gets the current authenticated user's info. + GetCurrentUser(context.Context, *GetCurrentUserRequest) (*GetCurrentUserResponse, error) + // Lists pending invitations for an organization. + ListInvites(context.Context, *ListInvitesRequest) (*ListInvitesResponse, error) + // Revokes a pending invitation. + RevokeInvite(context.Context, *RevokeInviteRequest) (*RevokeInviteResponse, error) + mustEmbedUnimplementedAuthServiceServer() +} + +// UnimplementedAuthServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAuthServiceServer struct{} + +func (UnimplementedAuthServiceServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (UnimplementedAuthServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +} +func (UnimplementedAuthServiceServer) Logout(context.Context, *LogoutRequest) (*LogoutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") +} +func (UnimplementedAuthServiceServer) RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshToken not implemented") +} +func (UnimplementedAuthServiceServer) RequestPasswordReset(context.Context, *RequestPasswordResetRequest) (*RequestPasswordResetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RequestPasswordReset not implemented") +} +func (UnimplementedAuthServiceServer) ResetPassword(context.Context, *ResetPasswordRequest) (*ResetPasswordResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResetPassword not implemented") +} +func (UnimplementedAuthServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*ChangePasswordResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") +} +func (UnimplementedAuthServiceServer) VerifyEmail(context.Context, *VerifyEmailRequest) (*VerifyEmailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyEmail not implemented") +} +func (UnimplementedAuthServiceServer) InviteUser(context.Context, *InviteUserRequest) (*InviteUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InviteUser not implemented") +} +func (UnimplementedAuthServiceServer) AcceptInvite(context.Context, *AcceptInviteRequest) (*AcceptInviteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AcceptInvite not implemented") +} +func (UnimplementedAuthServiceServer) GetCurrentUser(context.Context, *GetCurrentUserRequest) (*GetCurrentUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCurrentUser not implemented") +} +func (UnimplementedAuthServiceServer) ListInvites(context.Context, *ListInvitesRequest) (*ListInvitesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListInvites not implemented") +} +func (UnimplementedAuthServiceServer) RevokeInvite(context.Context, *RevokeInviteRequest) (*RevokeInviteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeInvite not implemented") +} +func (UnimplementedAuthServiceServer) mustEmbedUnimplementedAuthServiceServer() {} +func (UnimplementedAuthServiceServer) testEmbeddedByValue() {} + +// UnsafeAuthServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthServiceServer will +// result in compilation errors. +type UnsafeAuthServiceServer interface { + mustEmbedUnimplementedAuthServiceServer() +} + +func RegisterAuthServiceServer(s grpc.ServiceRegistrar, srv AuthServiceServer) { + // If the following call pancis, it indicates UnimplementedAuthServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AuthService_ServiceDesc, srv) +} + +func _AuthService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_Register_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).Register(ctx, req.(*RegisterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LoginRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).Login(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_Login_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).Login(ctx, req.(*LoginRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_Logout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LogoutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).Logout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_Logout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).Logout(ctx, req.(*LogoutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_RefreshToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshTokenRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).RefreshToken(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_RefreshToken_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).RefreshToken(ctx, req.(*RefreshTokenRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_RequestPasswordReset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestPasswordResetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).RequestPasswordReset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_RequestPasswordReset_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).RequestPasswordReset(ctx, req.(*RequestPasswordResetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_ResetPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResetPasswordRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).ResetPassword(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_ResetPassword_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).ResetPassword(ctx, req.(*ResetPasswordRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_ChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangePasswordRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).ChangePassword(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_ChangePassword_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).ChangePassword(ctx, req.(*ChangePasswordRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_VerifyEmail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VerifyEmailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).VerifyEmail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_VerifyEmail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).VerifyEmail(ctx, req.(*VerifyEmailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_InviteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InviteUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).InviteUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_InviteUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).InviteUser(ctx, req.(*InviteUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_AcceptInvite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AcceptInviteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).AcceptInvite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_AcceptInvite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).AcceptInvite(ctx, req.(*AcceptInviteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_GetCurrentUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCurrentUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).GetCurrentUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_GetCurrentUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).GetCurrentUser(ctx, req.(*GetCurrentUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_ListInvites_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListInvitesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).ListInvites(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_ListInvites_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).ListInvites(ctx, req.(*ListInvitesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_RevokeInvite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RevokeInviteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).RevokeInvite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_RevokeInvite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).RevokeInvite(ctx, req.(*RevokeInviteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AuthService_ServiceDesc is the grpc.ServiceDesc for AuthService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuthService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.AuthService", + HandlerType: (*AuthServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Register", + Handler: _AuthService_Register_Handler, + }, + { + MethodName: "Login", + Handler: _AuthService_Login_Handler, + }, + { + MethodName: "Logout", + Handler: _AuthService_Logout_Handler, + }, + { + MethodName: "RefreshToken", + Handler: _AuthService_RefreshToken_Handler, + }, + { + MethodName: "RequestPasswordReset", + Handler: _AuthService_RequestPasswordReset_Handler, + }, + { + MethodName: "ResetPassword", + Handler: _AuthService_ResetPassword_Handler, + }, + { + MethodName: "ChangePassword", + Handler: _AuthService_ChangePassword_Handler, + }, + { + MethodName: "VerifyEmail", + Handler: _AuthService_VerifyEmail_Handler, + }, + { + MethodName: "InviteUser", + Handler: _AuthService_InviteUser_Handler, + }, + { + MethodName: "AcceptInvite", + Handler: _AuthService_AcceptInvite_Handler, + }, + { + MethodName: "GetCurrentUser", + Handler: _AuthService_GetCurrentUser_Handler, + }, + { + MethodName: "ListInvites", + Handler: _AuthService_ListInvites_Handler, + }, + { + MethodName: "RevokeInvite", + Handler: _AuthService_RevokeInvite_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/auth.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.go new file mode 100644 index 0000000000..d99777de2d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.go @@ -0,0 +1,2505 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/backend_pool.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type LoadBalancingStrategy int32 + +const ( + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_UNSPECIFIED LoadBalancingStrategy = 0 + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_ROUND_ROBIN LoadBalancingStrategy = 1 + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_WEIGHTED_ROUND_ROBIN LoadBalancingStrategy = 2 + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_LEAST_CONNECTIONS LoadBalancingStrategy = 3 + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_RANDOM LoadBalancingStrategy = 4 + LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_FAILOVER LoadBalancingStrategy = 5 +) + +// Enum value maps for LoadBalancingStrategy. +var ( + LoadBalancingStrategy_name = map[int32]string{ + 0: "LOAD_BALANCING_STRATEGY_UNSPECIFIED", + 1: "LOAD_BALANCING_STRATEGY_ROUND_ROBIN", + 2: "LOAD_BALANCING_STRATEGY_WEIGHTED_ROUND_ROBIN", + 3: "LOAD_BALANCING_STRATEGY_LEAST_CONNECTIONS", + 4: "LOAD_BALANCING_STRATEGY_RANDOM", + 5: "LOAD_BALANCING_STRATEGY_FAILOVER", + } + LoadBalancingStrategy_value = map[string]int32{ + "LOAD_BALANCING_STRATEGY_UNSPECIFIED": 0, + "LOAD_BALANCING_STRATEGY_ROUND_ROBIN": 1, + "LOAD_BALANCING_STRATEGY_WEIGHTED_ROUND_ROBIN": 2, + "LOAD_BALANCING_STRATEGY_LEAST_CONNECTIONS": 3, + "LOAD_BALANCING_STRATEGY_RANDOM": 4, + "LOAD_BALANCING_STRATEGY_FAILOVER": 5, + } +) + +func (x LoadBalancingStrategy) Enum() *LoadBalancingStrategy { + p := new(LoadBalancingStrategy) + *p = x + return p +} + +func (x LoadBalancingStrategy) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LoadBalancingStrategy) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[0].Descriptor() +} + +func (LoadBalancingStrategy) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[0] +} + +func (x LoadBalancingStrategy) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LoadBalancingStrategy.Descriptor instead. +func (LoadBalancingStrategy) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{0} +} + +type TLSVerifyMode int32 + +const ( + TLSVerifyMode_TLS_VERIFY_MODE_UNSPECIFIED TLSVerifyMode = 0 + TLSVerifyMode_TLS_VERIFY_MODE_FULL TLSVerifyMode = 1 + TLSVerifyMode_TLS_VERIFY_MODE_SKIP TLSVerifyMode = 2 +) + +// Enum value maps for TLSVerifyMode. +var ( + TLSVerifyMode_name = map[int32]string{ + 0: "TLS_VERIFY_MODE_UNSPECIFIED", + 1: "TLS_VERIFY_MODE_FULL", + 2: "TLS_VERIFY_MODE_SKIP", + } + TLSVerifyMode_value = map[string]int32{ + "TLS_VERIFY_MODE_UNSPECIFIED": 0, + "TLS_VERIFY_MODE_FULL": 1, + "TLS_VERIFY_MODE_SKIP": 2, + } +) + +func (x TLSVerifyMode) Enum() *TLSVerifyMode { + p := new(TLSVerifyMode) + *p = x + return p +} + +func (x TLSVerifyMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TLSVerifyMode) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[1].Descriptor() +} + +func (TLSVerifyMode) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[1] +} + +func (x TLSVerifyMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TLSVerifyMode.Descriptor instead. +func (TLSVerifyMode) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{1} +} + +type AuthType int32 + +const ( + AuthType_AUTH_TYPE_UNSPECIFIED AuthType = 0 + AuthType_AUTH_TYPE_BEARER AuthType = 1 + AuthType_AUTH_TYPE_API_KEY AuthType = 2 + AuthType_AUTH_TYPE_CUSTOM AuthType = 3 +) + +// Enum value maps for AuthType. +var ( + AuthType_name = map[int32]string{ + 0: "AUTH_TYPE_UNSPECIFIED", + 1: "AUTH_TYPE_BEARER", + 2: "AUTH_TYPE_API_KEY", + 3: "AUTH_TYPE_CUSTOM", + } + AuthType_value = map[string]int32{ + "AUTH_TYPE_UNSPECIFIED": 0, + "AUTH_TYPE_BEARER": 1, + "AUTH_TYPE_API_KEY": 2, + "AUTH_TYPE_CUSTOM": 3, + } +) + +func (x AuthType) Enum() *AuthType { + p := new(AuthType) + *p = x + return p +} + +func (x AuthType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuthType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[2].Descriptor() +} + +func (AuthType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[2] +} + +func (x AuthType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuthType.Descriptor instead. +func (AuthType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{2} +} + +// BackendType specifies the backend protocol/implementation. +type BackendType int32 + +const ( + // Default/unspecified (defaults to HTTP) + BackendType_BACKEND_TYPE_UNSPECIFIED BackendType = 0 + // HTTP/HTTPS backends (LLM REST APIs like OpenAI, Anthropic) + BackendType_BACKEND_TYPE_HTTP BackendType = 1 + // Model Context Protocol backends (MCP tool servers) + BackendType_BACKEND_TYPE_MCP BackendType = 2 +) + +// Enum value maps for BackendType. +var ( + BackendType_name = map[int32]string{ + 0: "BACKEND_TYPE_UNSPECIFIED", + 1: "BACKEND_TYPE_HTTP", + 2: "BACKEND_TYPE_MCP", + } + BackendType_value = map[string]int32{ + "BACKEND_TYPE_UNSPECIFIED": 0, + "BACKEND_TYPE_HTTP": 1, + "BACKEND_TYPE_MCP": 2, + } +) + +func (x BackendType) Enum() *BackendType { + p := new(BackendType) + *p = x + return p +} + +func (x BackendType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BackendType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[3].Descriptor() +} + +func (BackendType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes[3] +} + +func (x BackendType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BackendType.Descriptor instead. +func (BackendType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{3} +} + +// Response message for CreateBackendPool RPC. +type CreateBackendPoolResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BackendPool *BackendPool `protobuf:"bytes,1,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateBackendPoolResponse) Reset() { + *x = CreateBackendPoolResponse{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateBackendPoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateBackendPoolResponse) ProtoMessage() {} + +func (x *CreateBackendPoolResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateBackendPoolResponse.ProtoReflect.Descriptor instead. +func (*CreateBackendPoolResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateBackendPoolResponse) GetBackendPool() *BackendPool { + if x != nil { + return x.BackendPool + } + return nil +} + +// Response message for GetBackendPool RPC. +type GetBackendPoolResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BackendPool *BackendPool `protobuf:"bytes,1,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBackendPoolResponse) Reset() { + *x = GetBackendPoolResponse{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBackendPoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBackendPoolResponse) ProtoMessage() {} + +func (x *GetBackendPoolResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBackendPoolResponse.ProtoReflect.Descriptor instead. +func (*GetBackendPoolResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{1} +} + +func (x *GetBackendPoolResponse) GetBackendPool() *BackendPool { + if x != nil { + return x.BackendPool + } + return nil +} + +// Response message for UpdateBackendPool RPC. +type UpdateBackendPoolResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BackendPool *BackendPool `protobuf:"bytes,1,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateBackendPoolResponse) Reset() { + *x = UpdateBackendPoolResponse{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateBackendPoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateBackendPoolResponse) ProtoMessage() {} + +func (x *UpdateBackendPoolResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateBackendPoolResponse.ProtoReflect.Descriptor instead. +func (*UpdateBackendPoolResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateBackendPoolResponse) GetBackendPool() *BackendPool { + if x != nil { + return x.BackendPool + } + return nil +} + +// Response message for DeleteBackendPool RPC. +type DeleteBackendPoolResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteBackendPoolResponse) Reset() { + *x = DeleteBackendPoolResponse{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteBackendPoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteBackendPoolResponse) ProtoMessage() {} + +func (x *DeleteBackendPoolResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteBackendPoolResponse.ProtoReflect.Descriptor instead. +func (*DeleteBackendPoolResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{3} +} + +// BackendPool represents a group of LLM provider servers. +type BackendPool struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. + // Format: `gateways/{gateway}/backend-pools/{backend_pool}` or `backend-pools/{backend_pool}` (global) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Optional: Load balancing configuration + Balancer *BalancerConfig `protobuf:"bytes,4,opt,name=balancer,proto3" json:"balancer,omitempty"` + // Servers in this pool + Servers []*Server `protobuf:"bytes,5,rep,name=servers,proto3" json:"servers,omitempty"` + // Request body transformations (applied before forwarding to backend) + // Examples: "strip_model_prefix", "openai_to_anthropic" + RequestTransforms []string `protobuf:"bytes,6,rep,name=request_transforms,json=requestTransforms,proto3" json:"request_transforms,omitempty"` + // Response body transformations (applied before returning to client) + // Examples: "anthropic_to_openai" + ResponseTransforms []string `protobuf:"bytes,7,rep,name=response_transforms,json=responseTransforms,proto3" json:"response_transforms,omitempty"` + // Optional: HTTP request/response rewriting for all servers in this pool + Rewrite *RewriteConfig `protobuf:"bytes,8,opt,name=rewrite,proto3" json:"rewrite,omitempty"` + // Optional: Health checking configuration (passive and active) + HealthCheck *HealthCheckConfig `protobuf:"bytes,9,opt,name=health_check,json=healthCheck,proto3" json:"health_check,omitempty"` + // Optional: HTTP client configuration for backend connections + HttpClient *HTTPClientConfig `protobuf:"bytes,10,opt,name=http_client,json=httpClient,proto3" json:"http_client,omitempty"` + // Whether this backend pool is active + Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata + Metadata map[string]string `protobuf:"bytes,12,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Backend protocol type (default: HTTP for LLM APIs, MCP for tool servers) + BackendType BackendType `protobuf:"varint,15,opt,name=backend_type,json=backendType,proto3,enum=redpanda.api.aigateway.v1.BackendType" json:"backend_type,omitempty"` + // Enable deferred tool loading (MCP backends only) + // When enabled, tools are loaded lazily via tool_search instead of all upfront + // Reduces token usage by ~85% for large tool catalogs (1000+ tools) + DeferLoading bool `protobuf:"varint,16,opt,name=defer_loading,json=deferLoading,proto3" json:"defer_loading,omitempty"` + // Glob patterns for tools to load immediately (allowlist for critical tools) + // Used with defer_loading to specify essential tools + // Supports wildcards: * (any chars), ? (single char) + // Examples: ["filesystem:*", "orchestrator:execute", "*:read_*"] + LoadUpfront []string `protobuf:"bytes,17,rep,name=load_upfront,json=loadUpfront,proto3" json:"load_upfront,omitempty"` + // Tool index refresh interval in seconds (MCP backends with defer_loading only) + // How often to refresh the tool index in the background (default: 300 = 5 minutes) + // 0 means use server default + ToolIndexRefreshSeconds int32 `protobuf:"varint,18,opt,name=tool_index_refresh_seconds,json=toolIndexRefreshSeconds,proto3" json:"tool_index_refresh_seconds,omitempty"` + // Session idle timeout in seconds (for stateful backends like MCP) + // Default: 3600 (1 hour), max: 86400 (24 hours) + SessionTimeout int32 `protobuf:"varint,19,opt,name=session_timeout,json=sessionTimeout,proto3" json:"session_timeout,omitempty"` + // DEPRECATED: Per-backend session_manager is no longer supported. + // Session management for MCP backends is now configured globally via the + // mcp_gateway.session_manager section in config.yaml. This field is retained + // for backward compatibility but is ignored by the gateway. + // See: https://docs.redpanda.com/aigateway/mcp-gateway-configuration + // + // Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. + SessionManager *SessionManagerConfig `protobuf:"bytes,20,opt,name=session_manager,json=sessionManager,proto3" json:"session_manager,omitempty"` + // Forward OIDC token to all servers in this backend pool + // Can be overridden at the individual server level + ForwardOidcToken bool `protobuf:"varint,21,opt,name=forward_oidc_token,json=forwardOidcToken,proto3" json:"forward_oidc_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BackendPool) Reset() { + *x = BackendPool{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BackendPool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BackendPool) ProtoMessage() {} + +func (x *BackendPool) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BackendPool.ProtoReflect.Descriptor instead. +func (*BackendPool) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{4} +} + +func (x *BackendPool) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BackendPool) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *BackendPool) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *BackendPool) GetBalancer() *BalancerConfig { + if x != nil { + return x.Balancer + } + return nil +} + +func (x *BackendPool) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *BackendPool) GetRequestTransforms() []string { + if x != nil { + return x.RequestTransforms + } + return nil +} + +func (x *BackendPool) GetResponseTransforms() []string { + if x != nil { + return x.ResponseTransforms + } + return nil +} + +func (x *BackendPool) GetRewrite() *RewriteConfig { + if x != nil { + return x.Rewrite + } + return nil +} + +func (x *BackendPool) GetHealthCheck() *HealthCheckConfig { + if x != nil { + return x.HealthCheck + } + return nil +} + +func (x *BackendPool) GetHttpClient() *HTTPClientConfig { + if x != nil { + return x.HttpClient + } + return nil +} + +func (x *BackendPool) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *BackendPool) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *BackendPool) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *BackendPool) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *BackendPool) GetBackendType() BackendType { + if x != nil { + return x.BackendType + } + return BackendType_BACKEND_TYPE_UNSPECIFIED +} + +func (x *BackendPool) GetDeferLoading() bool { + if x != nil { + return x.DeferLoading + } + return false +} + +func (x *BackendPool) GetLoadUpfront() []string { + if x != nil { + return x.LoadUpfront + } + return nil +} + +func (x *BackendPool) GetToolIndexRefreshSeconds() int32 { + if x != nil { + return x.ToolIndexRefreshSeconds + } + return 0 +} + +func (x *BackendPool) GetSessionTimeout() int32 { + if x != nil { + return x.SessionTimeout + } + return 0 +} + +// Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. +func (x *BackendPool) GetSessionManager() *SessionManagerConfig { + if x != nil { + return x.SessionManager + } + return nil +} + +func (x *BackendPool) GetForwardOidcToken() bool { + if x != nil { + return x.ForwardOidcToken + } + return false +} + +// Server represents an individual LLM provider endpoint. +type Server struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Unique server identifier within the backend pool + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Optional: Human-readable display name + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Transport protocol: "http" (default) or "stdio" (for MCP tools) + Transport string `protobuf:"bytes,3,opt,name=transport,proto3" json:"transport,omitempty"` + // Server address (required for http transport) + // Supports http://, https://, and builtin:// schemes + Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` + // Command to execute (required for stdio transport, e.g., "npx") + Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty"` + // Command arguments (for stdio transport, e.g., ["@modelcontextprotocol/server-memory"]) + Args []string `protobuf:"bytes,6,rep,name=args,proto3" json:"args,omitempty"` + // Environment variables for the process (for stdio transport) + Env map[string]string `protobuf:"bytes,7,rep,name=env,proto3" json:"env,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Optional: Per-server HTTP rewrite configuration (overrides backend-level) + Rewrite *RewriteConfig `protobuf:"bytes,8,opt,name=rewrite,proto3" json:"rewrite,omitempty"` + // Optional: Request timeout in seconds (default: 30s, max: 3600s) + TimeoutSeconds int32 `protobuf:"varint,9,opt,name=timeout_seconds,json=timeoutSeconds,proto3" json:"timeout_seconds,omitempty"` + // Optional: Maximum retry attempts on failure (default: 0, max: 10) + MaxRetries int32 `protobuf:"varint,10,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"` + // Optional: Load balancer weight (default: 100, max: 1000) + Weight int32 `protobuf:"varint,11,opt,name=weight,proto3" json:"weight,omitempty"` + // Optional: TLS verification mode + TlsVerify TLSVerifyMode `protobuf:"varint,12,opt,name=tls_verify,json=tlsVerify,proto3,enum=redpanda.api.aigateway.v1.TLSVerifyMode" json:"tls_verify,omitempty"` + // Optional: Authentication configuration + Auth *AuthConfig `protobuf:"bytes,13,opt,name=auth,proto3" json:"auth,omitempty"` + // Whether this server is enabled + Enabled bool `protobuf:"varint,14,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Optional: Forward OIDC token to this specific server + ForwardOidcToken bool `protobuf:"varint,15,opt,name=forward_oidc_token,json=forwardOidcToken,proto3" json:"forward_oidc_token,omitempty"` + // Optional: Override backend-level defer_loading for this server (MCP servers only) + // When null, inherits from BackendPool.defer_loading + // When explicitly set, overrides backend setting for this specific server + DeferLoadingOverride *bool `protobuf:"varint,16,opt,name=defer_loading_override,json=deferLoadingOverride,proto3,oneof" json:"defer_loading_override,omitempty"` + // Optional: Provider identifier (e.g., "openai", "anthropic", "google", "mistral") + // Used for UI display and filtering. When not specified, provider is auto-detected + // from the server address URL. Use this field for custom endpoints or proxies + // where URL-based detection doesn't work. + Provider string `protobuf:"bytes,17,opt,name=provider,proto3" json:"provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Server) Reset() { + *x = Server{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Server) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Server) ProtoMessage() {} + +func (x *Server) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Server.ProtoReflect.Descriptor instead. +func (*Server) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{5} +} + +func (x *Server) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Server) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Server) GetTransport() string { + if x != nil { + return x.Transport + } + return "" +} + +func (x *Server) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *Server) GetCommand() string { + if x != nil { + return x.Command + } + return "" +} + +func (x *Server) GetArgs() []string { + if x != nil { + return x.Args + } + return nil +} + +func (x *Server) GetEnv() map[string]string { + if x != nil { + return x.Env + } + return nil +} + +func (x *Server) GetRewrite() *RewriteConfig { + if x != nil { + return x.Rewrite + } + return nil +} + +func (x *Server) GetTimeoutSeconds() int32 { + if x != nil { + return x.TimeoutSeconds + } + return 0 +} + +func (x *Server) GetMaxRetries() int32 { + if x != nil { + return x.MaxRetries + } + return 0 +} + +func (x *Server) GetWeight() int32 { + if x != nil { + return x.Weight + } + return 0 +} + +func (x *Server) GetTlsVerify() TLSVerifyMode { + if x != nil { + return x.TlsVerify + } + return TLSVerifyMode_TLS_VERIFY_MODE_UNSPECIFIED +} + +func (x *Server) GetAuth() *AuthConfig { + if x != nil { + return x.Auth + } + return nil +} + +func (x *Server) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Server) GetForwardOidcToken() bool { + if x != nil { + return x.ForwardOidcToken + } + return false +} + +func (x *Server) GetDeferLoadingOverride() bool { + if x != nil && x.DeferLoadingOverride != nil { + return *x.DeferLoadingOverride + } + return false +} + +func (x *Server) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +// BalancerConfig configures load balancing across servers +type BalancerConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Load balancing strategy + Strategy LoadBalancingStrategy `protobuf:"varint,1,opt,name=strategy,proto3,enum=redpanda.api.aigateway.v1.LoadBalancingStrategy" json:"strategy,omitempty"` + // Output only. Human-readable strategy name (e.g., "Round Robin", "Weighted") + StrategyDisplayName string `protobuf:"bytes,2,opt,name=strategy_display_name,json=strategyDisplayName,proto3" json:"strategy_display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BalancerConfig) Reset() { + *x = BalancerConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BalancerConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BalancerConfig) ProtoMessage() {} + +func (x *BalancerConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BalancerConfig.ProtoReflect.Descriptor instead. +func (*BalancerConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{6} +} + +func (x *BalancerConfig) GetStrategy() LoadBalancingStrategy { + if x != nil { + return x.Strategy + } + return LoadBalancingStrategy_LOAD_BALANCING_STRATEGY_UNSPECIFIED +} + +func (x *BalancerConfig) GetStrategyDisplayName() string { + if x != nil { + return x.StrategyDisplayName + } + return "" +} + +type AuthConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type AuthType `protobuf:"varint,1,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.AuthType" json:"type,omitempty"` + ApiKey string `protobuf:"bytes,2,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + Headers map[string]string `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuthConfig) Reset() { + *x = AuthConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuthConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthConfig) ProtoMessage() {} + +func (x *AuthConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthConfig.ProtoReflect.Descriptor instead. +func (*AuthConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{7} +} + +func (x *AuthConfig) GetType() AuthType { + if x != nil { + return x.Type + } + return AuthType_AUTH_TYPE_UNSPECIFIED +} + +func (x *AuthConfig) GetApiKey() string { + if x != nil { + return x.ApiKey + } + return "" +} + +func (x *AuthConfig) GetHeaders() map[string]string { + if x != nil { + return x.Headers + } + return nil +} + +// RewriteConfig defines HTTP request rewriting rules. +type RewriteConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Optional: Path rewriting configuration + Path *PathRewrite `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // Optional: Header manipulation configuration + Headers *HeaderRewrite `protobuf:"bytes,2,opt,name=headers,proto3" json:"headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RewriteConfig) Reset() { + *x = RewriteConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RewriteConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RewriteConfig) ProtoMessage() {} + +func (x *RewriteConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RewriteConfig.ProtoReflect.Descriptor instead. +func (*RewriteConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{8} +} + +func (x *RewriteConfig) GetPath() *PathRewrite { + if x != nil { + return x.Path + } + return nil +} + +func (x *RewriteConfig) GetHeaders() *HeaderRewrite { + if x != nil { + return x.Headers + } + return nil +} + +// PathRewrite defines path rewriting rules. +type PathRewrite struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Regex pattern to match against the request path + Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` + // Replacement string (can use $1, $2 for regex capture groups) + Replace string `protobuf:"bytes,2,opt,name=replace,proto3" json:"replace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PathRewrite) Reset() { + *x = PathRewrite{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PathRewrite) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathRewrite) ProtoMessage() {} + +func (x *PathRewrite) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PathRewrite.ProtoReflect.Descriptor instead. +func (*PathRewrite) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{9} +} + +func (x *PathRewrite) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *PathRewrite) GetReplace() string { + if x != nil { + return x.Replace + } + return "" +} + +// HeaderRewrite defines header manipulation rules. +type HeaderRewrite struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Headers to set (overwrite if present) + Set map[string]string `protobuf:"bytes,1,rep,name=set,proto3" json:"set,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Headers to add (only if not already present) + Add map[string]string `protobuf:"bytes,2,rep,name=add,proto3" json:"add,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Headers to remove + Remove []string `protobuf:"bytes,3,rep,name=remove,proto3" json:"remove,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HeaderRewrite) Reset() { + *x = HeaderRewrite{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HeaderRewrite) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderRewrite) ProtoMessage() {} + +func (x *HeaderRewrite) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeaderRewrite.ProtoReflect.Descriptor instead. +func (*HeaderRewrite) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{10} +} + +func (x *HeaderRewrite) GetSet() map[string]string { + if x != nil { + return x.Set + } + return nil +} + +func (x *HeaderRewrite) GetAdd() map[string]string { + if x != nil { + return x.Add + } + return nil +} + +func (x *HeaderRewrite) GetRemove() []string { + if x != nil { + return x.Remove + } + return nil +} + +// HealthCheckConfig configures passive and active health checking. +type HealthCheckConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Number of consecutive failures before marking server unhealthy (default: 3) + UnhealthyThreshold int32 `protobuf:"varint,1,opt,name=unhealthy_threshold,json=unhealthyThreshold,proto3" json:"unhealthy_threshold,omitempty"` + // Number of consecutive successes before marking server healthy (default: 2) + HealthyThreshold int32 `protobuf:"varint,2,opt,name=healthy_threshold,json=healthyThreshold,proto3" json:"healthy_threshold,omitempty"` + // Time before retrying an unhealthy server (e.g., "30s", "5m") + RecoveryInterval string `protobuf:"bytes,3,opt,name=recovery_interval,json=recoveryInterval,proto3" json:"recovery_interval,omitempty"` + // Optional: Active health checking (periodic probing) + Active *ActiveHealthCheck `protobuf:"bytes,4,opt,name=active,proto3" json:"active,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HealthCheckConfig) Reset() { + *x = HealthCheckConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthCheckConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthCheckConfig) ProtoMessage() {} + +func (x *HealthCheckConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthCheckConfig.ProtoReflect.Descriptor instead. +func (*HealthCheckConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{11} +} + +func (x *HealthCheckConfig) GetUnhealthyThreshold() int32 { + if x != nil { + return x.UnhealthyThreshold + } + return 0 +} + +func (x *HealthCheckConfig) GetHealthyThreshold() int32 { + if x != nil { + return x.HealthyThreshold + } + return 0 +} + +func (x *HealthCheckConfig) GetRecoveryInterval() string { + if x != nil { + return x.RecoveryInterval + } + return "" +} + +func (x *HealthCheckConfig) GetActive() *ActiveHealthCheck { + if x != nil { + return x.Active + } + return nil +} + +// ActiveHealthCheck configures periodic probing of backend servers. +type ActiveHealthCheck struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable active health checking + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Health check protocol type (e.g., "http") + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // Probe interval (e.g., "10s") + Interval string `protobuf:"bytes,3,opt,name=interval,proto3" json:"interval,omitempty"` + // Probe timeout (e.g., "5s") + Timeout string `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + // HTTP-specific health check configuration + Http *HTTPHealthCheck `protobuf:"bytes,5,opt,name=http,proto3" json:"http,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActiveHealthCheck) Reset() { + *x = ActiveHealthCheck{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActiveHealthCheck) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveHealthCheck) ProtoMessage() {} + +func (x *ActiveHealthCheck) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActiveHealthCheck.ProtoReflect.Descriptor instead. +func (*ActiveHealthCheck) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{12} +} + +func (x *ActiveHealthCheck) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ActiveHealthCheck) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ActiveHealthCheck) GetInterval() string { + if x != nil { + return x.Interval + } + return "" +} + +func (x *ActiveHealthCheck) GetTimeout() string { + if x != nil { + return x.Timeout + } + return "" +} + +func (x *ActiveHealthCheck) GetHttp() *HTTPHealthCheck { + if x != nil { + return x.Http + } + return nil +} + +// HTTPHealthCheck configures HTTP-based active health checks. +type HTTPHealthCheck struct { + state protoimpl.MessageState `protogen:"open.v1"` + // HTTP method for health check request (default: "GET") + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` + // Health check endpoint path (default: "/health") + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + // Expected HTTP status code indicating health (default: 200) + ExpectedStatus int32 `protobuf:"varint,3,opt,name=expected_status,json=expectedStatus,proto3" json:"expected_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HTTPHealthCheck) Reset() { + *x = HTTPHealthCheck{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HTTPHealthCheck) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HTTPHealthCheck) ProtoMessage() {} + +func (x *HTTPHealthCheck) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HTTPHealthCheck.ProtoReflect.Descriptor instead. +func (*HTTPHealthCheck) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{13} +} + +func (x *HTTPHealthCheck) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *HTTPHealthCheck) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *HTTPHealthCheck) GetExpectedStatus() int32 { + if x != nil { + return x.ExpectedStatus + } + return 0 +} + +// HTTPClientConfig configures the HTTP client for backend requests. +type HTTPClientConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Connection pool settings + MaxIdleConns int32 `protobuf:"varint,1,opt,name=max_idle_conns,json=maxIdleConns,proto3" json:"max_idle_conns,omitempty"` + MaxIdleConnsPerServer int32 `protobuf:"varint,2,opt,name=max_idle_conns_per_server,json=maxIdleConnsPerServer,proto3" json:"max_idle_conns_per_server,omitempty"` + MaxConnsPerServer int32 `protobuf:"varint,3,opt,name=max_conns_per_server,json=maxConnsPerServer,proto3" json:"max_conns_per_server,omitempty"` + IdleConnTimeout int32 `protobuf:"varint,4,opt,name=idle_conn_timeout,json=idleConnTimeout,proto3" json:"idle_conn_timeout,omitempty"` // seconds + // Timeout settings (all in seconds, 0 = use default) + ConnectTimeout int32 `protobuf:"varint,5,opt,name=connect_timeout,json=connectTimeout,proto3" json:"connect_timeout,omitempty"` + TlsHandshakeTimeout int32 `protobuf:"varint,6,opt,name=tls_handshake_timeout,json=tlsHandshakeTimeout,proto3" json:"tls_handshake_timeout,omitempty"` + ResponseHeaderTimeout int32 `protobuf:"varint,7,opt,name=response_header_timeout,json=responseHeaderTimeout,proto3" json:"response_header_timeout,omitempty"` + ExpectContinueTimeout int32 `protobuf:"varint,8,opt,name=expect_continue_timeout,json=expectContinueTimeout,proto3" json:"expect_continue_timeout,omitempty"` + // Feature flags + DisableCompression bool `protobuf:"varint,9,opt,name=disable_compression,json=disableCompression,proto3" json:"disable_compression,omitempty"` + DisableKeepAlives bool `protobuf:"varint,10,opt,name=disable_keep_alives,json=disableKeepAlives,proto3" json:"disable_keep_alives,omitempty"` + ForceHttp2 bool `protobuf:"varint,11,opt,name=force_http2,json=forceHttp2,proto3" json:"force_http2,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HTTPClientConfig) Reset() { + *x = HTTPClientConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HTTPClientConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HTTPClientConfig) ProtoMessage() {} + +func (x *HTTPClientConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HTTPClientConfig.ProtoReflect.Descriptor instead. +func (*HTTPClientConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{14} +} + +func (x *HTTPClientConfig) GetMaxIdleConns() int32 { + if x != nil { + return x.MaxIdleConns + } + return 0 +} + +func (x *HTTPClientConfig) GetMaxIdleConnsPerServer() int32 { + if x != nil { + return x.MaxIdleConnsPerServer + } + return 0 +} + +func (x *HTTPClientConfig) GetMaxConnsPerServer() int32 { + if x != nil { + return x.MaxConnsPerServer + } + return 0 +} + +func (x *HTTPClientConfig) GetIdleConnTimeout() int32 { + if x != nil { + return x.IdleConnTimeout + } + return 0 +} + +func (x *HTTPClientConfig) GetConnectTimeout() int32 { + if x != nil { + return x.ConnectTimeout + } + return 0 +} + +func (x *HTTPClientConfig) GetTlsHandshakeTimeout() int32 { + if x != nil { + return x.TlsHandshakeTimeout + } + return 0 +} + +func (x *HTTPClientConfig) GetResponseHeaderTimeout() int32 { + if x != nil { + return x.ResponseHeaderTimeout + } + return 0 +} + +func (x *HTTPClientConfig) GetExpectContinueTimeout() int32 { + if x != nil { + return x.ExpectContinueTimeout + } + return 0 +} + +func (x *HTTPClientConfig) GetDisableCompression() bool { + if x != nil { + return x.DisableCompression + } + return false +} + +func (x *HTTPClientConfig) GetDisableKeepAlives() bool { + if x != nil { + return x.DisableKeepAlives + } + return false +} + +func (x *HTTPClientConfig) GetForceHttp2() bool { + if x != nil { + return x.ForceHttp2 + } + return false +} + +// DEPRECATED: SessionManagerConfig is deprecated. +// Session management for MCP backends is now configured globally via the +// mcp_gateway.session_manager section in config.yaml. +// +// Storage auto-detection: +// 1. If mcp_gateway.session_manager.storage_id is set → Uses that Redis instance +// 2. If storage.redis[] is configured → Auto-detects first Redis instance +// 3. Otherwise → Falls back to in-memory storage +// +// This message is retained for backward compatibility but is ignored by the gateway. +// All MCP backends share the same session storage configuration from mcp_gateway. +// +// Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. +type SessionManagerConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // DEPRECATED: Session management is always enabled for MCP backends + // + // Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // DEPRECATED: Use mcp_gateway.session_manager.enforce_identity_binding instead + // Bind MCP sessions to OIDC subject claim (secure by default) + // When enabled, each OIDC user gets their own isolated session + // + // Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. + EnforceIdentityBinding *bool `protobuf:"varint,3,opt,name=enforce_identity_binding,json=enforceIdentityBinding,proto3,oneof" json:"enforce_identity_binding,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SessionManagerConfig) Reset() { + *x = SessionManagerConfig{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SessionManagerConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SessionManagerConfig) ProtoMessage() {} + +func (x *SessionManagerConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SessionManagerConfig.ProtoReflect.Descriptor instead. +func (*SessionManagerConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{15} +} + +// Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. +func (x *SessionManagerConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +// Deprecated: Marked as deprecated in redpanda/api/aigateway/v1/backend_pool.proto. +func (x *SessionManagerConfig) GetEnforceIdentityBinding() bool { + if x != nil && x.EnforceIdentityBinding != nil { + return *x.EnforceIdentityBinding + } + return false +} + +type CreateBackendPoolRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + BackendPool *BackendPool `protobuf:"bytes,3,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateBackendPoolRequest) Reset() { + *x = CreateBackendPoolRequest{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateBackendPoolRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateBackendPoolRequest) ProtoMessage() {} + +func (x *CreateBackendPoolRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateBackendPoolRequest.ProtoReflect.Descriptor instead. +func (*CreateBackendPoolRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{16} +} + +func (x *CreateBackendPoolRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateBackendPoolRequest) GetBackendPool() *BackendPool { + if x != nil { + return x.BackendPool + } + return nil +} + +type GetBackendPoolRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBackendPoolRequest) Reset() { + *x = GetBackendPoolRequest{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBackendPoolRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBackendPoolRequest) ProtoMessage() {} + +func (x *GetBackendPoolRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBackendPoolRequest.ProtoReflect.Descriptor instead. +func (*GetBackendPoolRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{17} +} + +func (x *GetBackendPoolRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListBackendPoolsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListBackendPoolsRequest) Reset() { + *x = ListBackendPoolsRequest{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListBackendPoolsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBackendPoolsRequest) ProtoMessage() {} + +func (x *ListBackendPoolsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListBackendPoolsRequest.ProtoReflect.Descriptor instead. +func (*ListBackendPoolsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{18} +} + +func (x *ListBackendPoolsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListBackendPoolsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListBackendPoolsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListBackendPoolsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListBackendPoolsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListBackendPoolsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BackendPools []*BackendPool `protobuf:"bytes,1,rep,name=backend_pools,json=backendPools,proto3" json:"backend_pools,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListBackendPoolsResponse) Reset() { + *x = ListBackendPoolsResponse{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListBackendPoolsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBackendPoolsResponse) ProtoMessage() {} + +func (x *ListBackendPoolsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListBackendPoolsResponse.ProtoReflect.Descriptor instead. +func (*ListBackendPoolsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{19} +} + +func (x *ListBackendPoolsResponse) GetBackendPools() []*BackendPool { + if x != nil { + return x.BackendPools + } + return nil +} + +func (x *ListBackendPoolsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListBackendPoolsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateBackendPoolRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + BackendPool *BackendPool `protobuf:"bytes,1,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateBackendPoolRequest) Reset() { + *x = UpdateBackendPoolRequest{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateBackendPoolRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateBackendPoolRequest) ProtoMessage() {} + +func (x *UpdateBackendPoolRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateBackendPoolRequest.ProtoReflect.Descriptor instead. +func (*UpdateBackendPoolRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{20} +} + +func (x *UpdateBackendPoolRequest) GetBackendPool() *BackendPool { + if x != nil { + return x.BackendPool + } + return nil +} + +func (x *UpdateBackendPoolRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteBackendPoolRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteBackendPoolRequest) Reset() { + *x = DeleteBackendPoolRequest{} + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteBackendPoolRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteBackendPoolRequest) ProtoMessage() {} + +func (x *DeleteBackendPoolRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteBackendPoolRequest.ProtoReflect.Descriptor instead. +func (*DeleteBackendPoolRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP(), []int{21} +} + +func (x *DeleteBackendPoolRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_redpanda_api_aigateway_v1_backend_pool_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_backend_pool_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x63, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, + 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0b, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x66, 0x0a, 0x19, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, + 0x6c, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, + 0x0b, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x17, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x45, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x42, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x0c, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x4c, 0x0a, 0x0b, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x68, 0x74, + 0x74, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x70, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x70, + 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x1a, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, + 0x28, 0x00, 0x52, 0x17, 0x74, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x34, 0x0a, 0x0f, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x0b, 0xba, 0x48, 0x08, 0x1a, 0x06, 0x18, 0x80, 0xa3, 0x05, 0x28, + 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x5c, 0x0a, 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, + 0x2c, 0x0a, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6f, 0x69, 0x64, 0x63, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x4f, 0x69, 0x64, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, + 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x76, 0xea, 0x41, 0x73, 0x0a, + 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x12, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x7d, 0x12, 0x1c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x7d, 0x22, 0x85, 0x06, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x13, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, + 0x12, 0x3c, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x42, + 0x0a, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x74, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x4c, 0x53, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x09, 0x74, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x39, 0x0a, + 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6f, 0x69, + 0x64, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x4f, 0x69, 0x64, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x39, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, + 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x37, 0x0a, 0x15, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x13, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, + 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, + 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x8f, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x3a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x42, 0x0a, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x41, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x53, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x43, 0x0a, 0x03, 0x61, + 0x64, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x61, 0x64, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe4, 0x01, 0x0a, 0x11, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, + 0x0a, 0x13, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x75, 0x6e, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x2b, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x44, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, + 0xb7, 0x01, 0x0a, 0x11, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x68, 0x74, 0x74, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x22, 0x66, 0x0a, 0x0f, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x9e, 0x04, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x64, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x19, + 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x15, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x50, 0x65, 0x72, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x50, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x64, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x69, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x32, 0x0a, 0x15, + 0x74, 0x6c, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6c, 0x73, + 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x32, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x48, 0x74, 0x74, + 0x70, 0x32, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x18, 0x65, 0x6e, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x48, + 0x00, 0x52, 0x16, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x3a, 0x02, 0x18, 0x01, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, 0x01, + 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, + 0x6f, 0x6c, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x57, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xae, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, + 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, + 0x22, 0x5a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x94, 0x02, 0x0a, + 0x15, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, + 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, + 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x27, 0x0a, 0x23, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, + 0x47, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, + 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x30, 0x0a, 0x2c, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, + 0x45, 0x47, 0x59, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x52, 0x4f, 0x55, + 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, + 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x4f, 0x41, + 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x41, + 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x41, 0x4e, 0x44, 0x4f, 0x4d, 0x10, 0x04, 0x12, 0x24, 0x0a, + 0x20, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, + 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x4f, 0x56, 0x45, + 0x52, 0x10, 0x05, 0x2a, 0x64, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x4c, 0x53, 0x5f, 0x56, 0x45, 0x52, 0x49, + 0x46, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x4c, 0x53, 0x5f, 0x56, 0x45, 0x52, + 0x49, 0x46, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x01, 0x12, + 0x18, 0x0a, 0x14, 0x54, 0x4c, 0x53, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x4d, 0x4f, + 0x44, 0x45, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x10, 0x02, 0x2a, 0x68, 0x0a, 0x08, 0x41, 0x75, 0x74, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x14, 0x0a, 0x10, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, + 0x41, 0x52, 0x45, 0x52, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x12, 0x14, 0x0a, + 0x10, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, + 0x4d, 0x10, 0x03, 0x2a, 0x58, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x41, 0x43, 0x4b, 0x45, + 0x4e, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x43, 0x50, 0x10, 0x02, 0x32, 0xea, 0x08, + 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0xde, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x58, 0x3a, 0x0c, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5a, 0x21, 0x3a, 0x0c, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x11, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x25, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x5a, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x2f, 0x2a, 0x7d, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xbf, 0x01, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, + 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, + 0x5a, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x82, 0x02, 0x0a, + 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, + 0x6f, 0x6c, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7b, 0x3a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5a, 0x37, 0x3a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x32, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x32, 0x32, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, + 0x7d, 0x12, 0xcb, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x5a, 0x1c, 0x2a, 0x1a, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2a, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, + 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x85, 0x02, 0x0a, 0x1d, 0x63, + 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, + 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, + 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, + 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, + 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescData = file_redpanda_api_aigateway_v1_backend_pool_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_backend_pool_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_redpanda_api_aigateway_v1_backend_pool_proto_goTypes = []any{ + (LoadBalancingStrategy)(0), // 0: redpanda.api.aigateway.v1.LoadBalancingStrategy + (TLSVerifyMode)(0), // 1: redpanda.api.aigateway.v1.TLSVerifyMode + (AuthType)(0), // 2: redpanda.api.aigateway.v1.AuthType + (BackendType)(0), // 3: redpanda.api.aigateway.v1.BackendType + (*CreateBackendPoolResponse)(nil), // 4: redpanda.api.aigateway.v1.CreateBackendPoolResponse + (*GetBackendPoolResponse)(nil), // 5: redpanda.api.aigateway.v1.GetBackendPoolResponse + (*UpdateBackendPoolResponse)(nil), // 6: redpanda.api.aigateway.v1.UpdateBackendPoolResponse + (*DeleteBackendPoolResponse)(nil), // 7: redpanda.api.aigateway.v1.DeleteBackendPoolResponse + (*BackendPool)(nil), // 8: redpanda.api.aigateway.v1.BackendPool + (*Server)(nil), // 9: redpanda.api.aigateway.v1.Server + (*BalancerConfig)(nil), // 10: redpanda.api.aigateway.v1.BalancerConfig + (*AuthConfig)(nil), // 11: redpanda.api.aigateway.v1.AuthConfig + (*RewriteConfig)(nil), // 12: redpanda.api.aigateway.v1.RewriteConfig + (*PathRewrite)(nil), // 13: redpanda.api.aigateway.v1.PathRewrite + (*HeaderRewrite)(nil), // 14: redpanda.api.aigateway.v1.HeaderRewrite + (*HealthCheckConfig)(nil), // 15: redpanda.api.aigateway.v1.HealthCheckConfig + (*ActiveHealthCheck)(nil), // 16: redpanda.api.aigateway.v1.ActiveHealthCheck + (*HTTPHealthCheck)(nil), // 17: redpanda.api.aigateway.v1.HTTPHealthCheck + (*HTTPClientConfig)(nil), // 18: redpanda.api.aigateway.v1.HTTPClientConfig + (*SessionManagerConfig)(nil), // 19: redpanda.api.aigateway.v1.SessionManagerConfig + (*CreateBackendPoolRequest)(nil), // 20: redpanda.api.aigateway.v1.CreateBackendPoolRequest + (*GetBackendPoolRequest)(nil), // 21: redpanda.api.aigateway.v1.GetBackendPoolRequest + (*ListBackendPoolsRequest)(nil), // 22: redpanda.api.aigateway.v1.ListBackendPoolsRequest + (*ListBackendPoolsResponse)(nil), // 23: redpanda.api.aigateway.v1.ListBackendPoolsResponse + (*UpdateBackendPoolRequest)(nil), // 24: redpanda.api.aigateway.v1.UpdateBackendPoolRequest + (*DeleteBackendPoolRequest)(nil), // 25: redpanda.api.aigateway.v1.DeleteBackendPoolRequest + nil, // 26: redpanda.api.aigateway.v1.BackendPool.MetadataEntry + nil, // 27: redpanda.api.aigateway.v1.Server.EnvEntry + nil, // 28: redpanda.api.aigateway.v1.AuthConfig.HeadersEntry + nil, // 29: redpanda.api.aigateway.v1.HeaderRewrite.SetEntry + nil, // 30: redpanda.api.aigateway.v1.HeaderRewrite.AddEntry + (*timestamppb.Timestamp)(nil), // 31: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 32: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_backend_pool_proto_depIdxs = []int32{ + 8, // 0: redpanda.api.aigateway.v1.CreateBackendPoolResponse.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 8, // 1: redpanda.api.aigateway.v1.GetBackendPoolResponse.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 8, // 2: redpanda.api.aigateway.v1.UpdateBackendPoolResponse.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 10, // 3: redpanda.api.aigateway.v1.BackendPool.balancer:type_name -> redpanda.api.aigateway.v1.BalancerConfig + 9, // 4: redpanda.api.aigateway.v1.BackendPool.servers:type_name -> redpanda.api.aigateway.v1.Server + 12, // 5: redpanda.api.aigateway.v1.BackendPool.rewrite:type_name -> redpanda.api.aigateway.v1.RewriteConfig + 15, // 6: redpanda.api.aigateway.v1.BackendPool.health_check:type_name -> redpanda.api.aigateway.v1.HealthCheckConfig + 18, // 7: redpanda.api.aigateway.v1.BackendPool.http_client:type_name -> redpanda.api.aigateway.v1.HTTPClientConfig + 26, // 8: redpanda.api.aigateway.v1.BackendPool.metadata:type_name -> redpanda.api.aigateway.v1.BackendPool.MetadataEntry + 31, // 9: redpanda.api.aigateway.v1.BackendPool.create_time:type_name -> google.protobuf.Timestamp + 31, // 10: redpanda.api.aigateway.v1.BackendPool.update_time:type_name -> google.protobuf.Timestamp + 3, // 11: redpanda.api.aigateway.v1.BackendPool.backend_type:type_name -> redpanda.api.aigateway.v1.BackendType + 19, // 12: redpanda.api.aigateway.v1.BackendPool.session_manager:type_name -> redpanda.api.aigateway.v1.SessionManagerConfig + 27, // 13: redpanda.api.aigateway.v1.Server.env:type_name -> redpanda.api.aigateway.v1.Server.EnvEntry + 12, // 14: redpanda.api.aigateway.v1.Server.rewrite:type_name -> redpanda.api.aigateway.v1.RewriteConfig + 1, // 15: redpanda.api.aigateway.v1.Server.tls_verify:type_name -> redpanda.api.aigateway.v1.TLSVerifyMode + 11, // 16: redpanda.api.aigateway.v1.Server.auth:type_name -> redpanda.api.aigateway.v1.AuthConfig + 0, // 17: redpanda.api.aigateway.v1.BalancerConfig.strategy:type_name -> redpanda.api.aigateway.v1.LoadBalancingStrategy + 2, // 18: redpanda.api.aigateway.v1.AuthConfig.type:type_name -> redpanda.api.aigateway.v1.AuthType + 28, // 19: redpanda.api.aigateway.v1.AuthConfig.headers:type_name -> redpanda.api.aigateway.v1.AuthConfig.HeadersEntry + 13, // 20: redpanda.api.aigateway.v1.RewriteConfig.path:type_name -> redpanda.api.aigateway.v1.PathRewrite + 14, // 21: redpanda.api.aigateway.v1.RewriteConfig.headers:type_name -> redpanda.api.aigateway.v1.HeaderRewrite + 29, // 22: redpanda.api.aigateway.v1.HeaderRewrite.set:type_name -> redpanda.api.aigateway.v1.HeaderRewrite.SetEntry + 30, // 23: redpanda.api.aigateway.v1.HeaderRewrite.add:type_name -> redpanda.api.aigateway.v1.HeaderRewrite.AddEntry + 16, // 24: redpanda.api.aigateway.v1.HealthCheckConfig.active:type_name -> redpanda.api.aigateway.v1.ActiveHealthCheck + 17, // 25: redpanda.api.aigateway.v1.ActiveHealthCheck.http:type_name -> redpanda.api.aigateway.v1.HTTPHealthCheck + 8, // 26: redpanda.api.aigateway.v1.CreateBackendPoolRequest.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 8, // 27: redpanda.api.aigateway.v1.ListBackendPoolsResponse.backend_pools:type_name -> redpanda.api.aigateway.v1.BackendPool + 8, // 28: redpanda.api.aigateway.v1.UpdateBackendPoolRequest.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 32, // 29: redpanda.api.aigateway.v1.UpdateBackendPoolRequest.update_mask:type_name -> google.protobuf.FieldMask + 20, // 30: redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool:input_type -> redpanda.api.aigateway.v1.CreateBackendPoolRequest + 21, // 31: redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool:input_type -> redpanda.api.aigateway.v1.GetBackendPoolRequest + 22, // 32: redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools:input_type -> redpanda.api.aigateway.v1.ListBackendPoolsRequest + 24, // 33: redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool:input_type -> redpanda.api.aigateway.v1.UpdateBackendPoolRequest + 25, // 34: redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool:input_type -> redpanda.api.aigateway.v1.DeleteBackendPoolRequest + 4, // 35: redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool:output_type -> redpanda.api.aigateway.v1.CreateBackendPoolResponse + 5, // 36: redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool:output_type -> redpanda.api.aigateway.v1.GetBackendPoolResponse + 23, // 37: redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools:output_type -> redpanda.api.aigateway.v1.ListBackendPoolsResponse + 6, // 38: redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool:output_type -> redpanda.api.aigateway.v1.UpdateBackendPoolResponse + 7, // 39: redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool:output_type -> redpanda.api.aigateway.v1.DeleteBackendPoolResponse + 35, // [35:40] is the sub-list for method output_type + 30, // [30:35] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_backend_pool_proto_init() } +func file_redpanda_api_aigateway_v1_backend_pool_proto_init() { + if File_redpanda_api_aigateway_v1_backend_pool_proto != nil { + return + } + file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[5].OneofWrappers = []any{} + file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes[15].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_backend_pool_proto_rawDesc, + NumEnums: 4, + NumMessages: 27, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_backend_pool_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_backend_pool_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_backend_pool_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_backend_pool_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_backend_pool_proto = out.File + file_redpanda_api_aigateway_v1_backend_pool_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_backend_pool_proto_goTypes = nil + file_redpanda_api_aigateway_v1_backend_pool_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.gw.go new file mode 100644 index 0000000000..1d05b447ad --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool.pb.gw.go @@ -0,0 +1,973 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/backend_pool.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_BackendPoolService_CreateBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.CreateBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_CreateBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.CreateBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +var filter_BackendPoolService_CreateBackendPool_1 = &utilities.DoubleArray{Encoding: map[string]int{"backend_pool": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_BackendPoolService_CreateBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateBackendPoolRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_CreateBackendPool_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_CreateBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateBackendPoolRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_CreateBackendPool_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +func request_BackendPoolService_GetBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_GetBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +func request_BackendPoolService_GetBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_GetBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +var filter_BackendPoolService_ListBackendPools_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_BackendPoolService_ListBackendPools_0(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListBackendPoolsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_ListBackendPools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListBackendPools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_ListBackendPools_0(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListBackendPoolsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_ListBackendPools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListBackendPools(ctx, &protoReq) + return msg, metadata, err +} + +var filter_BackendPoolService_ListBackendPools_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_BackendPoolService_ListBackendPools_1(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListBackendPoolsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_ListBackendPools_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListBackendPools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_ListBackendPools_1(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListBackendPoolsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_ListBackendPools_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListBackendPools(ctx, &protoReq) + return msg, metadata, err +} + +var filter_BackendPoolService_UpdateBackendPool_0 = &utilities.DoubleArray{Encoding: map[string]int{"backend_pool": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_BackendPoolService_UpdateBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.BackendPool); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["backend_pool.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "backend_pool.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "backend_pool.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "backend_pool.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_UpdateBackendPool_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_UpdateBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.BackendPool); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["backend_pool.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "backend_pool.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "backend_pool.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "backend_pool.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_UpdateBackendPool_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +var filter_BackendPoolService_UpdateBackendPool_1 = &utilities.DoubleArray{Encoding: map[string]int{"backend_pool": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_BackendPoolService_UpdateBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.BackendPool); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["backend_pool.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "backend_pool.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "backend_pool.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "backend_pool.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_UpdateBackendPool_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_UpdateBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.BackendPool); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.BackendPool); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["backend_pool.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "backend_pool.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "backend_pool.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "backend_pool.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BackendPoolService_UpdateBackendPool_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +func request_BackendPoolService_DeleteBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_DeleteBackendPool_0(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +func request_BackendPoolService_DeleteBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, client BackendPoolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteBackendPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_BackendPoolService_DeleteBackendPool_1(ctx context.Context, marshaler runtime.Marshaler, server BackendPoolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteBackendPoolRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteBackendPool(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterBackendPoolServiceHandlerServer registers the http handlers for service BackendPoolService to "mux". +// UnaryRPC :call BackendPoolServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterBackendPoolServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterBackendPoolServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server BackendPoolServiceServer) error { + mux.Handle(http.MethodPost, pattern_BackendPoolService_CreateBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_CreateBackendPool_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_CreateBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_BackendPoolService_CreateBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool", runtime.WithHTTPPathPattern("/v1/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_CreateBackendPool_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_CreateBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_GetBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_GetBackendPool_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_GetBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_GetBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool", runtime.WithHTTPPathPattern("/v1/{name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_GetBackendPool_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_GetBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_ListBackendPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_ListBackendPools_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_ListBackendPools_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_ListBackendPools_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools", runtime.WithHTTPPathPattern("/v1/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_ListBackendPools_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_ListBackendPools_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_BackendPoolService_UpdateBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool", runtime.WithHTTPPathPattern("/v1/{backend_pool.name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_UpdateBackendPool_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_UpdateBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_BackendPoolService_UpdateBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool", runtime.WithHTTPPathPattern("/v1/{backend_pool.name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_UpdateBackendPool_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_UpdateBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_BackendPoolService_DeleteBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_DeleteBackendPool_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_DeleteBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_BackendPoolService_DeleteBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool", runtime.WithHTTPPathPattern("/v1/{name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BackendPoolService_DeleteBackendPool_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_DeleteBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterBackendPoolServiceHandlerFromEndpoint is same as RegisterBackendPoolServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterBackendPoolServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterBackendPoolServiceHandler(ctx, mux, conn) +} + +// RegisterBackendPoolServiceHandler registers the http handlers for service BackendPoolService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterBackendPoolServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterBackendPoolServiceHandlerClient(ctx, mux, NewBackendPoolServiceClient(conn)) +} + +// RegisterBackendPoolServiceHandlerClient registers the http handlers for service BackendPoolService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "BackendPoolServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "BackendPoolServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "BackendPoolServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterBackendPoolServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client BackendPoolServiceClient) error { + mux.Handle(http.MethodPost, pattern_BackendPoolService_CreateBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_CreateBackendPool_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_CreateBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_BackendPoolService_CreateBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool", runtime.WithHTTPPathPattern("/v1/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_CreateBackendPool_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_CreateBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_GetBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_GetBackendPool_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_GetBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_GetBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool", runtime.WithHTTPPathPattern("/v1/{name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_GetBackendPool_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_GetBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_ListBackendPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_ListBackendPools_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_ListBackendPools_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_BackendPoolService_ListBackendPools_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools", runtime.WithHTTPPathPattern("/v1/backend-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_ListBackendPools_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_ListBackendPools_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_BackendPoolService_UpdateBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool", runtime.WithHTTPPathPattern("/v1/{backend_pool.name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_UpdateBackendPool_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_UpdateBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_BackendPoolService_UpdateBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool", runtime.WithHTTPPathPattern("/v1/{backend_pool.name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_UpdateBackendPool_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_UpdateBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_BackendPoolService_DeleteBackendPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_DeleteBackendPool_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_DeleteBackendPool_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_BackendPoolService_DeleteBackendPool_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool", runtime.WithHTTPPathPattern("/v1/{name=backend-pools/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BackendPoolService_DeleteBackendPool_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_BackendPoolService_DeleteBackendPool_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_BackendPoolService_CreateBackendPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "backend-pools"}, "")) + pattern_BackendPoolService_CreateBackendPool_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "backend-pools"}, "")) + pattern_BackendPoolService_GetBackendPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "backend-pools", "name"}, "")) + pattern_BackendPoolService_GetBackendPool_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "backend-pools", "name"}, "")) + pattern_BackendPoolService_ListBackendPools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "backend-pools"}, "")) + pattern_BackendPoolService_ListBackendPools_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "backend-pools"}, "")) + pattern_BackendPoolService_UpdateBackendPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "backend-pools", "backend_pool.name"}, "")) + pattern_BackendPoolService_UpdateBackendPool_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "backend-pools", "backend_pool.name"}, "")) + pattern_BackendPoolService_DeleteBackendPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "backend-pools", "name"}, "")) + pattern_BackendPoolService_DeleteBackendPool_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "backend-pools", "name"}, "")) +) + +var ( + forward_BackendPoolService_CreateBackendPool_0 = runtime.ForwardResponseMessage + forward_BackendPoolService_CreateBackendPool_1 = runtime.ForwardResponseMessage + forward_BackendPoolService_GetBackendPool_0 = runtime.ForwardResponseMessage + forward_BackendPoolService_GetBackendPool_1 = runtime.ForwardResponseMessage + forward_BackendPoolService_ListBackendPools_0 = runtime.ForwardResponseMessage + forward_BackendPoolService_ListBackendPools_1 = runtime.ForwardResponseMessage + forward_BackendPoolService_UpdateBackendPool_0 = runtime.ForwardResponseMessage + forward_BackendPoolService_UpdateBackendPool_1 = runtime.ForwardResponseMessage + forward_BackendPoolService_DeleteBackendPool_0 = runtime.ForwardResponseMessage + forward_BackendPoolService_DeleteBackendPool_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool_grpc.pb.go new file mode 100644 index 0000000000..fc29cb405b --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/backend_pool_grpc.pb.go @@ -0,0 +1,284 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/backend_pool.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + BackendPoolService_CreateBackendPool_FullMethodName = "/redpanda.api.aigateway.v1.BackendPoolService/CreateBackendPool" + BackendPoolService_GetBackendPool_FullMethodName = "/redpanda.api.aigateway.v1.BackendPoolService/GetBackendPool" + BackendPoolService_ListBackendPools_FullMethodName = "/redpanda.api.aigateway.v1.BackendPoolService/ListBackendPools" + BackendPoolService_UpdateBackendPool_FullMethodName = "/redpanda.api.aigateway.v1.BackendPoolService/UpdateBackendPool" + BackendPoolService_DeleteBackendPool_FullMethodName = "/redpanda.api.aigateway.v1.BackendPoolService/DeleteBackendPool" +) + +// BackendPoolServiceClient is the client API for BackendPoolService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BackendPoolServiceClient interface { + // Creates a new backend pool. + CreateBackendPool(ctx context.Context, in *CreateBackendPoolRequest, opts ...grpc.CallOption) (*CreateBackendPoolResponse, error) + // Gets a backend pool. + GetBackendPool(ctx context.Context, in *GetBackendPoolRequest, opts ...grpc.CallOption) (*GetBackendPoolResponse, error) + // Lists backend pools. + ListBackendPools(ctx context.Context, in *ListBackendPoolsRequest, opts ...grpc.CallOption) (*ListBackendPoolsResponse, error) + // Updates a backend pool. + UpdateBackendPool(ctx context.Context, in *UpdateBackendPoolRequest, opts ...grpc.CallOption) (*UpdateBackendPoolResponse, error) + // Deletes a backend pool. + DeleteBackendPool(ctx context.Context, in *DeleteBackendPoolRequest, opts ...grpc.CallOption) (*DeleteBackendPoolResponse, error) +} + +type backendPoolServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewBackendPoolServiceClient(cc grpc.ClientConnInterface) BackendPoolServiceClient { + return &backendPoolServiceClient{cc} +} + +func (c *backendPoolServiceClient) CreateBackendPool(ctx context.Context, in *CreateBackendPoolRequest, opts ...grpc.CallOption) (*CreateBackendPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateBackendPoolResponse) + err := c.cc.Invoke(ctx, BackendPoolService_CreateBackendPool_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *backendPoolServiceClient) GetBackendPool(ctx context.Context, in *GetBackendPoolRequest, opts ...grpc.CallOption) (*GetBackendPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetBackendPoolResponse) + err := c.cc.Invoke(ctx, BackendPoolService_GetBackendPool_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *backendPoolServiceClient) ListBackendPools(ctx context.Context, in *ListBackendPoolsRequest, opts ...grpc.CallOption) (*ListBackendPoolsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListBackendPoolsResponse) + err := c.cc.Invoke(ctx, BackendPoolService_ListBackendPools_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *backendPoolServiceClient) UpdateBackendPool(ctx context.Context, in *UpdateBackendPoolRequest, opts ...grpc.CallOption) (*UpdateBackendPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateBackendPoolResponse) + err := c.cc.Invoke(ctx, BackendPoolService_UpdateBackendPool_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *backendPoolServiceClient) DeleteBackendPool(ctx context.Context, in *DeleteBackendPoolRequest, opts ...grpc.CallOption) (*DeleteBackendPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteBackendPoolResponse) + err := c.cc.Invoke(ctx, BackendPoolService_DeleteBackendPool_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BackendPoolServiceServer is the server API for BackendPoolService service. +// All implementations must embed UnimplementedBackendPoolServiceServer +// for forward compatibility. +type BackendPoolServiceServer interface { + // Creates a new backend pool. + CreateBackendPool(context.Context, *CreateBackendPoolRequest) (*CreateBackendPoolResponse, error) + // Gets a backend pool. + GetBackendPool(context.Context, *GetBackendPoolRequest) (*GetBackendPoolResponse, error) + // Lists backend pools. + ListBackendPools(context.Context, *ListBackendPoolsRequest) (*ListBackendPoolsResponse, error) + // Updates a backend pool. + UpdateBackendPool(context.Context, *UpdateBackendPoolRequest) (*UpdateBackendPoolResponse, error) + // Deletes a backend pool. + DeleteBackendPool(context.Context, *DeleteBackendPoolRequest) (*DeleteBackendPoolResponse, error) + mustEmbedUnimplementedBackendPoolServiceServer() +} + +// UnimplementedBackendPoolServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBackendPoolServiceServer struct{} + +func (UnimplementedBackendPoolServiceServer) CreateBackendPool(context.Context, *CreateBackendPoolRequest) (*CreateBackendPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateBackendPool not implemented") +} +func (UnimplementedBackendPoolServiceServer) GetBackendPool(context.Context, *GetBackendPoolRequest) (*GetBackendPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetBackendPool not implemented") +} +func (UnimplementedBackendPoolServiceServer) ListBackendPools(context.Context, *ListBackendPoolsRequest) (*ListBackendPoolsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListBackendPools not implemented") +} +func (UnimplementedBackendPoolServiceServer) UpdateBackendPool(context.Context, *UpdateBackendPoolRequest) (*UpdateBackendPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateBackendPool not implemented") +} +func (UnimplementedBackendPoolServiceServer) DeleteBackendPool(context.Context, *DeleteBackendPoolRequest) (*DeleteBackendPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteBackendPool not implemented") +} +func (UnimplementedBackendPoolServiceServer) mustEmbedUnimplementedBackendPoolServiceServer() {} +func (UnimplementedBackendPoolServiceServer) testEmbeddedByValue() {} + +// UnsafeBackendPoolServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BackendPoolServiceServer will +// result in compilation errors. +type UnsafeBackendPoolServiceServer interface { + mustEmbedUnimplementedBackendPoolServiceServer() +} + +func RegisterBackendPoolServiceServer(s grpc.ServiceRegistrar, srv BackendPoolServiceServer) { + // If the following call pancis, it indicates UnimplementedBackendPoolServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&BackendPoolService_ServiceDesc, srv) +} + +func _BackendPoolService_CreateBackendPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateBackendPoolRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendPoolServiceServer).CreateBackendPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BackendPoolService_CreateBackendPool_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendPoolServiceServer).CreateBackendPool(ctx, req.(*CreateBackendPoolRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BackendPoolService_GetBackendPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetBackendPoolRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendPoolServiceServer).GetBackendPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BackendPoolService_GetBackendPool_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendPoolServiceServer).GetBackendPool(ctx, req.(*GetBackendPoolRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BackendPoolService_ListBackendPools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListBackendPoolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendPoolServiceServer).ListBackendPools(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BackendPoolService_ListBackendPools_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendPoolServiceServer).ListBackendPools(ctx, req.(*ListBackendPoolsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BackendPoolService_UpdateBackendPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBackendPoolRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendPoolServiceServer).UpdateBackendPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BackendPoolService_UpdateBackendPool_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendPoolServiceServer).UpdateBackendPool(ctx, req.(*UpdateBackendPoolRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BackendPoolService_DeleteBackendPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteBackendPoolRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendPoolServiceServer).DeleteBackendPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BackendPoolService_DeleteBackendPool_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendPoolServiceServer).DeleteBackendPool(ctx, req.(*DeleteBackendPoolRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// BackendPoolService_ServiceDesc is the grpc.ServiceDesc for BackendPoolService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BackendPoolService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.BackendPoolService", + HandlerType: (*BackendPoolServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateBackendPool", + Handler: _BackendPoolService_CreateBackendPool_Handler, + }, + { + MethodName: "GetBackendPool", + Handler: _BackendPoolService_GetBackendPool_Handler, + }, + { + MethodName: "ListBackendPools", + Handler: _BackendPoolService_ListBackendPools_Handler, + }, + { + MethodName: "UpdateBackendPool", + Handler: _BackendPoolService_UpdateBackendPool_Handler, + }, + { + MethodName: "DeleteBackendPool", + Handler: _BackendPoolService_DeleteBackendPool_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/backend_pool.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.go new file mode 100644 index 0000000000..026ad213ba --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.go @@ -0,0 +1,1946 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/config.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ConfigurationStatus int32 + +const ( + ConfigurationStatus_CONFIGURATION_STATUS_UNSPECIFIED ConfigurationStatus = 0 + ConfigurationStatus_CONFIGURATION_STATUS_DRAFT ConfigurationStatus = 1 + ConfigurationStatus_CONFIGURATION_STATUS_STAGED ConfigurationStatus = 2 + ConfigurationStatus_CONFIGURATION_STATUS_PUBLISHED ConfigurationStatus = 3 + ConfigurationStatus_CONFIGURATION_STATUS_DEPLOYED ConfigurationStatus = 4 + ConfigurationStatus_CONFIGURATION_STATUS_RELEASED ConfigurationStatus = 5 + ConfigurationStatus_CONFIGURATION_STATUS_SUPERSEDED ConfigurationStatus = 6 +) + +// Enum value maps for ConfigurationStatus. +var ( + ConfigurationStatus_name = map[int32]string{ + 0: "CONFIGURATION_STATUS_UNSPECIFIED", + 1: "CONFIGURATION_STATUS_DRAFT", + 2: "CONFIGURATION_STATUS_STAGED", + 3: "CONFIGURATION_STATUS_PUBLISHED", + 4: "CONFIGURATION_STATUS_DEPLOYED", + 5: "CONFIGURATION_STATUS_RELEASED", + 6: "CONFIGURATION_STATUS_SUPERSEDED", + } + ConfigurationStatus_value = map[string]int32{ + "CONFIGURATION_STATUS_UNSPECIFIED": 0, + "CONFIGURATION_STATUS_DRAFT": 1, + "CONFIGURATION_STATUS_STAGED": 2, + "CONFIGURATION_STATUS_PUBLISHED": 3, + "CONFIGURATION_STATUS_DEPLOYED": 4, + "CONFIGURATION_STATUS_RELEASED": 5, + "CONFIGURATION_STATUS_SUPERSEDED": 6, + } +) + +func (x ConfigurationStatus) Enum() *ConfigurationStatus { + p := new(ConfigurationStatus) + *p = x + return p +} + +func (x ConfigurationStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConfigurationStatus) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_config_proto_enumTypes[0].Descriptor() +} + +func (ConfigurationStatus) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_config_proto_enumTypes[0] +} + +func (x ConfigurationStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConfigurationStatus.Descriptor instead. +func (ConfigurationStatus) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{0} +} + +// Response message for StageConfiguration RPC. +type StageConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StageConfigurationResponse) Reset() { + *x = StageConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StageConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StageConfigurationResponse) ProtoMessage() {} + +func (x *StageConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StageConfigurationResponse.ProtoReflect.Descriptor instead. +func (*StageConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{0} +} + +func (x *StageConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for PublishConfiguration RPC. +type PublishConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PublishConfigurationResponse) Reset() { + *x = PublishConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PublishConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublishConfigurationResponse) ProtoMessage() {} + +func (x *PublishConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublishConfigurationResponse.ProtoReflect.Descriptor instead. +func (*PublishConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{1} +} + +func (x *PublishConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for DeployConfiguration RPC. +type DeployConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeployConfigurationResponse) Reset() { + *x = DeployConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeployConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeployConfigurationResponse) ProtoMessage() {} + +func (x *DeployConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeployConfigurationResponse.ProtoReflect.Descriptor instead. +func (*DeployConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{2} +} + +func (x *DeployConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for ReleaseConfiguration RPC. +type ReleaseConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReleaseConfigurationResponse) Reset() { + *x = ReleaseConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReleaseConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReleaseConfigurationResponse) ProtoMessage() {} + +func (x *ReleaseConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReleaseConfigurationResponse.ProtoReflect.Descriptor instead. +func (*ReleaseConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{3} +} + +func (x *ReleaseConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for RollbackConfiguration RPC. +type RollbackConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RollbackConfigurationResponse) Reset() { + *x = RollbackConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RollbackConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RollbackConfigurationResponse) ProtoMessage() {} + +func (x *RollbackConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RollbackConfigurationResponse.ProtoReflect.Descriptor instead. +func (*RollbackConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{4} +} + +func (x *RollbackConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for GetConfiguration RPC. +type GetConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetConfigurationResponse) Reset() { + *x = GetConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigurationResponse) ProtoMessage() {} + +func (x *GetConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConfigurationResponse.ProtoReflect.Descriptor instead. +func (*GetConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{5} +} + +func (x *GetConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Response message for GetActiveConfiguration RPC. +type GetActiveConfigurationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configuration *Configuration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetActiveConfigurationResponse) Reset() { + *x = GetActiveConfigurationResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetActiveConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveConfigurationResponse) ProtoMessage() {} + +func (x *GetActiveConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetActiveConfigurationResponse.ProtoReflect.Descriptor instead. +func (*GetActiveConfigurationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{6} +} + +func (x *GetActiveConfigurationResponse) GetConfiguration() *Configuration { + if x != nil { + return x.Configuration + } + return nil +} + +// Configuration represents an immutable configuration version. +type Configuration struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `gateways/{gateway}/configurations/{configuration}` or `configurations/{configuration}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Semantic version tag (e.g., "v1.0.0") + VersionTag string `protobuf:"bytes,2,opt,name=version_tag,json=versionTag,proto3" json:"version_tag,omitempty"` + // Output only. Assembled YAML configuration + ConfigYaml string `protobuf:"bytes,3,opt,name=config_yaml,json=configYaml,proto3" json:"config_yaml,omitempty"` + // Output only. SHA-256 hash of config_yaml + ConfigHash string `protobuf:"bytes,4,opt,name=config_hash,json=configHash,proto3" json:"config_hash,omitempty"` + // Output only. CUE schema version used for validation + SchemaVersion string `protobuf:"bytes,5,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + // Parent configuration (for lineage tracking) + Parent string `protobuf:"bytes,6,opt,name=parent,proto3" json:"parent,omitempty"` + // Current status + Status ConfigurationStatus `protobuf:"varint,7,opt,name=status,proto3,enum=redpanda.api.aigateway.v1.ConfigurationStatus" json:"status,omitempty"` + // Whether this is the active configuration + IsActive bool `protobuf:"varint,8,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"` + // Optional description + Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"` + // Output only. Snapshot of entity names included + EntitiesSnapshot map[string]*EntitySnapshot `protobuf:"bytes,10,rep,name=entities_snapshot,json=entitiesSnapshot,proto3" json:"entities_snapshot,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Metadata + Metadata map[string]string `protobuf:"bytes,11,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Creator's OIDC subject + Creator string `protobuf:"bytes,13,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Lifecycle timestamps + StagedTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=staged_time,json=stagedTime,proto3" json:"staged_time,omitempty"` + PublishedTime *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=published_time,json=publishedTime,proto3" json:"published_time,omitempty"` + DeployedTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=deployed_time,json=deployedTime,proto3" json:"deployed_time,omitempty"` + ReleasedTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=released_time,json=releasedTime,proto3" json:"released_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Configuration) Reset() { + *x = Configuration{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Configuration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Configuration) ProtoMessage() {} + +func (x *Configuration) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Configuration.ProtoReflect.Descriptor instead. +func (*Configuration) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{7} +} + +func (x *Configuration) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Configuration) GetVersionTag() string { + if x != nil { + return x.VersionTag + } + return "" +} + +func (x *Configuration) GetConfigYaml() string { + if x != nil { + return x.ConfigYaml + } + return "" +} + +func (x *Configuration) GetConfigHash() string { + if x != nil { + return x.ConfigHash + } + return "" +} + +func (x *Configuration) GetSchemaVersion() string { + if x != nil { + return x.SchemaVersion + } + return "" +} + +func (x *Configuration) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *Configuration) GetStatus() ConfigurationStatus { + if x != nil { + return x.Status + } + return ConfigurationStatus_CONFIGURATION_STATUS_UNSPECIFIED +} + +func (x *Configuration) GetIsActive() bool { + if x != nil { + return x.IsActive + } + return false +} + +func (x *Configuration) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Configuration) GetEntitiesSnapshot() map[string]*EntitySnapshot { + if x != nil { + return x.EntitiesSnapshot + } + return nil +} + +func (x *Configuration) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Configuration) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Configuration) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Configuration) GetStagedTime() *timestamppb.Timestamp { + if x != nil { + return x.StagedTime + } + return nil +} + +func (x *Configuration) GetPublishedTime() *timestamppb.Timestamp { + if x != nil { + return x.PublishedTime + } + return nil +} + +func (x *Configuration) GetDeployedTime() *timestamppb.Timestamp { + if x != nil { + return x.DeployedTime + } + return nil +} + +func (x *Configuration) GetReleasedTime() *timestamppb.Timestamp { + if x != nil { + return x.ReleasedTime + } + return nil +} + +type EntitySnapshot struct { + state protoimpl.MessageState `protogen:"open.v1"` + EntityType string `protobuf:"bytes,1,opt,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"` + EntityNames []string `protobuf:"bytes,2,rep,name=entity_names,json=entityNames,proto3" json:"entity_names,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntitySnapshot) Reset() { + *x = EntitySnapshot{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntitySnapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntitySnapshot) ProtoMessage() {} + +func (x *EntitySnapshot) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntitySnapshot.ProtoReflect.Descriptor instead. +func (*EntitySnapshot) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{8} +} + +func (x *EntitySnapshot) GetEntityType() string { + if x != nil { + return x.EntityType + } + return "" +} + +func (x *EntitySnapshot) GetEntityNames() []string { + if x != nil { + return x.EntityNames + } + return nil +} + +type ValidationResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + IsValid bool `protobuf:"varint,1,opt,name=is_valid,json=isValid,proto3" json:"is_valid,omitempty"` + Errors []string `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` + Warnings []string `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` + SchemaVersion string `protobuf:"bytes,4,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidationResult) Reset() { + *x = ValidationResult{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidationResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidationResult) ProtoMessage() {} + +func (x *ValidationResult) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidationResult.ProtoReflect.Descriptor instead. +func (*ValidationResult) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{9} +} + +func (x *ValidationResult) GetIsValid() bool { + if x != nil { + return x.IsValid + } + return false +} + +func (x *ValidationResult) GetErrors() []string { + if x != nil { + return x.Errors + } + return nil +} + +func (x *ValidationResult) GetWarnings() []string { + if x != nil { + return x.Warnings + } + return nil +} + +func (x *ValidationResult) GetSchemaVersion() string { + if x != nil { + return x.SchemaVersion + } + return "" +} + +type DistributionResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DistributionResult) Reset() { + *x = DistributionResult{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DistributionResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DistributionResult) ProtoMessage() {} + +func (x *DistributionResult) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DistributionResult.ProtoReflect.Descriptor instead. +func (*DistributionResult) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{10} +} + +func (x *DistributionResult) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *DistributionResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *DistributionResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type DeploymentResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + GatewayInstance string `protobuf:"bytes,1,opt,name=gateway_instance,json=gatewayInstance,proto3" json:"gateway_instance,omitempty"` + Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeploymentResult) Reset() { + *x = DeploymentResult{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeploymentResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeploymentResult) ProtoMessage() {} + +func (x *DeploymentResult) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeploymentResult.ProtoReflect.Descriptor instead. +func (*DeploymentResult) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{11} +} + +func (x *DeploymentResult) GetGatewayInstance() string { + if x != nil { + return x.GatewayInstance + } + return "" +} + +func (x *DeploymentResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *DeploymentResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type ReleaseResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + GatewayInstance string `protobuf:"bytes,1,opt,name=gateway_instance,json=gatewayInstance,proto3" json:"gateway_instance,omitempty"` + Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + SchemaCompatible bool `protobuf:"varint,4,opt,name=schema_compatible,json=schemaCompatible,proto3" json:"schema_compatible,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReleaseResult) Reset() { + *x = ReleaseResult{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReleaseResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReleaseResult) ProtoMessage() {} + +func (x *ReleaseResult) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReleaseResult.ProtoReflect.Descriptor instead. +func (*ReleaseResult) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{12} +} + +func (x *ReleaseResult) GetGatewayInstance() string { + if x != nil { + return x.GatewayInstance + } + return "" +} + +func (x *ReleaseResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *ReleaseResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *ReleaseResult) GetSchemaCompatible() bool { + if x != nil { + return x.SchemaCompatible + } + return false +} + +type StageConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + VersionTag string `protobuf:"bytes,2,opt,name=version_tag,json=versionTag,proto3" json:"version_tag,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StageConfigurationRequest) Reset() { + *x = StageConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StageConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StageConfigurationRequest) ProtoMessage() {} + +func (x *StageConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StageConfigurationRequest.ProtoReflect.Descriptor instead. +func (*StageConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{13} +} + +func (x *StageConfigurationRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *StageConfigurationRequest) GetVersionTag() string { + if x != nil { + return x.VersionTag + } + return "" +} + +func (x *StageConfigurationRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *StageConfigurationRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +type PublishConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DistributionTargets []string `protobuf:"bytes,2,rep,name=distribution_targets,json=distributionTargets,proto3" json:"distribution_targets,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PublishConfigurationRequest) Reset() { + *x = PublishConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PublishConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublishConfigurationRequest) ProtoMessage() {} + +func (x *PublishConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublishConfigurationRequest.ProtoReflect.Descriptor instead. +func (*PublishConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{14} +} + +func (x *PublishConfigurationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PublishConfigurationRequest) GetDistributionTargets() []string { + if x != nil { + return x.DistributionTargets + } + return nil +} + +type DeployConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TargetGateways []string `protobuf:"bytes,2,rep,name=target_gateways,json=targetGateways,proto3" json:"target_gateways,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeployConfigurationRequest) Reset() { + *x = DeployConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeployConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeployConfigurationRequest) ProtoMessage() {} + +func (x *DeployConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeployConfigurationRequest.ProtoReflect.Descriptor instead. +func (*DeployConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{15} +} + +func (x *DeployConfigurationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeployConfigurationRequest) GetTargetGateways() []string { + if x != nil { + return x.TargetGateways + } + return nil +} + +type ReleaseConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TargetGateways []string `protobuf:"bytes,2,rep,name=target_gateways,json=targetGateways,proto3" json:"target_gateways,omitempty"` + GracefulReload bool `protobuf:"varint,3,opt,name=graceful_reload,json=gracefulReload,proto3" json:"graceful_reload,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReleaseConfigurationRequest) Reset() { + *x = ReleaseConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReleaseConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReleaseConfigurationRequest) ProtoMessage() {} + +func (x *ReleaseConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReleaseConfigurationRequest.ProtoReflect.Descriptor instead. +func (*ReleaseConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{16} +} + +func (x *ReleaseConfigurationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ReleaseConfigurationRequest) GetTargetGateways() []string { + if x != nil { + return x.TargetGateways + } + return nil +} + +func (x *ReleaseConfigurationRequest) GetGracefulReload() bool { + if x != nil { + return x.GracefulReload + } + return false +} + +type RollbackConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TargetConfiguration string `protobuf:"bytes,2,opt,name=target_configuration,json=targetConfiguration,proto3" json:"target_configuration,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RollbackConfigurationRequest) Reset() { + *x = RollbackConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RollbackConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RollbackConfigurationRequest) ProtoMessage() {} + +func (x *RollbackConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RollbackConfigurationRequest.ProtoReflect.Descriptor instead. +func (*RollbackConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{17} +} + +func (x *RollbackConfigurationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RollbackConfigurationRequest) GetTargetConfiguration() string { + if x != nil { + return x.TargetConfiguration + } + return "" +} + +func (x *RollbackConfigurationRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type GetConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetConfigurationRequest) Reset() { + *x = GetConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigurationRequest) ProtoMessage() {} + +func (x *GetConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConfigurationRequest.ProtoReflect.Descriptor instead. +func (*GetConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{18} +} + +func (x *GetConfigurationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListConfigurationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListConfigurationsRequest) Reset() { + *x = ListConfigurationsRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListConfigurationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListConfigurationsRequest) ProtoMessage() {} + +func (x *ListConfigurationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListConfigurationsRequest.ProtoReflect.Descriptor instead. +func (*ListConfigurationsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{19} +} + +func (x *ListConfigurationsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListConfigurationsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListConfigurationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListConfigurationsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListConfigurationsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListConfigurationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Configurations []*Configuration `protobuf:"bytes,1,rep,name=configurations,proto3" json:"configurations,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListConfigurationsResponse) Reset() { + *x = ListConfigurationsResponse{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListConfigurationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListConfigurationsResponse) ProtoMessage() {} + +func (x *ListConfigurationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListConfigurationsResponse.ProtoReflect.Descriptor instead. +func (*ListConfigurationsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{20} +} + +func (x *ListConfigurationsResponse) GetConfigurations() []*Configuration { + if x != nil { + return x.Configurations + } + return nil +} + +func (x *ListConfigurationsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListConfigurationsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type GetActiveConfigurationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetActiveConfigurationRequest) Reset() { + *x = GetActiveConfigurationRequest{} + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetActiveConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveConfigurationRequest) ProtoMessage() {} + +func (x *GetActiveConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_config_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetActiveConfigurationRequest.ProtoReflect.Descriptor instead. +func (*GetActiveConfigurationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP(), []int{21} +} + +func (x *GetActiveConfigurationRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +var File_redpanda_api_aigateway_v1_config_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_config_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, + 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x1c, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6d, 0x0a, 0x1b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x1c, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x1d, 0x52, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x0a, 0x0a, 0x0d, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x59, 0x61, 0x6d, + 0x6c, 0x12, 0x24, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x29, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x69, 0x73, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x11, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x10, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x40, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x46, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, + 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x6e, 0x0a, 0x15, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x3a, 0x7c, 0xea, 0x41, 0x79, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, + 0x1e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x22, + 0x54, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x5c, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6d, + 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x97, 0x01, + 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x29, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, + 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x61, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x1b, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xe3, 0x01, 0x0a, 0x1c, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x14, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xb5, 0x01, + 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2a, 0x8b, 0x02, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x46, 0x54, 0x10, + 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x44, + 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x44, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, 0x10, + 0x06, 0x32, 0xa8, 0x0e, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0xd9, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x3a, + 0x01, 0x2a, 0x5a, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, + 0xec, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x5d, 0x3a, 0x01, 0x2a, 0x5a, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x22, 0x2e, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0xe7, + 0x01, 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5b, 0x3a, 0x01, 0x2a, + 0x5a, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x2a, 0x7d, 0x3a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x7d, 0x3a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0xec, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x3a, 0x01, 0x2a, 0x5a, 0x28, 0x3a, + 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0xf1, 0x01, 0x0a, 0x15, 0x52, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5f, 0x3a, 0x01, 0x2a, 0x5a, + 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x7d, 0x3a, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x2a, 0x7d, 0x3a, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xca, 0x01, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x47, 0x5a, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc7, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x3e, 0x5a, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xe7, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x5a, 0x1e, 0x12, 0x1c, 0x2f, 0x76, + 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x3a, 0x67, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x30, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x3a, 0x67, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x80, 0x02, 0x0a, + 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, + 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, + 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_config_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_config_proto_rawDescData = file_redpanda_api_aigateway_v1_config_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_config_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_config_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_config_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_config_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_config_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_redpanda_api_aigateway_v1_config_proto_goTypes = []any{ + (ConfigurationStatus)(0), // 0: redpanda.api.aigateway.v1.ConfigurationStatus + (*StageConfigurationResponse)(nil), // 1: redpanda.api.aigateway.v1.StageConfigurationResponse + (*PublishConfigurationResponse)(nil), // 2: redpanda.api.aigateway.v1.PublishConfigurationResponse + (*DeployConfigurationResponse)(nil), // 3: redpanda.api.aigateway.v1.DeployConfigurationResponse + (*ReleaseConfigurationResponse)(nil), // 4: redpanda.api.aigateway.v1.ReleaseConfigurationResponse + (*RollbackConfigurationResponse)(nil), // 5: redpanda.api.aigateway.v1.RollbackConfigurationResponse + (*GetConfigurationResponse)(nil), // 6: redpanda.api.aigateway.v1.GetConfigurationResponse + (*GetActiveConfigurationResponse)(nil), // 7: redpanda.api.aigateway.v1.GetActiveConfigurationResponse + (*Configuration)(nil), // 8: redpanda.api.aigateway.v1.Configuration + (*EntitySnapshot)(nil), // 9: redpanda.api.aigateway.v1.EntitySnapshot + (*ValidationResult)(nil), // 10: redpanda.api.aigateway.v1.ValidationResult + (*DistributionResult)(nil), // 11: redpanda.api.aigateway.v1.DistributionResult + (*DeploymentResult)(nil), // 12: redpanda.api.aigateway.v1.DeploymentResult + (*ReleaseResult)(nil), // 13: redpanda.api.aigateway.v1.ReleaseResult + (*StageConfigurationRequest)(nil), // 14: redpanda.api.aigateway.v1.StageConfigurationRequest + (*PublishConfigurationRequest)(nil), // 15: redpanda.api.aigateway.v1.PublishConfigurationRequest + (*DeployConfigurationRequest)(nil), // 16: redpanda.api.aigateway.v1.DeployConfigurationRequest + (*ReleaseConfigurationRequest)(nil), // 17: redpanda.api.aigateway.v1.ReleaseConfigurationRequest + (*RollbackConfigurationRequest)(nil), // 18: redpanda.api.aigateway.v1.RollbackConfigurationRequest + (*GetConfigurationRequest)(nil), // 19: redpanda.api.aigateway.v1.GetConfigurationRequest + (*ListConfigurationsRequest)(nil), // 20: redpanda.api.aigateway.v1.ListConfigurationsRequest + (*ListConfigurationsResponse)(nil), // 21: redpanda.api.aigateway.v1.ListConfigurationsResponse + (*GetActiveConfigurationRequest)(nil), // 22: redpanda.api.aigateway.v1.GetActiveConfigurationRequest + nil, // 23: redpanda.api.aigateway.v1.Configuration.EntitiesSnapshotEntry + nil, // 24: redpanda.api.aigateway.v1.Configuration.MetadataEntry + nil, // 25: redpanda.api.aigateway.v1.StageConfigurationRequest.MetadataEntry + (*timestamppb.Timestamp)(nil), // 26: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_config_proto_depIdxs = []int32{ + 8, // 0: redpanda.api.aigateway.v1.StageConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 1: redpanda.api.aigateway.v1.PublishConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 2: redpanda.api.aigateway.v1.DeployConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 3: redpanda.api.aigateway.v1.ReleaseConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 4: redpanda.api.aigateway.v1.RollbackConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 5: redpanda.api.aigateway.v1.GetConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 8, // 6: redpanda.api.aigateway.v1.GetActiveConfigurationResponse.configuration:type_name -> redpanda.api.aigateway.v1.Configuration + 0, // 7: redpanda.api.aigateway.v1.Configuration.status:type_name -> redpanda.api.aigateway.v1.ConfigurationStatus + 23, // 8: redpanda.api.aigateway.v1.Configuration.entities_snapshot:type_name -> redpanda.api.aigateway.v1.Configuration.EntitiesSnapshotEntry + 24, // 9: redpanda.api.aigateway.v1.Configuration.metadata:type_name -> redpanda.api.aigateway.v1.Configuration.MetadataEntry + 26, // 10: redpanda.api.aigateway.v1.Configuration.create_time:type_name -> google.protobuf.Timestamp + 26, // 11: redpanda.api.aigateway.v1.Configuration.staged_time:type_name -> google.protobuf.Timestamp + 26, // 12: redpanda.api.aigateway.v1.Configuration.published_time:type_name -> google.protobuf.Timestamp + 26, // 13: redpanda.api.aigateway.v1.Configuration.deployed_time:type_name -> google.protobuf.Timestamp + 26, // 14: redpanda.api.aigateway.v1.Configuration.released_time:type_name -> google.protobuf.Timestamp + 25, // 15: redpanda.api.aigateway.v1.StageConfigurationRequest.metadata:type_name -> redpanda.api.aigateway.v1.StageConfigurationRequest.MetadataEntry + 8, // 16: redpanda.api.aigateway.v1.ListConfigurationsResponse.configurations:type_name -> redpanda.api.aigateway.v1.Configuration + 9, // 17: redpanda.api.aigateway.v1.Configuration.EntitiesSnapshotEntry.value:type_name -> redpanda.api.aigateway.v1.EntitySnapshot + 14, // 18: redpanda.api.aigateway.v1.ConfigService.StageConfiguration:input_type -> redpanda.api.aigateway.v1.StageConfigurationRequest + 15, // 19: redpanda.api.aigateway.v1.ConfigService.PublishConfiguration:input_type -> redpanda.api.aigateway.v1.PublishConfigurationRequest + 16, // 20: redpanda.api.aigateway.v1.ConfigService.DeployConfiguration:input_type -> redpanda.api.aigateway.v1.DeployConfigurationRequest + 17, // 21: redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration:input_type -> redpanda.api.aigateway.v1.ReleaseConfigurationRequest + 18, // 22: redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration:input_type -> redpanda.api.aigateway.v1.RollbackConfigurationRequest + 19, // 23: redpanda.api.aigateway.v1.ConfigService.GetConfiguration:input_type -> redpanda.api.aigateway.v1.GetConfigurationRequest + 20, // 24: redpanda.api.aigateway.v1.ConfigService.ListConfigurations:input_type -> redpanda.api.aigateway.v1.ListConfigurationsRequest + 22, // 25: redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration:input_type -> redpanda.api.aigateway.v1.GetActiveConfigurationRequest + 1, // 26: redpanda.api.aigateway.v1.ConfigService.StageConfiguration:output_type -> redpanda.api.aigateway.v1.StageConfigurationResponse + 2, // 27: redpanda.api.aigateway.v1.ConfigService.PublishConfiguration:output_type -> redpanda.api.aigateway.v1.PublishConfigurationResponse + 3, // 28: redpanda.api.aigateway.v1.ConfigService.DeployConfiguration:output_type -> redpanda.api.aigateway.v1.DeployConfigurationResponse + 4, // 29: redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration:output_type -> redpanda.api.aigateway.v1.ReleaseConfigurationResponse + 5, // 30: redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration:output_type -> redpanda.api.aigateway.v1.RollbackConfigurationResponse + 6, // 31: redpanda.api.aigateway.v1.ConfigService.GetConfiguration:output_type -> redpanda.api.aigateway.v1.GetConfigurationResponse + 21, // 32: redpanda.api.aigateway.v1.ConfigService.ListConfigurations:output_type -> redpanda.api.aigateway.v1.ListConfigurationsResponse + 7, // 33: redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration:output_type -> redpanda.api.aigateway.v1.GetActiveConfigurationResponse + 26, // [26:34] is the sub-list for method output_type + 18, // [18:26] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_config_proto_init() } +func file_redpanda_api_aigateway_v1_config_proto_init() { + if File_redpanda_api_aigateway_v1_config_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_config_proto_rawDesc, + NumEnums: 1, + NumMessages: 25, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_config_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_config_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_config_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_config_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_config_proto = out.File + file_redpanda_api_aigateway_v1_config_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_config_proto_goTypes = nil + file_redpanda_api_aigateway_v1_config_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.gw.go new file mode 100644 index 0000000000..91b1334494 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/config.pb.gw.go @@ -0,0 +1,1387 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/config.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_ConfigService_StageConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq StageConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.StageConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_StageConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq StageConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.StageConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_StageConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq StageConfigurationRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.StageConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_StageConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq StageConfigurationRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.StageConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_PublishConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq PublishConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.PublishConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_PublishConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq PublishConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.PublishConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_PublishConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq PublishConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.PublishConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_PublishConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq PublishConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.PublishConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_DeployConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeployConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeployConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_DeployConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeployConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeployConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_DeployConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeployConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeployConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_DeployConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeployConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeployConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_ReleaseConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ReleaseConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.ReleaseConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_ReleaseConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ReleaseConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.ReleaseConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_ReleaseConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ReleaseConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.ReleaseConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_ReleaseConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ReleaseConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.ReleaseConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_RollbackConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RollbackConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RollbackConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_RollbackConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RollbackConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RollbackConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_RollbackConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RollbackConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RollbackConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_RollbackConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RollbackConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RollbackConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_GetConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_GetConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_GetConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_GetConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ConfigService_ListConfigurations_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ConfigService_ListConfigurations_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListConfigurationsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_ListConfigurations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListConfigurations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_ListConfigurations_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListConfigurationsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_ListConfigurations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListConfigurations(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ConfigService_ListConfigurations_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ConfigService_ListConfigurations_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListConfigurationsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_ListConfigurations_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListConfigurations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_ListConfigurations_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListConfigurationsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_ListConfigurations_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListConfigurations(ctx, &protoReq) + return msg, metadata, err +} + +func request_ConfigService_GetActiveConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetActiveConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.GetActiveConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_GetActiveConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetActiveConfigurationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.GetActiveConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ConfigService_GetActiveConfiguration_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ConfigService_GetActiveConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetActiveConfigurationRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_GetActiveConfiguration_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetActiveConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ConfigService_GetActiveConfiguration_1(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetActiveConfigurationRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigService_GetActiveConfiguration_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetActiveConfiguration(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterConfigServiceHandlerServer registers the http handlers for service ConfigService to "mux". +// UnaryRPC :call ConfigServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterConfigServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterConfigServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConfigServiceServer) error { + mux.Handle(http.MethodPost, pattern_ConfigService_StageConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations:stage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_StageConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_StageConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_StageConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration", runtime.WithHTTPPathPattern("/v1/configurations:stage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_StageConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_StageConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_PublishConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:publish")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_PublishConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_PublishConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_PublishConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:publish")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_PublishConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_PublishConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_DeployConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:deploy")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_DeployConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_DeployConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_DeployConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:deploy")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_DeployConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_DeployConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_ReleaseConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:release")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_ReleaseConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ReleaseConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_ReleaseConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:release")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_ReleaseConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ReleaseConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_RollbackConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_RollbackConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_RollbackConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_RollbackConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_RollbackConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_RollbackConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_GetConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_GetConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_ListConfigurations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_ListConfigurations_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ListConfigurations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_ListConfigurations_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations", runtime.WithHTTPPathPattern("/v1/configurations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_ListConfigurations_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ListConfigurations_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetActiveConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations:getActive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_GetActiveConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetActiveConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetActiveConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration", runtime.WithHTTPPathPattern("/v1/configurations:getActive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConfigService_GetActiveConfiguration_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetActiveConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterConfigServiceHandlerFromEndpoint is same as RegisterConfigServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterConfigServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterConfigServiceHandler(ctx, mux, conn) +} + +// RegisterConfigServiceHandler registers the http handlers for service ConfigService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterConfigServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterConfigServiceHandlerClient(ctx, mux, NewConfigServiceClient(conn)) +} + +// RegisterConfigServiceHandlerClient registers the http handlers for service ConfigService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ConfigServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ConfigServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ConfigServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterConfigServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConfigServiceClient) error { + mux.Handle(http.MethodPost, pattern_ConfigService_StageConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations:stage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_StageConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_StageConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_StageConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration", runtime.WithHTTPPathPattern("/v1/configurations:stage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_StageConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_StageConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_PublishConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:publish")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_PublishConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_PublishConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_PublishConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:publish")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_PublishConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_PublishConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_DeployConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:deploy")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_DeployConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_DeployConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_DeployConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:deploy")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_DeployConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_DeployConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_ReleaseConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:release")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_ReleaseConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ReleaseConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_ReleaseConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:release")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_ReleaseConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ReleaseConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_RollbackConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}:rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_RollbackConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_RollbackConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ConfigService_RollbackConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}:rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_RollbackConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_RollbackConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/configurations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_GetConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration", runtime.WithHTTPPathPattern("/v1/{name=configurations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_GetConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_ListConfigurations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_ListConfigurations_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ListConfigurations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_ListConfigurations_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations", runtime.WithHTTPPathPattern("/v1/configurations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_ListConfigurations_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_ListConfigurations_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetActiveConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/configurations:getActive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_GetActiveConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetActiveConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ConfigService_GetActiveConfiguration_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration", runtime.WithHTTPPathPattern("/v1/configurations:getActive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConfigService_GetActiveConfiguration_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ConfigService_GetActiveConfiguration_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ConfigService_StageConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "configurations"}, "stage")) + pattern_ConfigService_StageConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "configurations"}, "stage")) + pattern_ConfigService_PublishConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "configurations", "name"}, "publish")) + pattern_ConfigService_PublishConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "configurations", "name"}, "publish")) + pattern_ConfigService_DeployConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "configurations", "name"}, "deploy")) + pattern_ConfigService_DeployConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "configurations", "name"}, "deploy")) + pattern_ConfigService_ReleaseConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "configurations", "name"}, "release")) + pattern_ConfigService_ReleaseConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "configurations", "name"}, "release")) + pattern_ConfigService_RollbackConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "configurations", "name"}, "rollback")) + pattern_ConfigService_RollbackConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "configurations", "name"}, "rollback")) + pattern_ConfigService_GetConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "configurations", "name"}, "")) + pattern_ConfigService_GetConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "configurations", "name"}, "")) + pattern_ConfigService_ListConfigurations_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "configurations"}, "")) + pattern_ConfigService_ListConfigurations_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "configurations"}, "")) + pattern_ConfigService_GetActiveConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "configurations"}, "getActive")) + pattern_ConfigService_GetActiveConfiguration_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "configurations"}, "getActive")) +) + +var ( + forward_ConfigService_StageConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_StageConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_PublishConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_PublishConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_DeployConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_DeployConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_ReleaseConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_ReleaseConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_RollbackConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_RollbackConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_GetConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_GetConfiguration_1 = runtime.ForwardResponseMessage + forward_ConfigService_ListConfigurations_0 = runtime.ForwardResponseMessage + forward_ConfigService_ListConfigurations_1 = runtime.ForwardResponseMessage + forward_ConfigService_GetActiveConfiguration_0 = runtime.ForwardResponseMessage + forward_ConfigService_GetActiveConfiguration_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/config_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/config_grpc.pb.go new file mode 100644 index 0000000000..931064dfbb --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/config_grpc.pb.go @@ -0,0 +1,404 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/config.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ConfigService_StageConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/StageConfiguration" + ConfigService_PublishConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/PublishConfiguration" + ConfigService_DeployConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/DeployConfiguration" + ConfigService_ReleaseConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/ReleaseConfiguration" + ConfigService_RollbackConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/RollbackConfiguration" + ConfigService_GetConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/GetConfiguration" + ConfigService_ListConfigurations_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/ListConfigurations" + ConfigService_GetActiveConfiguration_FullMethodName = "/redpanda.api.aigateway.v1.ConfigService/GetActiveConfiguration" +) + +// ConfigServiceClient is the client API for ConfigService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ConfigServiceClient interface { + // Stages a configuration (assembles entities, validates, stores immutably) + StageConfiguration(ctx context.Context, in *StageConfigurationRequest, opts ...grpc.CallOption) (*StageConfigurationResponse, error) + // Publishes a staged configuration (packages and distributes) + PublishConfiguration(ctx context.Context, in *PublishConfigurationRequest, opts ...grpc.CallOption) (*PublishConfigurationResponse, error) + // Deploys a published configuration (places near gateway instances) + DeployConfiguration(ctx context.Context, in *DeployConfigurationRequest, opts ...grpc.CallOption) (*DeployConfigurationResponse, error) + // Releases a deployed configuration (activates it) + ReleaseConfiguration(ctx context.Context, in *ReleaseConfigurationRequest, opts ...grpc.CallOption) (*ReleaseConfigurationResponse, error) + // Rolls back to a previous configuration + RollbackConfiguration(ctx context.Context, in *RollbackConfigurationRequest, opts ...grpc.CallOption) (*RollbackConfigurationResponse, error) + // Gets a configuration + GetConfiguration(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) + // Lists configurations + ListConfigurations(ctx context.Context, in *ListConfigurationsRequest, opts ...grpc.CallOption) (*ListConfigurationsResponse, error) + // Gets the currently active configuration + GetActiveConfiguration(ctx context.Context, in *GetActiveConfigurationRequest, opts ...grpc.CallOption) (*GetActiveConfigurationResponse, error) +} + +type configServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewConfigServiceClient(cc grpc.ClientConnInterface) ConfigServiceClient { + return &configServiceClient{cc} +} + +func (c *configServiceClient) StageConfiguration(ctx context.Context, in *StageConfigurationRequest, opts ...grpc.CallOption) (*StageConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(StageConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_StageConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) PublishConfiguration(ctx context.Context, in *PublishConfigurationRequest, opts ...grpc.CallOption) (*PublishConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PublishConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_PublishConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) DeployConfiguration(ctx context.Context, in *DeployConfigurationRequest, opts ...grpc.CallOption) (*DeployConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeployConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_DeployConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) ReleaseConfiguration(ctx context.Context, in *ReleaseConfigurationRequest, opts ...grpc.CallOption) (*ReleaseConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ReleaseConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_ReleaseConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) RollbackConfiguration(ctx context.Context, in *RollbackConfigurationRequest, opts ...grpc.CallOption) (*RollbackConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RollbackConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_RollbackConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) GetConfiguration(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_GetConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) ListConfigurations(ctx context.Context, in *ListConfigurationsRequest, opts ...grpc.CallOption) (*ListConfigurationsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListConfigurationsResponse) + err := c.cc.Invoke(ctx, ConfigService_ListConfigurations_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configServiceClient) GetActiveConfiguration(ctx context.Context, in *GetActiveConfigurationRequest, opts ...grpc.CallOption) (*GetActiveConfigurationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetActiveConfigurationResponse) + err := c.cc.Invoke(ctx, ConfigService_GetActiveConfiguration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ConfigServiceServer is the server API for ConfigService service. +// All implementations must embed UnimplementedConfigServiceServer +// for forward compatibility. +type ConfigServiceServer interface { + // Stages a configuration (assembles entities, validates, stores immutably) + StageConfiguration(context.Context, *StageConfigurationRequest) (*StageConfigurationResponse, error) + // Publishes a staged configuration (packages and distributes) + PublishConfiguration(context.Context, *PublishConfigurationRequest) (*PublishConfigurationResponse, error) + // Deploys a published configuration (places near gateway instances) + DeployConfiguration(context.Context, *DeployConfigurationRequest) (*DeployConfigurationResponse, error) + // Releases a deployed configuration (activates it) + ReleaseConfiguration(context.Context, *ReleaseConfigurationRequest) (*ReleaseConfigurationResponse, error) + // Rolls back to a previous configuration + RollbackConfiguration(context.Context, *RollbackConfigurationRequest) (*RollbackConfigurationResponse, error) + // Gets a configuration + GetConfiguration(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) + // Lists configurations + ListConfigurations(context.Context, *ListConfigurationsRequest) (*ListConfigurationsResponse, error) + // Gets the currently active configuration + GetActiveConfiguration(context.Context, *GetActiveConfigurationRequest) (*GetActiveConfigurationResponse, error) + mustEmbedUnimplementedConfigServiceServer() +} + +// UnimplementedConfigServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedConfigServiceServer struct{} + +func (UnimplementedConfigServiceServer) StageConfiguration(context.Context, *StageConfigurationRequest) (*StageConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StageConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) PublishConfiguration(context.Context, *PublishConfigurationRequest) (*PublishConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PublishConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) DeployConfiguration(context.Context, *DeployConfigurationRequest) (*DeployConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeployConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) ReleaseConfiguration(context.Context, *ReleaseConfigurationRequest) (*ReleaseConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReleaseConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) RollbackConfiguration(context.Context, *RollbackConfigurationRequest) (*RollbackConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RollbackConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) GetConfiguration(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) ListConfigurations(context.Context, *ListConfigurationsRequest) (*ListConfigurationsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListConfigurations not implemented") +} +func (UnimplementedConfigServiceServer) GetActiveConfiguration(context.Context, *GetActiveConfigurationRequest) (*GetActiveConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActiveConfiguration not implemented") +} +func (UnimplementedConfigServiceServer) mustEmbedUnimplementedConfigServiceServer() {} +func (UnimplementedConfigServiceServer) testEmbeddedByValue() {} + +// UnsafeConfigServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ConfigServiceServer will +// result in compilation errors. +type UnsafeConfigServiceServer interface { + mustEmbedUnimplementedConfigServiceServer() +} + +func RegisterConfigServiceServer(s grpc.ServiceRegistrar, srv ConfigServiceServer) { + // If the following call pancis, it indicates UnimplementedConfigServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ConfigService_ServiceDesc, srv) +} + +func _ConfigService_StageConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StageConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).StageConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_StageConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).StageConfiguration(ctx, req.(*StageConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_PublishConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PublishConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).PublishConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_PublishConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).PublishConfiguration(ctx, req.(*PublishConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_DeployConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeployConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).DeployConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_DeployConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).DeployConfiguration(ctx, req.(*DeployConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_ReleaseConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReleaseConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).ReleaseConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_ReleaseConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).ReleaseConfiguration(ctx, req.(*ReleaseConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_RollbackConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RollbackConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).RollbackConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_RollbackConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).RollbackConfiguration(ctx, req.(*RollbackConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_GetConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).GetConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_GetConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).GetConfiguration(ctx, req.(*GetConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_ListConfigurations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListConfigurationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).ListConfigurations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_ListConfigurations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).ListConfigurations(ctx, req.(*ListConfigurationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ConfigService_GetActiveConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActiveConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfigServiceServer).GetActiveConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConfigService_GetActiveConfiguration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfigServiceServer).GetActiveConfiguration(ctx, req.(*GetActiveConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ConfigService_ServiceDesc is the grpc.ServiceDesc for ConfigService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ConfigService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.ConfigService", + HandlerType: (*ConfigServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "StageConfiguration", + Handler: _ConfigService_StageConfiguration_Handler, + }, + { + MethodName: "PublishConfiguration", + Handler: _ConfigService_PublishConfiguration_Handler, + }, + { + MethodName: "DeployConfiguration", + Handler: _ConfigService_DeployConfiguration_Handler, + }, + { + MethodName: "ReleaseConfiguration", + Handler: _ConfigService_ReleaseConfiguration_Handler, + }, + { + MethodName: "RollbackConfiguration", + Handler: _ConfigService_RollbackConfiguration_Handler, + }, + { + MethodName: "GetConfiguration", + Handler: _ConfigService_GetConfiguration_Handler, + }, + { + MethodName: "ListConfigurations", + Handler: _ConfigService_ListConfigurations_Handler, + }, + { + MethodName: "GetActiveConfiguration", + Handler: _ConfigService_GetActiveConfiguration_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/config.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.go new file mode 100644 index 0000000000..669a32fb69 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.go @@ -0,0 +1,965 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/gateway.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Response message for CreateGateway RPC. +type CreateGatewayResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Gateway *Gateway `protobuf:"bytes,1,opt,name=gateway,proto3" json:"gateway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGatewayResponse) Reset() { + *x = CreateGatewayResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGatewayResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGatewayResponse) ProtoMessage() {} + +func (x *CreateGatewayResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGatewayResponse.ProtoReflect.Descriptor instead. +func (*CreateGatewayResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateGatewayResponse) GetGateway() *Gateway { + if x != nil { + return x.Gateway + } + return nil +} + +// Response message for GetGateway RPC. +type GetGatewayResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Gateway *Gateway `protobuf:"bytes,1,opt,name=gateway,proto3" json:"gateway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGatewayResponse) Reset() { + *x = GetGatewayResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGatewayResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGatewayResponse) ProtoMessage() {} + +func (x *GetGatewayResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGatewayResponse.ProtoReflect.Descriptor instead. +func (*GetGatewayResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{1} +} + +func (x *GetGatewayResponse) GetGateway() *Gateway { + if x != nil { + return x.Gateway + } + return nil +} + +// Response message for UpdateGateway RPC. +type UpdateGatewayResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Gateway *Gateway `protobuf:"bytes,1,opt,name=gateway,proto3" json:"gateway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGatewayResponse) Reset() { + *x = UpdateGatewayResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGatewayResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGatewayResponse) ProtoMessage() {} + +func (x *UpdateGatewayResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGatewayResponse.ProtoReflect.Descriptor instead. +func (*UpdateGatewayResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateGatewayResponse) GetGateway() *Gateway { + if x != nil { + return x.Gateway + } + return nil +} + +// Response message for DeleteGateway RPC. +type DeleteGatewayResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGatewayResponse) Reset() { + *x = DeleteGatewayResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGatewayResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGatewayResponse) ProtoMessage() {} + +func (x *DeleteGatewayResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGatewayResponse.ProtoReflect.Descriptor instead. +func (*DeleteGatewayResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{3} +} + +// Gateway represents a virtual gateway with isolated configuration. +type Gateway struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `gateways/{gateway_id}` + // Gateway ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Whether this gateway is active + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator's OIDC subject (if available) + Creator string `protobuf:"bytes,8,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater's OIDC subject (if available) + Updater string `protobuf:"bytes,9,opt,name=updater,proto3" json:"updater,omitempty"` + // Required: Parent workspace for this gateway. + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + Workspace string `protobuf:"bytes,10,opt,name=workspace,proto3" json:"workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Gateway) Reset() { + *x = Gateway{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Gateway) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Gateway) ProtoMessage() {} + +func (x *Gateway) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Gateway.ProtoReflect.Descriptor instead. +func (*Gateway) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{4} +} + +func (x *Gateway) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Gateway) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Gateway) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Gateway) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Gateway) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Gateway) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Gateway) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Gateway) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Gateway) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +func (x *Gateway) GetWorkspace() string { + if x != nil { + return x.Workspace + } + return "" +} + +type CreateGatewayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The parent workspace where this gateway will be created. + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The gateway resource to create. + Gateway *Gateway `protobuf:"bytes,3,opt,name=gateway,proto3" json:"gateway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGatewayRequest) Reset() { + *x = CreateGatewayRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGatewayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGatewayRequest) ProtoMessage() {} + +func (x *CreateGatewayRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGatewayRequest.ProtoReflect.Descriptor instead. +func (*CreateGatewayRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateGatewayRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateGatewayRequest) GetGateway() *Gateway { + if x != nil { + return x.Gateway + } + return nil +} + +type GetGatewayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the gateway. + // Format: `gateways/{gateway}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGatewayRequest) Reset() { + *x = GetGatewayRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGatewayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGatewayRequest) ProtoMessage() {} + +func (x *GetGatewayRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGatewayRequest.ProtoReflect.Descriptor instead. +func (*GetGatewayRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{6} +} + +func (x *GetGatewayRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListGatewaysRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Optional: Filter by workspace. + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + // If empty, lists all gateways the caller has access to. + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of gateways to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListGateways call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + // Examples: + // + // enabled = true + // display_name = "production-gateway" + // create_time > timestamp("2024-01-01T00:00:00Z") + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + // Examples: "create_time desc", "display_name" + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGatewaysRequest) Reset() { + *x = ListGatewaysRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGatewaysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGatewaysRequest) ProtoMessage() {} + +func (x *ListGatewaysRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGatewaysRequest.ProtoReflect.Descriptor instead. +func (*ListGatewaysRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{7} +} + +func (x *ListGatewaysRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListGatewaysRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListGatewaysRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListGatewaysRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListGatewaysRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListGatewaysResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of gateways + Gateways []*Gateway `protobuf:"bytes,1,rep,name=gateways,proto3" json:"gateways,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count (if requested via filter) + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGatewaysResponse) Reset() { + *x = ListGatewaysResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGatewaysResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGatewaysResponse) ProtoMessage() {} + +func (x *ListGatewaysResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGatewaysResponse.ProtoReflect.Descriptor instead. +func (*ListGatewaysResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{8} +} + +func (x *ListGatewaysResponse) GetGateways() []*Gateway { + if x != nil { + return x.Gateways + } + return nil +} + +func (x *ListGatewaysResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListGatewaysResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateGatewayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The gateway resource to update. + // The gateway's name field is used to identify the resource. + Gateway *Gateway `protobuf:"bytes,1,opt,name=gateway,proto3" json:"gateway,omitempty"` + // The fields to update. + // If omitted, all mutable fields are updated. + // Allowed fields: display_name, description, enabled, metadata + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGatewayRequest) Reset() { + *x = UpdateGatewayRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGatewayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGatewayRequest) ProtoMessage() {} + +func (x *UpdateGatewayRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGatewayRequest.ProtoReflect.Descriptor instead. +func (*UpdateGatewayRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateGatewayRequest) GetGateway() *Gateway { + if x != nil { + return x.Gateway + } + return nil +} + +func (x *UpdateGatewayRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteGatewayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the gateway to delete. + // Format: `gateways/{gateway}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all child resources (backend pools, routing rules, etc.) + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGatewayRequest) Reset() { + *x = DeleteGatewayRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGatewayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGatewayRequest) ProtoMessage() {} + +func (x *DeleteGatewayRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGatewayRequest.ProtoReflect.Descriptor instead. +func (*DeleteGatewayRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteGatewayRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteGatewayRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +var File_redpanda_api_aigateway_v1_gateway_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_gateway_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, + 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x55, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x22, 0x52, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x07, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, 0x55, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, + 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, 0x17, 0x0a, 0x15, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb4, 0x04, 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x3a, 0x37, 0xea, 0x41, 0x34, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x12, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, 0x22, 0x88, 0x01, 0x0a, + 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x22, 0x9d, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, + 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0x9b, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x40, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x6d, + 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x32, 0x8b, 0x06, + 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x91, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x07, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x12, + 0x85, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x32, 0x1d, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x91, 0x01, 0x0a, + 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x2f, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, + 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x81, 0x02, 0x0a, 0x1d, + 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, + 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, + 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_gateway_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_gateway_proto_rawDescData = file_redpanda_api_aigateway_v1_gateway_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_gateway_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_gateway_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_gateway_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_gateway_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_gateway_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_gateway_proto_goTypes = []any{ + (*CreateGatewayResponse)(nil), // 0: redpanda.api.aigateway.v1.CreateGatewayResponse + (*GetGatewayResponse)(nil), // 1: redpanda.api.aigateway.v1.GetGatewayResponse + (*UpdateGatewayResponse)(nil), // 2: redpanda.api.aigateway.v1.UpdateGatewayResponse + (*DeleteGatewayResponse)(nil), // 3: redpanda.api.aigateway.v1.DeleteGatewayResponse + (*Gateway)(nil), // 4: redpanda.api.aigateway.v1.Gateway + (*CreateGatewayRequest)(nil), // 5: redpanda.api.aigateway.v1.CreateGatewayRequest + (*GetGatewayRequest)(nil), // 6: redpanda.api.aigateway.v1.GetGatewayRequest + (*ListGatewaysRequest)(nil), // 7: redpanda.api.aigateway.v1.ListGatewaysRequest + (*ListGatewaysResponse)(nil), // 8: redpanda.api.aigateway.v1.ListGatewaysResponse + (*UpdateGatewayRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateGatewayRequest + (*DeleteGatewayRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteGatewayRequest + nil, // 11: redpanda.api.aigateway.v1.Gateway.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_gateway_proto_depIdxs = []int32{ + 4, // 0: redpanda.api.aigateway.v1.CreateGatewayResponse.gateway:type_name -> redpanda.api.aigateway.v1.Gateway + 4, // 1: redpanda.api.aigateway.v1.GetGatewayResponse.gateway:type_name -> redpanda.api.aigateway.v1.Gateway + 4, // 2: redpanda.api.aigateway.v1.UpdateGatewayResponse.gateway:type_name -> redpanda.api.aigateway.v1.Gateway + 11, // 3: redpanda.api.aigateway.v1.Gateway.metadata:type_name -> redpanda.api.aigateway.v1.Gateway.MetadataEntry + 12, // 4: redpanda.api.aigateway.v1.Gateway.create_time:type_name -> google.protobuf.Timestamp + 12, // 5: redpanda.api.aigateway.v1.Gateway.update_time:type_name -> google.protobuf.Timestamp + 4, // 6: redpanda.api.aigateway.v1.CreateGatewayRequest.gateway:type_name -> redpanda.api.aigateway.v1.Gateway + 4, // 7: redpanda.api.aigateway.v1.ListGatewaysResponse.gateways:type_name -> redpanda.api.aigateway.v1.Gateway + 4, // 8: redpanda.api.aigateway.v1.UpdateGatewayRequest.gateway:type_name -> redpanda.api.aigateway.v1.Gateway + 13, // 9: redpanda.api.aigateway.v1.UpdateGatewayRequest.update_mask:type_name -> google.protobuf.FieldMask + 5, // 10: redpanda.api.aigateway.v1.GatewayService.CreateGateway:input_type -> redpanda.api.aigateway.v1.CreateGatewayRequest + 6, // 11: redpanda.api.aigateway.v1.GatewayService.GetGateway:input_type -> redpanda.api.aigateway.v1.GetGatewayRequest + 7, // 12: redpanda.api.aigateway.v1.GatewayService.ListGateways:input_type -> redpanda.api.aigateway.v1.ListGatewaysRequest + 9, // 13: redpanda.api.aigateway.v1.GatewayService.UpdateGateway:input_type -> redpanda.api.aigateway.v1.UpdateGatewayRequest + 10, // 14: redpanda.api.aigateway.v1.GatewayService.DeleteGateway:input_type -> redpanda.api.aigateway.v1.DeleteGatewayRequest + 0, // 15: redpanda.api.aigateway.v1.GatewayService.CreateGateway:output_type -> redpanda.api.aigateway.v1.CreateGatewayResponse + 1, // 16: redpanda.api.aigateway.v1.GatewayService.GetGateway:output_type -> redpanda.api.aigateway.v1.GetGatewayResponse + 8, // 17: redpanda.api.aigateway.v1.GatewayService.ListGateways:output_type -> redpanda.api.aigateway.v1.ListGatewaysResponse + 2, // 18: redpanda.api.aigateway.v1.GatewayService.UpdateGateway:output_type -> redpanda.api.aigateway.v1.UpdateGatewayResponse + 3, // 19: redpanda.api.aigateway.v1.GatewayService.DeleteGateway:output_type -> redpanda.api.aigateway.v1.DeleteGatewayResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_gateway_proto_init() } +func file_redpanda_api_aigateway_v1_gateway_proto_init() { + if File_redpanda_api_aigateway_v1_gateway_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_gateway_proto_rawDesc, + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_gateway_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_gateway_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_gateway_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_gateway_proto = out.File + file_redpanda_api_aigateway_v1_gateway_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_gateway_proto_goTypes = nil + file_redpanda_api_aigateway_v1_gateway_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.gw.go new file mode 100644 index 0000000000..6cabbd9c18 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway.pb.gw.go @@ -0,0 +1,535 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/gateway.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_GatewayService_CreateGateway_0 = &utilities.DoubleArray{Encoding: map[string]int{"gateway": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_GatewayService_CreateGateway_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGatewayRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Gateway); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_CreateGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateGateway(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayService_CreateGateway_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGatewayRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Gateway); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_CreateGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateGateway(ctx, &protoReq) + return msg, metadata, err +} + +func request_GatewayService_GetGateway_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGatewayRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetGateway(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayService_GetGateway_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGatewayRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetGateway(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GatewayService_ListGateways_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_GatewayService_ListGateways_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGatewaysRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_ListGateways_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListGateways(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayService_ListGateways_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGatewaysRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_ListGateways_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListGateways(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GatewayService_UpdateGateway_0 = &utilities.DoubleArray{Encoding: map[string]int{"gateway": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_GatewayService_UpdateGateway_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGatewayRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Gateway); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Gateway); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["gateway.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "gateway.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_UpdateGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateGateway(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayService_UpdateGateway_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGatewayRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Gateway); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Gateway); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["gateway.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "gateway.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_UpdateGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateGateway(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GatewayService_DeleteGateway_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_GatewayService_DeleteGateway_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGatewayRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_DeleteGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteGateway(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayService_DeleteGateway_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGatewayRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GatewayService_DeleteGateway_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteGateway(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterGatewayServiceHandlerServer registers the http handlers for service GatewayService to "mux". +// UnaryRPC :call GatewayServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterGatewayServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterGatewayServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server GatewayServiceServer) error { + mux.Handle(http.MethodPost, pattern_GatewayService_CreateGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/CreateGateway", runtime.WithHTTPPathPattern("/v1/gateways")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayService_CreateGateway_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_CreateGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GatewayService_GetGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/GetGateway", runtime.WithHTTPPathPattern("/v1/{name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayService_GetGateway_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_GetGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GatewayService_ListGateways_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/ListGateways", runtime.WithHTTPPathPattern("/v1/gateways")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayService_ListGateways_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_ListGateways_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GatewayService_UpdateGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/UpdateGateway", runtime.WithHTTPPathPattern("/v1/{gateway.name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayService_UpdateGateway_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_UpdateGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GatewayService_DeleteGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/DeleteGateway", runtime.WithHTTPPathPattern("/v1/{name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayService_DeleteGateway_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_DeleteGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterGatewayServiceHandlerFromEndpoint is same as RegisterGatewayServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterGatewayServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterGatewayServiceHandler(ctx, mux, conn) +} + +// RegisterGatewayServiceHandler registers the http handlers for service GatewayService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterGatewayServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterGatewayServiceHandlerClient(ctx, mux, NewGatewayServiceClient(conn)) +} + +// RegisterGatewayServiceHandlerClient registers the http handlers for service GatewayService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "GatewayServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "GatewayServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "GatewayServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterGatewayServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client GatewayServiceClient) error { + mux.Handle(http.MethodPost, pattern_GatewayService_CreateGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/CreateGateway", runtime.WithHTTPPathPattern("/v1/gateways")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayService_CreateGateway_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_CreateGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GatewayService_GetGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/GetGateway", runtime.WithHTTPPathPattern("/v1/{name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayService_GetGateway_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_GetGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GatewayService_ListGateways_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/ListGateways", runtime.WithHTTPPathPattern("/v1/gateways")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayService_ListGateways_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_ListGateways_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GatewayService_UpdateGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/UpdateGateway", runtime.WithHTTPPathPattern("/v1/{gateway.name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayService_UpdateGateway_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_UpdateGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GatewayService_DeleteGateway_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayService/DeleteGateway", runtime.WithHTTPPathPattern("/v1/{name=gateways/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayService_DeleteGateway_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayService_DeleteGateway_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_GatewayService_CreateGateway_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "gateways"}, "")) + pattern_GatewayService_GetGateway_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "gateways", "name"}, "")) + pattern_GatewayService_ListGateways_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "gateways"}, "")) + pattern_GatewayService_UpdateGateway_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "gateways", "gateway.name"}, "")) + pattern_GatewayService_DeleteGateway_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "gateways", "name"}, "")) +) + +var ( + forward_GatewayService_CreateGateway_0 = runtime.ForwardResponseMessage + forward_GatewayService_GetGateway_0 = runtime.ForwardResponseMessage + forward_GatewayService_ListGateways_0 = runtime.ForwardResponseMessage + forward_GatewayService_UpdateGateway_0 = runtime.ForwardResponseMessage + forward_GatewayService_DeleteGateway_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.go new file mode 100644 index 0000000000..e18e936f57 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.go @@ -0,0 +1,1208 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/gateway_config.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// UpdateType specifies whether this is a full snapshot or incremental delta. +type UpdateType int32 + +const ( + UpdateType_UPDATE_TYPE_UNSPECIFIED UpdateType = 0 + // Full configuration snapshot. + // Replaces all existing resources of each type included. + UpdateType_UPDATE_TYPE_SNAPSHOT UpdateType = 1 + // Incremental delta update. + // Only contains resources that changed since last version. + UpdateType_UPDATE_TYPE_DELTA UpdateType = 2 +) + +// Enum value maps for UpdateType. +var ( + UpdateType_name = map[int32]string{ + 0: "UPDATE_TYPE_UNSPECIFIED", + 1: "UPDATE_TYPE_SNAPSHOT", + 2: "UPDATE_TYPE_DELTA", + } + UpdateType_value = map[string]int32{ + "UPDATE_TYPE_UNSPECIFIED": 0, + "UPDATE_TYPE_SNAPSHOT": 1, + "UPDATE_TYPE_DELTA": 2, + } +) + +func (x UpdateType) Enum() *UpdateType { + p := new(UpdateType) + *p = x + return p +} + +func (x UpdateType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (UpdateType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[0].Descriptor() +} + +func (UpdateType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[0] +} + +func (x UpdateType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use UpdateType.Descriptor instead. +func (UpdateType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{0} +} + +// DeltaOperation specifies what change to apply to a resource. +type DeltaOperation int32 + +const ( + DeltaOperation_DELTA_OPERATION_UNSPECIFIED DeltaOperation = 0 + // Add a new resource or update if it exists. + // Idempotent: applying the same ADD twice results in the same state. + DeltaOperation_DELTA_OPERATION_ADD DeltaOperation = 1 + // Update an existing resource. + // Same as ADD semantically; explicit for logging/metrics. + DeltaOperation_DELTA_OPERATION_UPDATE DeltaOperation = 2 + // Remove a resource by name. + // Idempotent: removing a non-existent resource is a no-op. + DeltaOperation_DELTA_OPERATION_REMOVE DeltaOperation = 3 +) + +// Enum value maps for DeltaOperation. +var ( + DeltaOperation_name = map[int32]string{ + 0: "DELTA_OPERATION_UNSPECIFIED", + 1: "DELTA_OPERATION_ADD", + 2: "DELTA_OPERATION_UPDATE", + 3: "DELTA_OPERATION_REMOVE", + } + DeltaOperation_value = map[string]int32{ + "DELTA_OPERATION_UNSPECIFIED": 0, + "DELTA_OPERATION_ADD": 1, + "DELTA_OPERATION_UPDATE": 2, + "DELTA_OPERATION_REMOVE": 3, + } +) + +func (x DeltaOperation) Enum() *DeltaOperation { + p := new(DeltaOperation) + *p = x + return p +} + +func (x DeltaOperation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeltaOperation) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[1].Descriptor() +} + +func (DeltaOperation) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[1] +} + +func (x DeltaOperation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DeltaOperation.Descriptor instead. +func (DeltaOperation) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{1} +} + +// ResourceType identifies the type of configuration resource. +type ResourceType int32 + +const ( + ResourceType_RESOURCE_TYPE_UNSPECIFIED ResourceType = 0 + ResourceType_RESOURCE_TYPE_BACKEND_POOL ResourceType = 1 + ResourceType_RESOURCE_TYPE_ROUTING_RULE ResourceType = 2 + ResourceType_RESOURCE_TYPE_RATE_LIMIT ResourceType = 3 + ResourceType_RESOURCE_TYPE_SPEND_LIMIT ResourceType = 4 +) + +// Enum value maps for ResourceType. +var ( + ResourceType_name = map[int32]string{ + 0: "RESOURCE_TYPE_UNSPECIFIED", + 1: "RESOURCE_TYPE_BACKEND_POOL", + 2: "RESOURCE_TYPE_ROUTING_RULE", + 3: "RESOURCE_TYPE_RATE_LIMIT", + 4: "RESOURCE_TYPE_SPEND_LIMIT", + } + ResourceType_value = map[string]int32{ + "RESOURCE_TYPE_UNSPECIFIED": 0, + "RESOURCE_TYPE_BACKEND_POOL": 1, + "RESOURCE_TYPE_ROUTING_RULE": 2, + "RESOURCE_TYPE_RATE_LIMIT": 3, + "RESOURCE_TYPE_SPEND_LIMIT": 4, + } +) + +func (x ResourceType) Enum() *ResourceType { + p := new(ResourceType) + *p = x + return p +} + +func (x ResourceType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ResourceType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[2].Descriptor() +} + +func (ResourceType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[2] +} + +func (x ResourceType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ResourceType.Descriptor instead. +func (ResourceType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{2} +} + +// ConfigApplyErrorCode categorizes configuration application failures. +type ConfigApplyErrorCode int32 + +const ( + ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_UNSPECIFIED ConfigApplyErrorCode = 0 + // Resource validation failed (e.g., invalid CEL expression). + ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_VALIDATION ConfigApplyErrorCode = 1 + // Resource dependency not found (e.g., backend_pool for routing rule). + ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_DEPENDENCY ConfigApplyErrorCode = 2 + // Resource conflict (e.g., duplicate ID). + ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_CONFLICT ConfigApplyErrorCode = 3 + // Internal error applying the configuration. + ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_INTERNAL ConfigApplyErrorCode = 4 +) + +// Enum value maps for ConfigApplyErrorCode. +var ( + ConfigApplyErrorCode_name = map[int32]string{ + 0: "CONFIG_APPLY_ERROR_CODE_UNSPECIFIED", + 1: "CONFIG_APPLY_ERROR_CODE_VALIDATION", + 2: "CONFIG_APPLY_ERROR_CODE_DEPENDENCY", + 3: "CONFIG_APPLY_ERROR_CODE_CONFLICT", + 4: "CONFIG_APPLY_ERROR_CODE_INTERNAL", + } + ConfigApplyErrorCode_value = map[string]int32{ + "CONFIG_APPLY_ERROR_CODE_UNSPECIFIED": 0, + "CONFIG_APPLY_ERROR_CODE_VALIDATION": 1, + "CONFIG_APPLY_ERROR_CODE_DEPENDENCY": 2, + "CONFIG_APPLY_ERROR_CODE_CONFLICT": 3, + "CONFIG_APPLY_ERROR_CODE_INTERNAL": 4, + } +) + +func (x ConfigApplyErrorCode) Enum() *ConfigApplyErrorCode { + p := new(ConfigApplyErrorCode) + *p = x + return p +} + +func (x ConfigApplyErrorCode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConfigApplyErrorCode) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[3].Descriptor() +} + +func (ConfigApplyErrorCode) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes[3] +} + +func (x ConfigApplyErrorCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConfigApplyErrorCode.Descriptor instead. +func (ConfigApplyErrorCode) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{3} +} + +// StreamConfigRequest is sent by gateways to subscribe and acknowledge updates. +type StreamConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Node information identifying this gateway instance. + // Required on first message, optional on subsequent ACKs. + Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Last successfully applied version. + // Empty on initial connection (requests full snapshot). + // Set on reconnection to resume from last known state. + LastVersion string `protobuf:"bytes,2,opt,name=last_version,json=lastVersion,proto3" json:"last_version,omitempty"` + // Response nonce being acknowledged. + // Matches the nonce in the corresponding StreamConfigResponse. + // Empty on initial request. + ResponseNonce string `protobuf:"bytes,3,opt,name=response_nonce,json=responseNonce,proto3" json:"response_nonce,omitempty"` + // Optional error if the gateway failed to apply the previous update. + // Control plane may resend the update or take corrective action. + Error *ConfigApplyError `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + // Optional: Filter by resource types. + // If empty, subscribes to all resource types. + // Only used on initial request. + ResourceTypes []ResourceType `protobuf:"varint,5,rep,packed,name=resource_types,json=resourceTypes,proto3,enum=redpanda.api.aigateway.v1.ResourceType" json:"resource_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StreamConfigRequest) Reset() { + *x = StreamConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StreamConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamConfigRequest) ProtoMessage() {} + +func (x *StreamConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamConfigRequest.ProtoReflect.Descriptor instead. +func (*StreamConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{0} +} + +func (x *StreamConfigRequest) GetNode() *Node { + if x != nil { + return x.Node + } + return nil +} + +func (x *StreamConfigRequest) GetLastVersion() string { + if x != nil { + return x.LastVersion + } + return "" +} + +func (x *StreamConfigRequest) GetResponseNonce() string { + if x != nil { + return x.ResponseNonce + } + return "" +} + +func (x *StreamConfigRequest) GetError() *ConfigApplyError { + if x != nil { + return x.Error + } + return nil +} + +func (x *StreamConfigRequest) GetResourceTypes() []ResourceType { + if x != nil { + return x.ResourceTypes + } + return nil +} + +// StreamConfigResponse contains configuration updates streamed from control plane. +type StreamConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Monotonically increasing version identifier. + // Format: "{timestamp_unix_nanos}_{sequence}" + // Gateways should persist this to resume on reconnection. + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // Unique identifier for this response. + // Gateway must echo this in the next StreamConfigRequest.response_nonce. + Nonce string `protobuf:"bytes,2,opt,name=nonce,proto3" json:"nonce,omitempty"` + // Type of update being sent. + Type UpdateType `protobuf:"varint,3,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.UpdateType" json:"type,omitempty"` + // Resource deltas (changes since last version or full snapshot). + // For SNAPSHOT type: contains all current resources. + // For DELTA type: contains only changed resources. + Resources []*ResourceDelta `protobuf:"bytes,4,rep,name=resources,proto3" json:"resources,omitempty"` + // Server timestamp when this update was generated. + ServerTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=server_time,json=serverTime,proto3" json:"server_time,omitempty"` + // Gateway resource name this config applies to. + // Format: "gateways/{gateway_id}" + Gateway string `protobuf:"bytes,6,opt,name=gateway,proto3" json:"gateway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StreamConfigResponse) Reset() { + *x = StreamConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StreamConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamConfigResponse) ProtoMessage() {} + +func (x *StreamConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamConfigResponse.ProtoReflect.Descriptor instead. +func (*StreamConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{1} +} + +func (x *StreamConfigResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *StreamConfigResponse) GetNonce() string { + if x != nil { + return x.Nonce + } + return "" +} + +func (x *StreamConfigResponse) GetType() UpdateType { + if x != nil { + return x.Type + } + return UpdateType_UPDATE_TYPE_UNSPECIFIED +} + +func (x *StreamConfigResponse) GetResources() []*ResourceDelta { + if x != nil { + return x.Resources + } + return nil +} + +func (x *StreamConfigResponse) GetServerTime() *timestamppb.Timestamp { + if x != nil { + return x.ServerTime + } + return nil +} + +func (x *StreamConfigResponse) GetGateway() string { + if x != nil { + return x.Gateway + } + return "" +} + +// ResourceDelta represents a single resource change. +type ResourceDelta struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Type of operation for this resource. + Operation DeltaOperation `protobuf:"varint,1,opt,name=operation,proto3,enum=redpanda.api.aigateway.v1.DeltaOperation" json:"operation,omitempty"` + // The resource being changed. + // Exactly one of the resource fields must be set based on resource_type. + // + // Types that are valid to be assigned to Resource: + // + // *ResourceDelta_BackendPool + // *ResourceDelta_RoutingRule + // *ResourceDelta_RateLimit + // *ResourceDelta_SpendLimit + Resource isResourceDelta_Resource `protobuf_oneof:"resource"` + // For REMOVE operations, the resource name to remove. + // Only used when the resource oneof is not set. + ResourceName string `protobuf:"bytes,6,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + // Resource type hint (useful for REMOVE operations). + ResourceType ResourceType `protobuf:"varint,7,opt,name=resource_type,json=resourceType,proto3,enum=redpanda.api.aigateway.v1.ResourceType" json:"resource_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceDelta) Reset() { + *x = ResourceDelta{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceDelta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDelta) ProtoMessage() {} + +func (x *ResourceDelta) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceDelta.ProtoReflect.Descriptor instead. +func (*ResourceDelta) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{2} +} + +func (x *ResourceDelta) GetOperation() DeltaOperation { + if x != nil { + return x.Operation + } + return DeltaOperation_DELTA_OPERATION_UNSPECIFIED +} + +func (x *ResourceDelta) GetResource() isResourceDelta_Resource { + if x != nil { + return x.Resource + } + return nil +} + +func (x *ResourceDelta) GetBackendPool() *BackendPool { + if x != nil { + if x, ok := x.Resource.(*ResourceDelta_BackendPool); ok { + return x.BackendPool + } + } + return nil +} + +func (x *ResourceDelta) GetRoutingRule() *RoutingRule { + if x != nil { + if x, ok := x.Resource.(*ResourceDelta_RoutingRule); ok { + return x.RoutingRule + } + } + return nil +} + +func (x *ResourceDelta) GetRateLimit() *RateLimit { + if x != nil { + if x, ok := x.Resource.(*ResourceDelta_RateLimit); ok { + return x.RateLimit + } + } + return nil +} + +func (x *ResourceDelta) GetSpendLimit() *SpendLimit { + if x != nil { + if x, ok := x.Resource.(*ResourceDelta_SpendLimit); ok { + return x.SpendLimit + } + } + return nil +} + +func (x *ResourceDelta) GetResourceName() string { + if x != nil { + return x.ResourceName + } + return "" +} + +func (x *ResourceDelta) GetResourceType() ResourceType { + if x != nil { + return x.ResourceType + } + return ResourceType_RESOURCE_TYPE_UNSPECIFIED +} + +type isResourceDelta_Resource interface { + isResourceDelta_Resource() +} + +type ResourceDelta_BackendPool struct { + BackendPool *BackendPool `protobuf:"bytes,2,opt,name=backend_pool,json=backendPool,proto3,oneof"` +} + +type ResourceDelta_RoutingRule struct { + RoutingRule *RoutingRule `protobuf:"bytes,3,opt,name=routing_rule,json=routingRule,proto3,oneof"` +} + +type ResourceDelta_RateLimit struct { + RateLimit *RateLimit `protobuf:"bytes,4,opt,name=rate_limit,json=rateLimit,proto3,oneof"` +} + +type ResourceDelta_SpendLimit struct { + SpendLimit *SpendLimit `protobuf:"bytes,5,opt,name=spend_limit,json=spendLimit,proto3,oneof"` +} + +func (*ResourceDelta_BackendPool) isResourceDelta_Resource() {} + +func (*ResourceDelta_RoutingRule) isResourceDelta_Resource() {} + +func (*ResourceDelta_RateLimit) isResourceDelta_Resource() {} + +func (*ResourceDelta_SpendLimit) isResourceDelta_Resource() {} + +// Node contains information about the subscribing gateway instance. +type Node struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Unique identifier for this gateway instance. + // Format: "gateways/{gateway_id}" + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Human-readable cluster/deployment name for debugging. + Cluster string `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"` + // Build version of the gateway binary. + BuildVersion string `protobuf:"bytes,3,opt,name=build_version,json=buildVersion,proto3" json:"build_version,omitempty"` + // Arbitrary metadata (e.g., region, availability_zone). + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Node) Reset() { + *x = Node{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Node) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Node) ProtoMessage() {} + +func (x *Node) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Node.ProtoReflect.Descriptor instead. +func (*Node) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{3} +} + +func (x *Node) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Node) GetCluster() string { + if x != nil { + return x.Cluster + } + return "" +} + +func (x *Node) GetBuildVersion() string { + if x != nil { + return x.BuildVersion + } + return "" +} + +func (x *Node) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// ConfigApplyError reports errors when applying configuration updates. +type ConfigApplyError struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Error code categorizing the failure. + Code ConfigApplyErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=redpanda.api.aigateway.v1.ConfigApplyErrorCode" json:"code,omitempty"` + // Human-readable error message. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // Resource name that caused the error (if applicable). + ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + // Resource type that caused the error (if applicable). + ResourceType ResourceType `protobuf:"varint,4,opt,name=resource_type,json=resourceType,proto3,enum=redpanda.api.aigateway.v1.ResourceType" json:"resource_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConfigApplyError) Reset() { + *x = ConfigApplyError{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConfigApplyError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigApplyError) ProtoMessage() {} + +func (x *ConfigApplyError) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigApplyError.ProtoReflect.Descriptor instead. +func (*ConfigApplyError) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{4} +} + +func (x *ConfigApplyError) GetCode() ConfigApplyErrorCode { + if x != nil { + return x.Code + } + return ConfigApplyErrorCode_CONFIG_APPLY_ERROR_CODE_UNSPECIFIED +} + +func (x *ConfigApplyError) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *ConfigApplyError) GetResourceName() string { + if x != nil { + return x.ResourceName + } + return "" +} + +func (x *ConfigApplyError) GetResourceType() ResourceType { + if x != nil { + return x.ResourceType + } + return ResourceType_RESOURCE_TYPE_UNSPECIFIED +} + +// FetchConfigRequest is used for single-shot configuration retrieval. +type FetchConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Node information identifying this gateway instance. + Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Optional: Only return resources changed since this version. + // If empty, returns full snapshot. + SinceVersion string `protobuf:"bytes,2,opt,name=since_version,json=sinceVersion,proto3" json:"since_version,omitempty"` + // Optional: Filter by resource types. + // If empty, returns all resource types. + ResourceTypes []ResourceType `protobuf:"varint,3,rep,packed,name=resource_types,json=resourceTypes,proto3,enum=redpanda.api.aigateway.v1.ResourceType" json:"resource_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchConfigRequest) Reset() { + *x = FetchConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchConfigRequest) ProtoMessage() {} + +func (x *FetchConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchConfigRequest.ProtoReflect.Descriptor instead. +func (*FetchConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{5} +} + +func (x *FetchConfigRequest) GetNode() *Node { + if x != nil { + return x.Node + } + return nil +} + +func (x *FetchConfigRequest) GetSinceVersion() string { + if x != nil { + return x.SinceVersion + } + return "" +} + +func (x *FetchConfigRequest) GetResourceTypes() []ResourceType { + if x != nil { + return x.ResourceTypes + } + return nil +} + +// FetchConfigResponse contains the requested configuration snapshot. +type FetchConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Current version of the configuration. + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // Type of response (SNAPSHOT or DELTA based on since_version). + Type UpdateType `protobuf:"varint,2,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.UpdateType" json:"type,omitempty"` + // The configuration resources. + Resources []*ResourceDelta `protobuf:"bytes,3,rep,name=resources,proto3" json:"resources,omitempty"` + // Server timestamp when this snapshot was generated. + ServerTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=server_time,json=serverTime,proto3" json:"server_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FetchConfigResponse) Reset() { + *x = FetchConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FetchConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchConfigResponse) ProtoMessage() {} + +func (x *FetchConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchConfigResponse.ProtoReflect.Descriptor instead. +func (*FetchConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP(), []int{6} +} + +func (x *FetchConfigResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *FetchConfigResponse) GetType() UpdateType { + if x != nil { + return x.Type + } + return UpdateType_UPDATE_TYPE_UNSPECIFIED +} + +func (x *FetchConfigResponse) GetResources() []*ResourceDelta { + if x != nil { + return x.Resources + } + return nil +} + +func (x *FetchConfigResponse) GetServerTime() *timestamppb.Timestamp { + if x != nil { + return x.ServerTime + } + return nil +} + +var File_redpanda_api_aigateway_v1_gateway_config_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_gateway_config_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, + 0x31, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x27, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2b, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x41, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x4e, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x22, 0xb9, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, 0x98, 0x04, + 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, + 0x53, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0xba, + 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, + 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, + 0x6c, 0x12, 0x4b, 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x48, + 0x00, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x45, + 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x48, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xee, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x13, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x40, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x2a, 0x5a, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1b, 0x0a, 0x17, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, + 0x53, 0x48, 0x4f, 0x54, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x02, 0x2a, 0x82, 0x01, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x45, + 0x4c, 0x54, 0x41, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, + 0x10, 0x03, 0x2a, 0xaa, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, + 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x55, 0x4c, 0x45, + 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x03, + 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x04, 0x2a, + 0xdb, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, + 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x41, 0x50, 0x50, 0x4c, + 0x59, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, 0x10, + 0x02, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x41, 0x50, 0x50, 0x4c, + 0x59, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x46, 0x4c, 0x49, 0x43, 0x54, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, + 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x32, 0x9f, 0x02, + 0x0a, 0x14, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x73, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x91, 0x01, 0x0a, 0x0b, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x42, + 0x87, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x42, 0x12, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, + 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, + 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescData = file_redpanda_api_aigateway_v1_gateway_config_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_gateway_config_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_redpanda_api_aigateway_v1_gateway_config_proto_goTypes = []any{ + (UpdateType)(0), // 0: redpanda.api.aigateway.v1.UpdateType + (DeltaOperation)(0), // 1: redpanda.api.aigateway.v1.DeltaOperation + (ResourceType)(0), // 2: redpanda.api.aigateway.v1.ResourceType + (ConfigApplyErrorCode)(0), // 3: redpanda.api.aigateway.v1.ConfigApplyErrorCode + (*StreamConfigRequest)(nil), // 4: redpanda.api.aigateway.v1.StreamConfigRequest + (*StreamConfigResponse)(nil), // 5: redpanda.api.aigateway.v1.StreamConfigResponse + (*ResourceDelta)(nil), // 6: redpanda.api.aigateway.v1.ResourceDelta + (*Node)(nil), // 7: redpanda.api.aigateway.v1.Node + (*ConfigApplyError)(nil), // 8: redpanda.api.aigateway.v1.ConfigApplyError + (*FetchConfigRequest)(nil), // 9: redpanda.api.aigateway.v1.FetchConfigRequest + (*FetchConfigResponse)(nil), // 10: redpanda.api.aigateway.v1.FetchConfigResponse + nil, // 11: redpanda.api.aigateway.v1.Node.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*BackendPool)(nil), // 13: redpanda.api.aigateway.v1.BackendPool + (*RoutingRule)(nil), // 14: redpanda.api.aigateway.v1.RoutingRule + (*RateLimit)(nil), // 15: redpanda.api.aigateway.v1.RateLimit + (*SpendLimit)(nil), // 16: redpanda.api.aigateway.v1.SpendLimit +} +var file_redpanda_api_aigateway_v1_gateway_config_proto_depIdxs = []int32{ + 7, // 0: redpanda.api.aigateway.v1.StreamConfigRequest.node:type_name -> redpanda.api.aigateway.v1.Node + 8, // 1: redpanda.api.aigateway.v1.StreamConfigRequest.error:type_name -> redpanda.api.aigateway.v1.ConfigApplyError + 2, // 2: redpanda.api.aigateway.v1.StreamConfigRequest.resource_types:type_name -> redpanda.api.aigateway.v1.ResourceType + 0, // 3: redpanda.api.aigateway.v1.StreamConfigResponse.type:type_name -> redpanda.api.aigateway.v1.UpdateType + 6, // 4: redpanda.api.aigateway.v1.StreamConfigResponse.resources:type_name -> redpanda.api.aigateway.v1.ResourceDelta + 12, // 5: redpanda.api.aigateway.v1.StreamConfigResponse.server_time:type_name -> google.protobuf.Timestamp + 1, // 6: redpanda.api.aigateway.v1.ResourceDelta.operation:type_name -> redpanda.api.aigateway.v1.DeltaOperation + 13, // 7: redpanda.api.aigateway.v1.ResourceDelta.backend_pool:type_name -> redpanda.api.aigateway.v1.BackendPool + 14, // 8: redpanda.api.aigateway.v1.ResourceDelta.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 15, // 9: redpanda.api.aigateway.v1.ResourceDelta.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 16, // 10: redpanda.api.aigateway.v1.ResourceDelta.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 2, // 11: redpanda.api.aigateway.v1.ResourceDelta.resource_type:type_name -> redpanda.api.aigateway.v1.ResourceType + 11, // 12: redpanda.api.aigateway.v1.Node.metadata:type_name -> redpanda.api.aigateway.v1.Node.MetadataEntry + 3, // 13: redpanda.api.aigateway.v1.ConfigApplyError.code:type_name -> redpanda.api.aigateway.v1.ConfigApplyErrorCode + 2, // 14: redpanda.api.aigateway.v1.ConfigApplyError.resource_type:type_name -> redpanda.api.aigateway.v1.ResourceType + 7, // 15: redpanda.api.aigateway.v1.FetchConfigRequest.node:type_name -> redpanda.api.aigateway.v1.Node + 2, // 16: redpanda.api.aigateway.v1.FetchConfigRequest.resource_types:type_name -> redpanda.api.aigateway.v1.ResourceType + 0, // 17: redpanda.api.aigateway.v1.FetchConfigResponse.type:type_name -> redpanda.api.aigateway.v1.UpdateType + 6, // 18: redpanda.api.aigateway.v1.FetchConfigResponse.resources:type_name -> redpanda.api.aigateway.v1.ResourceDelta + 12, // 19: redpanda.api.aigateway.v1.FetchConfigResponse.server_time:type_name -> google.protobuf.Timestamp + 4, // 20: redpanda.api.aigateway.v1.GatewayConfigService.StreamConfig:input_type -> redpanda.api.aigateway.v1.StreamConfigRequest + 9, // 21: redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig:input_type -> redpanda.api.aigateway.v1.FetchConfigRequest + 5, // 22: redpanda.api.aigateway.v1.GatewayConfigService.StreamConfig:output_type -> redpanda.api.aigateway.v1.StreamConfigResponse + 10, // 23: redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig:output_type -> redpanda.api.aigateway.v1.FetchConfigResponse + 22, // [22:24] is the sub-list for method output_type + 20, // [20:22] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_gateway_config_proto_init() } +func file_redpanda_api_aigateway_v1_gateway_config_proto_init() { + if File_redpanda_api_aigateway_v1_gateway_config_proto != nil { + return + } + file_redpanda_api_aigateway_v1_backend_pool_proto_init() + file_redpanda_api_aigateway_v1_ratelimit_proto_init() + file_redpanda_api_aigateway_v1_routing_proto_init() + file_redpanda_api_aigateway_v1_spend_limit_proto_init() + file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes[2].OneofWrappers = []any{ + (*ResourceDelta_BackendPool)(nil), + (*ResourceDelta_RoutingRule)(nil), + (*ResourceDelta_RateLimit)(nil), + (*ResourceDelta_SpendLimit)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_gateway_config_proto_rawDesc, + NumEnums: 4, + NumMessages: 8, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_gateway_config_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_gateway_config_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_gateway_config_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_gateway_config_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_gateway_config_proto = out.File + file_redpanda_api_aigateway_v1_gateway_config_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_gateway_config_proto_goTypes = nil + file_redpanda_api_aigateway_v1_gateway_config_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.gw.go new file mode 100644 index 0000000000..34e03cc53c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config.pb.gw.go @@ -0,0 +1,225 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/gateway_config.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_GatewayConfigService_StreamConfig_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayConfigServiceClient, req *http.Request, pathParams map[string]string) (GatewayConfigService_StreamConfigClient, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.StreamConfig(ctx) + if err != nil { + grpclog.Errorf("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + handleSend := func() error { + var protoReq StreamConfigRequest + err := dec.Decode(&protoReq) + if errors.Is(err, io.EOF) { + return err + } + if err != nil { + grpclog.Errorf("Failed to decode request: %v", err) + return status.Errorf(codes.InvalidArgument, "Failed to decode request: %v", err) + } + if err := stream.Send(&protoReq); err != nil { + grpclog.Errorf("Failed to send request: %v", err) + return err + } + return nil + } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Errorf("Failed to terminate client stream: %v", err) + } + }() + header, err := stream.Header() + if err != nil { + grpclog.Errorf("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil +} + +func request_GatewayConfigService_FetchConfig_0(ctx context.Context, marshaler runtime.Marshaler, client GatewayConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq FetchConfigRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.FetchConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GatewayConfigService_FetchConfig_0(ctx context.Context, marshaler runtime.Marshaler, server GatewayConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq FetchConfigRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.FetchConfig(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterGatewayConfigServiceHandlerServer registers the http handlers for service GatewayConfigService to "mux". +// UnaryRPC :call GatewayConfigServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterGatewayConfigServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterGatewayConfigServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server GatewayConfigServiceServer) error { + mux.Handle(http.MethodPost, pattern_GatewayConfigService_StreamConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + mux.Handle(http.MethodPost, pattern_GatewayConfigService_FetchConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayConfigService/FetchConfig", runtime.WithHTTPPathPattern("/v1/gateway-config:fetch")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GatewayConfigService_FetchConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayConfigService_FetchConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterGatewayConfigServiceHandlerFromEndpoint is same as RegisterGatewayConfigServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterGatewayConfigServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterGatewayConfigServiceHandler(ctx, mux, conn) +} + +// RegisterGatewayConfigServiceHandler registers the http handlers for service GatewayConfigService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterGatewayConfigServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterGatewayConfigServiceHandlerClient(ctx, mux, NewGatewayConfigServiceClient(conn)) +} + +// RegisterGatewayConfigServiceHandlerClient registers the http handlers for service GatewayConfigService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "GatewayConfigServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "GatewayConfigServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "GatewayConfigServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterGatewayConfigServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client GatewayConfigServiceClient) error { + mux.Handle(http.MethodPost, pattern_GatewayConfigService_StreamConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayConfigService/StreamConfig", runtime.WithHTTPPathPattern("/redpanda.api.aigateway.v1.GatewayConfigService/StreamConfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayConfigService_StreamConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayConfigService_StreamConfig_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_GatewayConfigService_FetchConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GatewayConfigService/FetchConfig", runtime.WithHTTPPathPattern("/v1/gateway-config:fetch")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GatewayConfigService_FetchConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GatewayConfigService_FetchConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_GatewayConfigService_StreamConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"redpanda.api.aigateway.v1.GatewayConfigService", "StreamConfig"}, "")) + pattern_GatewayConfigService_FetchConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "gateway-config"}, "fetch")) +) + +var ( + forward_GatewayConfigService_StreamConfig_0 = runtime.ForwardResponseStream + forward_GatewayConfigService_FetchConfig_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config_grpc.pb.go new file mode 100644 index 0000000000..c45b298d08 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_config_grpc.pb.go @@ -0,0 +1,215 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/gateway_config.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + GatewayConfigService_StreamConfig_FullMethodName = "/redpanda.api.aigateway.v1.GatewayConfigService/StreamConfig" + GatewayConfigService_FetchConfig_FullMethodName = "/redpanda.api.aigateway.v1.GatewayConfigService/FetchConfig" +) + +// GatewayConfigServiceClient is the client API for GatewayConfigService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// GatewayConfigService provides streaming configuration updates to data plane gateways. +// +// This is an xDS-inspired protocol for incremental configuration distribution: +// - Gateways connect and subscribe to configuration updates +// - Control plane streams delta updates (add/update/remove resources) +// - Each update includes a version for consistency tracking +// - Gateways acknowledge received updates to enable flow control +// +// The service supports both full snapshots (initial sync) and delta updates +// (ongoing changes), minimizing bandwidth and processing overhead. +// +// Note: This service uses bidirectional streaming for efficient ACK/NACK flow. +// It is intended for internal gateway-to-control-plane communication (Go services), +// not for web clients. Web clients should use the REST CRUD APIs. +type GatewayConfigServiceClient interface { + // StreamConfig establishes a bidirectional stream for configuration updates. + // + // Flow: + // 1. Gateway sends StreamConfigRequest with node info and optional last_version + // 2. Control plane sends initial StreamConfigResponse with full snapshot (if no version) + // or delta updates since last_version + // 3. Gateway sends ACK with received version + // 4. Control plane streams delta updates as resources change + // 5. Gateway ACKs each update + // + // On reconnection, gateway sends last successfully applied version to resume + // from where it left off. + StreamConfig(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[StreamConfigRequest, StreamConfigResponse], error) + // FetchConfig retrieves the current configuration snapshot. + // Use this for simple polling-based updates or initial bootstrap. + // For real-time updates, prefer StreamConfig. + FetchConfig(ctx context.Context, in *FetchConfigRequest, opts ...grpc.CallOption) (*FetchConfigResponse, error) +} + +type gatewayConfigServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewGatewayConfigServiceClient(cc grpc.ClientConnInterface) GatewayConfigServiceClient { + return &gatewayConfigServiceClient{cc} +} + +func (c *gatewayConfigServiceClient) StreamConfig(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[StreamConfigRequest, StreamConfigResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &GatewayConfigService_ServiceDesc.Streams[0], GatewayConfigService_StreamConfig_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[StreamConfigRequest, StreamConfigResponse]{ClientStream: stream} + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayConfigService_StreamConfigClient = grpc.BidiStreamingClient[StreamConfigRequest, StreamConfigResponse] + +func (c *gatewayConfigServiceClient) FetchConfig(ctx context.Context, in *FetchConfigRequest, opts ...grpc.CallOption) (*FetchConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(FetchConfigResponse) + err := c.cc.Invoke(ctx, GatewayConfigService_FetchConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GatewayConfigServiceServer is the server API for GatewayConfigService service. +// All implementations must embed UnimplementedGatewayConfigServiceServer +// for forward compatibility. +// +// GatewayConfigService provides streaming configuration updates to data plane gateways. +// +// This is an xDS-inspired protocol for incremental configuration distribution: +// - Gateways connect and subscribe to configuration updates +// - Control plane streams delta updates (add/update/remove resources) +// - Each update includes a version for consistency tracking +// - Gateways acknowledge received updates to enable flow control +// +// The service supports both full snapshots (initial sync) and delta updates +// (ongoing changes), minimizing bandwidth and processing overhead. +// +// Note: This service uses bidirectional streaming for efficient ACK/NACK flow. +// It is intended for internal gateway-to-control-plane communication (Go services), +// not for web clients. Web clients should use the REST CRUD APIs. +type GatewayConfigServiceServer interface { + // StreamConfig establishes a bidirectional stream for configuration updates. + // + // Flow: + // 1. Gateway sends StreamConfigRequest with node info and optional last_version + // 2. Control plane sends initial StreamConfigResponse with full snapshot (if no version) + // or delta updates since last_version + // 3. Gateway sends ACK with received version + // 4. Control plane streams delta updates as resources change + // 5. Gateway ACKs each update + // + // On reconnection, gateway sends last successfully applied version to resume + // from where it left off. + StreamConfig(grpc.BidiStreamingServer[StreamConfigRequest, StreamConfigResponse]) error + // FetchConfig retrieves the current configuration snapshot. + // Use this for simple polling-based updates or initial bootstrap. + // For real-time updates, prefer StreamConfig. + FetchConfig(context.Context, *FetchConfigRequest) (*FetchConfigResponse, error) + mustEmbedUnimplementedGatewayConfigServiceServer() +} + +// UnimplementedGatewayConfigServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedGatewayConfigServiceServer struct{} + +func (UnimplementedGatewayConfigServiceServer) StreamConfig(grpc.BidiStreamingServer[StreamConfigRequest, StreamConfigResponse]) error { + return status.Errorf(codes.Unimplemented, "method StreamConfig not implemented") +} +func (UnimplementedGatewayConfigServiceServer) FetchConfig(context.Context, *FetchConfigRequest) (*FetchConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FetchConfig not implemented") +} +func (UnimplementedGatewayConfigServiceServer) mustEmbedUnimplementedGatewayConfigServiceServer() {} +func (UnimplementedGatewayConfigServiceServer) testEmbeddedByValue() {} + +// UnsafeGatewayConfigServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GatewayConfigServiceServer will +// result in compilation errors. +type UnsafeGatewayConfigServiceServer interface { + mustEmbedUnimplementedGatewayConfigServiceServer() +} + +func RegisterGatewayConfigServiceServer(s grpc.ServiceRegistrar, srv GatewayConfigServiceServer) { + // If the following call pancis, it indicates UnimplementedGatewayConfigServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&GatewayConfigService_ServiceDesc, srv) +} + +func _GatewayConfigService_StreamConfig_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(GatewayConfigServiceServer).StreamConfig(&grpc.GenericServerStream[StreamConfigRequest, StreamConfigResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayConfigService_StreamConfigServer = grpc.BidiStreamingServer[StreamConfigRequest, StreamConfigResponse] + +func _GatewayConfigService_FetchConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FetchConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayConfigServiceServer).FetchConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayConfigService_FetchConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayConfigServiceServer).FetchConfig(ctx, req.(*FetchConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// GatewayConfigService_ServiceDesc is the grpc.ServiceDesc for GatewayConfigService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var GatewayConfigService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.GatewayConfigService", + HandlerType: (*GatewayConfigServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "FetchConfig", + Handler: _GatewayConfigService_FetchConfig_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "StreamConfig", + Handler: _GatewayConfigService_StreamConfig_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "redpanda/api/aigateway/v1/gateway_config.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_grpc.pb.go new file mode 100644 index 0000000000..f98216f7de --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/gateway_grpc.pb.go @@ -0,0 +1,284 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/gateway.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + GatewayService_CreateGateway_FullMethodName = "/redpanda.api.aigateway.v1.GatewayService/CreateGateway" + GatewayService_GetGateway_FullMethodName = "/redpanda.api.aigateway.v1.GatewayService/GetGateway" + GatewayService_ListGateways_FullMethodName = "/redpanda.api.aigateway.v1.GatewayService/ListGateways" + GatewayService_UpdateGateway_FullMethodName = "/redpanda.api.aigateway.v1.GatewayService/UpdateGateway" + GatewayService_DeleteGateway_FullMethodName = "/redpanda.api.aigateway.v1.GatewayService/DeleteGateway" +) + +// GatewayServiceClient is the client API for GatewayService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GatewayServiceClient interface { + // Creates a new gateway. + CreateGateway(ctx context.Context, in *CreateGatewayRequest, opts ...grpc.CallOption) (*CreateGatewayResponse, error) + // Gets a gateway by name. + GetGateway(ctx context.Context, in *GetGatewayRequest, opts ...grpc.CallOption) (*GetGatewayResponse, error) + // Lists gateways. + ListGateways(ctx context.Context, in *ListGatewaysRequest, opts ...grpc.CallOption) (*ListGatewaysResponse, error) + // Updates a gateway. + UpdateGateway(ctx context.Context, in *UpdateGatewayRequest, opts ...grpc.CallOption) (*UpdateGatewayResponse, error) + // Deletes a gateway. + DeleteGateway(ctx context.Context, in *DeleteGatewayRequest, opts ...grpc.CallOption) (*DeleteGatewayResponse, error) +} + +type gatewayServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewGatewayServiceClient(cc grpc.ClientConnInterface) GatewayServiceClient { + return &gatewayServiceClient{cc} +} + +func (c *gatewayServiceClient) CreateGateway(ctx context.Context, in *CreateGatewayRequest, opts ...grpc.CallOption) (*CreateGatewayResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateGatewayResponse) + err := c.cc.Invoke(ctx, GatewayService_CreateGateway_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) GetGateway(ctx context.Context, in *GetGatewayRequest, opts ...grpc.CallOption) (*GetGatewayResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetGatewayResponse) + err := c.cc.Invoke(ctx, GatewayService_GetGateway_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) ListGateways(ctx context.Context, in *ListGatewaysRequest, opts ...grpc.CallOption) (*ListGatewaysResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListGatewaysResponse) + err := c.cc.Invoke(ctx, GatewayService_ListGateways_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) UpdateGateway(ctx context.Context, in *UpdateGatewayRequest, opts ...grpc.CallOption) (*UpdateGatewayResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateGatewayResponse) + err := c.cc.Invoke(ctx, GatewayService_UpdateGateway_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) DeleteGateway(ctx context.Context, in *DeleteGatewayRequest, opts ...grpc.CallOption) (*DeleteGatewayResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteGatewayResponse) + err := c.cc.Invoke(ctx, GatewayService_DeleteGateway_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GatewayServiceServer is the server API for GatewayService service. +// All implementations must embed UnimplementedGatewayServiceServer +// for forward compatibility. +type GatewayServiceServer interface { + // Creates a new gateway. + CreateGateway(context.Context, *CreateGatewayRequest) (*CreateGatewayResponse, error) + // Gets a gateway by name. + GetGateway(context.Context, *GetGatewayRequest) (*GetGatewayResponse, error) + // Lists gateways. + ListGateways(context.Context, *ListGatewaysRequest) (*ListGatewaysResponse, error) + // Updates a gateway. + UpdateGateway(context.Context, *UpdateGatewayRequest) (*UpdateGatewayResponse, error) + // Deletes a gateway. + DeleteGateway(context.Context, *DeleteGatewayRequest) (*DeleteGatewayResponse, error) + mustEmbedUnimplementedGatewayServiceServer() +} + +// UnimplementedGatewayServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedGatewayServiceServer struct{} + +func (UnimplementedGatewayServiceServer) CreateGateway(context.Context, *CreateGatewayRequest) (*CreateGatewayResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGateway not implemented") +} +func (UnimplementedGatewayServiceServer) GetGateway(context.Context, *GetGatewayRequest) (*GetGatewayResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGateway not implemented") +} +func (UnimplementedGatewayServiceServer) ListGateways(context.Context, *ListGatewaysRequest) (*ListGatewaysResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGateways not implemented") +} +func (UnimplementedGatewayServiceServer) UpdateGateway(context.Context, *UpdateGatewayRequest) (*UpdateGatewayResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGateway not implemented") +} +func (UnimplementedGatewayServiceServer) DeleteGateway(context.Context, *DeleteGatewayRequest) (*DeleteGatewayResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGateway not implemented") +} +func (UnimplementedGatewayServiceServer) mustEmbedUnimplementedGatewayServiceServer() {} +func (UnimplementedGatewayServiceServer) testEmbeddedByValue() {} + +// UnsafeGatewayServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GatewayServiceServer will +// result in compilation errors. +type UnsafeGatewayServiceServer interface { + mustEmbedUnimplementedGatewayServiceServer() +} + +func RegisterGatewayServiceServer(s grpc.ServiceRegistrar, srv GatewayServiceServer) { + // If the following call pancis, it indicates UnimplementedGatewayServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&GatewayService_ServiceDesc, srv) +} + +func _GatewayService_CreateGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGatewayRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).CreateGateway(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_CreateGateway_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).CreateGateway(ctx, req.(*CreateGatewayRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_GetGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGatewayRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).GetGateway(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_GetGateway_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).GetGateway(ctx, req.(*GetGatewayRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_ListGateways_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGatewaysRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).ListGateways(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_ListGateways_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).ListGateways(ctx, req.(*ListGatewaysRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_UpdateGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGatewayRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).UpdateGateway(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_UpdateGateway_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).UpdateGateway(ctx, req.(*UpdateGatewayRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_DeleteGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGatewayRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).DeleteGateway(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_DeleteGateway_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).DeleteGateway(ctx, req.(*DeleteGatewayRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// GatewayService_ServiceDesc is the grpc.ServiceDesc for GatewayService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var GatewayService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.GatewayService", + HandlerType: (*GatewayServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateGateway", + Handler: _GatewayService_CreateGateway_Handler, + }, + { + MethodName: "GetGateway", + Handler: _GatewayService_GetGateway_Handler, + }, + { + MethodName: "ListGateways", + Handler: _GatewayService_ListGateways_Handler, + }, + { + MethodName: "UpdateGateway", + Handler: _GatewayService_UpdateGateway_Handler, + }, + { + MethodName: "DeleteGateway", + Handler: _GatewayService_DeleteGateway_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/gateway.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.go new file mode 100644 index 0000000000..60a18fd517 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.go @@ -0,0 +1,1260 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/guardrail.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type GuardrailType int32 + +const ( + GuardrailType_GUARDRAIL_TYPE_UNSPECIFIED GuardrailType = 0 + GuardrailType_GUARDRAIL_TYPE_PII_DETECTION GuardrailType = 1 + GuardrailType_GUARDRAIL_TYPE_TOXIC_CONTENT GuardrailType = 2 + GuardrailType_GUARDRAIL_TYPE_PROMPT_INJECTION GuardrailType = 3 + GuardrailType_GUARDRAIL_TYPE_SENSITIVE_TOPICS GuardrailType = 4 + GuardrailType_GUARDRAIL_TYPE_CUSTOM_REGEX GuardrailType = 5 + GuardrailType_GUARDRAIL_TYPE_KEYWORD_BLOCKLIST GuardrailType = 6 +) + +// Enum value maps for GuardrailType. +var ( + GuardrailType_name = map[int32]string{ + 0: "GUARDRAIL_TYPE_UNSPECIFIED", + 1: "GUARDRAIL_TYPE_PII_DETECTION", + 2: "GUARDRAIL_TYPE_TOXIC_CONTENT", + 3: "GUARDRAIL_TYPE_PROMPT_INJECTION", + 4: "GUARDRAIL_TYPE_SENSITIVE_TOPICS", + 5: "GUARDRAIL_TYPE_CUSTOM_REGEX", + 6: "GUARDRAIL_TYPE_KEYWORD_BLOCKLIST", + } + GuardrailType_value = map[string]int32{ + "GUARDRAIL_TYPE_UNSPECIFIED": 0, + "GUARDRAIL_TYPE_PII_DETECTION": 1, + "GUARDRAIL_TYPE_TOXIC_CONTENT": 2, + "GUARDRAIL_TYPE_PROMPT_INJECTION": 3, + "GUARDRAIL_TYPE_SENSITIVE_TOPICS": 4, + "GUARDRAIL_TYPE_CUSTOM_REGEX": 5, + "GUARDRAIL_TYPE_KEYWORD_BLOCKLIST": 6, + } +) + +func (x GuardrailType) Enum() *GuardrailType { + p := new(GuardrailType) + *p = x + return p +} + +func (x GuardrailType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GuardrailType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[0].Descriptor() +} + +func (GuardrailType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[0] +} + +func (x GuardrailType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GuardrailType.Descriptor instead. +func (GuardrailType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{0} +} + +type GuardrailAction int32 + +const ( + GuardrailAction_GUARDRAIL_ACTION_UNSPECIFIED GuardrailAction = 0 + GuardrailAction_GUARDRAIL_ACTION_BLOCK GuardrailAction = 1 + GuardrailAction_GUARDRAIL_ACTION_REDACT GuardrailAction = 2 + GuardrailAction_GUARDRAIL_ACTION_LOG GuardrailAction = 3 + GuardrailAction_GUARDRAIL_ACTION_ALERT GuardrailAction = 4 +) + +// Enum value maps for GuardrailAction. +var ( + GuardrailAction_name = map[int32]string{ + 0: "GUARDRAIL_ACTION_UNSPECIFIED", + 1: "GUARDRAIL_ACTION_BLOCK", + 2: "GUARDRAIL_ACTION_REDACT", + 3: "GUARDRAIL_ACTION_LOG", + 4: "GUARDRAIL_ACTION_ALERT", + } + GuardrailAction_value = map[string]int32{ + "GUARDRAIL_ACTION_UNSPECIFIED": 0, + "GUARDRAIL_ACTION_BLOCK": 1, + "GUARDRAIL_ACTION_REDACT": 2, + "GUARDRAIL_ACTION_LOG": 3, + "GUARDRAIL_ACTION_ALERT": 4, + } +) + +func (x GuardrailAction) Enum() *GuardrailAction { + p := new(GuardrailAction) + *p = x + return p +} + +func (x GuardrailAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GuardrailAction) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[1].Descriptor() +} + +func (GuardrailAction) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[1] +} + +func (x GuardrailAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GuardrailAction.Descriptor instead. +func (GuardrailAction) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{1} +} + +type PatternType int32 + +const ( + PatternType_PATTERN_TYPE_UNSPECIFIED PatternType = 0 + PatternType_PATTERN_TYPE_REGEX PatternType = 1 + PatternType_PATTERN_TYPE_KEYWORD PatternType = 2 + PatternType_PATTERN_TYPE_WILDCARD PatternType = 3 +) + +// Enum value maps for PatternType. +var ( + PatternType_name = map[int32]string{ + 0: "PATTERN_TYPE_UNSPECIFIED", + 1: "PATTERN_TYPE_REGEX", + 2: "PATTERN_TYPE_KEYWORD", + 3: "PATTERN_TYPE_WILDCARD", + } + PatternType_value = map[string]int32{ + "PATTERN_TYPE_UNSPECIFIED": 0, + "PATTERN_TYPE_REGEX": 1, + "PATTERN_TYPE_KEYWORD": 2, + "PATTERN_TYPE_WILDCARD": 3, + } +) + +func (x PatternType) Enum() *PatternType { + p := new(PatternType) + *p = x + return p +} + +func (x PatternType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PatternType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[2].Descriptor() +} + +func (PatternType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes[2] +} + +func (x PatternType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PatternType.Descriptor instead. +func (PatternType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{2} +} + +// Response message for CreateGuardrail RPC. +type CreateGuardrailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Guardrail *Guardrail `protobuf:"bytes,1,opt,name=guardrail,proto3" json:"guardrail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGuardrailResponse) Reset() { + *x = CreateGuardrailResponse{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGuardrailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGuardrailResponse) ProtoMessage() {} + +func (x *CreateGuardrailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGuardrailResponse.ProtoReflect.Descriptor instead. +func (*CreateGuardrailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateGuardrailResponse) GetGuardrail() *Guardrail { + if x != nil { + return x.Guardrail + } + return nil +} + +// Response message for GetGuardrail RPC. +type GetGuardrailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Guardrail *Guardrail `protobuf:"bytes,1,opt,name=guardrail,proto3" json:"guardrail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGuardrailResponse) Reset() { + *x = GetGuardrailResponse{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGuardrailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGuardrailResponse) ProtoMessage() {} + +func (x *GetGuardrailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGuardrailResponse.ProtoReflect.Descriptor instead. +func (*GetGuardrailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{1} +} + +func (x *GetGuardrailResponse) GetGuardrail() *Guardrail { + if x != nil { + return x.Guardrail + } + return nil +} + +// Response message for UpdateGuardrail RPC. +type UpdateGuardrailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Guardrail *Guardrail `protobuf:"bytes,1,opt,name=guardrail,proto3" json:"guardrail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGuardrailResponse) Reset() { + *x = UpdateGuardrailResponse{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGuardrailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGuardrailResponse) ProtoMessage() {} + +func (x *UpdateGuardrailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGuardrailResponse.ProtoReflect.Descriptor instead. +func (*UpdateGuardrailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateGuardrailResponse) GetGuardrail() *Guardrail { + if x != nil { + return x.Guardrail + } + return nil +} + +// Response message for DeleteGuardrail RPC. +type DeleteGuardrailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGuardrailResponse) Reset() { + *x = DeleteGuardrailResponse{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGuardrailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGuardrailResponse) ProtoMessage() {} + +func (x *DeleteGuardrailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGuardrailResponse.ProtoReflect.Descriptor instead. +func (*DeleteGuardrailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{3} +} + +type Guardrail struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Type GuardrailType `protobuf:"varint,4,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.GuardrailType" json:"type,omitempty"` + MatchExpression string `protobuf:"bytes,5,opt,name=match_expression,json=matchExpression,proto3" json:"match_expression,omitempty"` + Patterns []*ContentPattern `protobuf:"bytes,6,rep,name=patterns,proto3" json:"patterns,omitempty"` + Action GuardrailAction `protobuf:"varint,7,opt,name=action,proto3,enum=redpanda.api.aigateway.v1.GuardrailAction" json:"action,omitempty"` + ScanRequest bool `protobuf:"varint,8,opt,name=scan_request,json=scanRequest,proto3" json:"scan_request,omitempty"` + ScanResponse bool `protobuf:"varint,9,opt,name=scan_response,json=scanResponse,proto3" json:"scan_response,omitempty"` + Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` + Metadata map[string]string `protobuf:"bytes,11,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Guardrail) Reset() { + *x = Guardrail{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Guardrail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Guardrail) ProtoMessage() {} + +func (x *Guardrail) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Guardrail.ProtoReflect.Descriptor instead. +func (*Guardrail) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{4} +} + +func (x *Guardrail) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Guardrail) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Guardrail) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Guardrail) GetType() GuardrailType { + if x != nil { + return x.Type + } + return GuardrailType_GUARDRAIL_TYPE_UNSPECIFIED +} + +func (x *Guardrail) GetMatchExpression() string { + if x != nil { + return x.MatchExpression + } + return "" +} + +func (x *Guardrail) GetPatterns() []*ContentPattern { + if x != nil { + return x.Patterns + } + return nil +} + +func (x *Guardrail) GetAction() GuardrailAction { + if x != nil { + return x.Action + } + return GuardrailAction_GUARDRAIL_ACTION_UNSPECIFIED +} + +func (x *Guardrail) GetScanRequest() bool { + if x != nil { + return x.ScanRequest + } + return false +} + +func (x *Guardrail) GetScanResponse() bool { + if x != nil { + return x.ScanResponse + } + return false +} + +func (x *Guardrail) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Guardrail) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Guardrail) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Guardrail) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +type ContentPattern struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type PatternType `protobuf:"varint,1,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.PatternType" json:"type,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + CaseSensitive bool `protobuf:"varint,3,opt,name=case_sensitive,json=caseSensitive,proto3" json:"case_sensitive,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ContentPattern) Reset() { + *x = ContentPattern{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ContentPattern) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentPattern) ProtoMessage() {} + +func (x *ContentPattern) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContentPattern.ProtoReflect.Descriptor instead. +func (*ContentPattern) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{5} +} + +func (x *ContentPattern) GetType() PatternType { + if x != nil { + return x.Type + } + return PatternType_PATTERN_TYPE_UNSPECIFIED +} + +func (x *ContentPattern) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *ContentPattern) GetCaseSensitive() bool { + if x != nil { + return x.CaseSensitive + } + return false +} + +type CreateGuardrailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + GuardrailId string `protobuf:"bytes,2,opt,name=guardrail_id,json=guardrailId,proto3" json:"guardrail_id,omitempty"` + Guardrail *Guardrail `protobuf:"bytes,3,opt,name=guardrail,proto3" json:"guardrail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGuardrailRequest) Reset() { + *x = CreateGuardrailRequest{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGuardrailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGuardrailRequest) ProtoMessage() {} + +func (x *CreateGuardrailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGuardrailRequest.ProtoReflect.Descriptor instead. +func (*CreateGuardrailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{6} +} + +func (x *CreateGuardrailRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateGuardrailRequest) GetGuardrailId() string { + if x != nil { + return x.GuardrailId + } + return "" +} + +func (x *CreateGuardrailRequest) GetGuardrail() *Guardrail { + if x != nil { + return x.Guardrail + } + return nil +} + +type GetGuardrailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGuardrailRequest) Reset() { + *x = GetGuardrailRequest{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGuardrailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGuardrailRequest) ProtoMessage() {} + +func (x *GetGuardrailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGuardrailRequest.ProtoReflect.Descriptor instead. +func (*GetGuardrailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{7} +} + +func (x *GetGuardrailRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListGuardrailsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGuardrailsRequest) Reset() { + *x = ListGuardrailsRequest{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGuardrailsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGuardrailsRequest) ProtoMessage() {} + +func (x *ListGuardrailsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGuardrailsRequest.ProtoReflect.Descriptor instead. +func (*ListGuardrailsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{8} +} + +func (x *ListGuardrailsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListGuardrailsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListGuardrailsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListGuardrailsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListGuardrailsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListGuardrailsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Guardrails []*Guardrail `protobuf:"bytes,1,rep,name=guardrails,proto3" json:"guardrails,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGuardrailsResponse) Reset() { + *x = ListGuardrailsResponse{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGuardrailsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGuardrailsResponse) ProtoMessage() {} + +func (x *ListGuardrailsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGuardrailsResponse.ProtoReflect.Descriptor instead. +func (*ListGuardrailsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{9} +} + +func (x *ListGuardrailsResponse) GetGuardrails() []*Guardrail { + if x != nil { + return x.Guardrails + } + return nil +} + +func (x *ListGuardrailsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListGuardrailsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateGuardrailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Guardrail *Guardrail `protobuf:"bytes,1,opt,name=guardrail,proto3" json:"guardrail,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGuardrailRequest) Reset() { + *x = UpdateGuardrailRequest{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGuardrailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGuardrailRequest) ProtoMessage() {} + +func (x *UpdateGuardrailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGuardrailRequest.ProtoReflect.Descriptor instead. +func (*UpdateGuardrailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{10} +} + +func (x *UpdateGuardrailRequest) GetGuardrail() *Guardrail { + if x != nil { + return x.Guardrail + } + return nil +} + +func (x *UpdateGuardrailRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteGuardrailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGuardrailRequest) Reset() { + *x = DeleteGuardrailRequest{} + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGuardrailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGuardrailRequest) ProtoMessage() {} + +func (x *DeleteGuardrailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGuardrailRequest.ProtoReflect.Descriptor instead. +func (*DeleteGuardrailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP(), []int{11} +} + +func (x *DeleteGuardrailRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_redpanda_api_aigateway_v1_guardrail_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_guardrail_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x72, 0x61, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x5d, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x22, 0x5a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, + 0x61, 0x69, 0x6c, 0x52, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x22, 0x5d, + 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x52, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x22, 0x19, 0x0a, + 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce, 0x06, 0x0a, 0x09, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x10, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x08, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x08, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4e, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, + 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, + 0x68, 0xea, 0x41, 0x65, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x29, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x7b, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x7d, 0x12, 0x16, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x7b, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x7d, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x3a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x63, 0x61, 0x73, 0x65, 0x53, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x72, 0x61, 0x69, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x09, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x22, 0x53, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, + 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, + 0x61, 0x69, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x15, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xa5, 0x01, 0x0a, 0x16, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, + 0x0a, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, + 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x73, 0x6b, 0x22, 0x56, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, + 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x75, 0x61, 0x72, + 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x84, 0x02, 0x0a, 0x0d, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, + 0x1a, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, + 0x1c, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x49, 0x49, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, + 0x20, 0x0a, 0x1c, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x54, 0x4f, 0x58, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, + 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4d, 0x50, 0x54, 0x5f, 0x49, 0x4e, 0x4a, 0x45, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, + 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x49, 0x54, 0x49, + 0x56, 0x45, 0x5f, 0x54, 0x4f, 0x50, 0x49, 0x43, 0x53, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x47, + 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, + 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, + 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, + 0x45, 0x59, 0x57, 0x4f, 0x52, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x4c, 0x49, 0x53, 0x54, + 0x10, 0x06, 0x2a, 0xa2, 0x01, 0x0a, 0x0f, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x1c, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, + 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x47, 0x55, 0x41, 0x52, + 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, + 0x4c, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x44, 0x41, 0x43, 0x54, 0x10, + 0x02, 0x12, 0x18, 0x0a, 0x14, 0x47, 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x47, + 0x55, 0x41, 0x52, 0x44, 0x52, 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x4c, 0x45, 0x52, 0x54, 0x10, 0x04, 0x2a, 0x78, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, + 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x59, + 0x57, 0x4f, 0x52, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x4c, 0x44, 0x43, 0x41, 0x52, 0x44, 0x10, + 0x03, 0x32, 0xfe, 0x07, 0x0a, 0x10, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xcc, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x5a, 0x1b, 0x3a, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, + 0x6c, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xb6, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x5a, + 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, + 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb3, + 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x5a, 0x10, + 0x12, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0xe9, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, + 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x6f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x69, 0x3a, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x5a, 0x2e, 0x3a, 0x09, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x32, + 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, + 0x2a, 0x7d, 0x32, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, + 0x69, 0x6c, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x2a, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xbf, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x72, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3f, 0x5a, 0x19, 0x2a, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2a, 0x22, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x2f, + 0x2a, 0x7d, 0x42, 0x83, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x47, 0x75, 0x61, 0x72, 0x64, 0x72, 0x61, 0x69, 0x6c, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, + 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, + 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_guardrail_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_guardrail_proto_rawDescData = file_redpanda_api_aigateway_v1_guardrail_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_guardrail_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_guardrail_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_guardrail_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_guardrail_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_guardrail_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_redpanda_api_aigateway_v1_guardrail_proto_goTypes = []any{ + (GuardrailType)(0), // 0: redpanda.api.aigateway.v1.GuardrailType + (GuardrailAction)(0), // 1: redpanda.api.aigateway.v1.GuardrailAction + (PatternType)(0), // 2: redpanda.api.aigateway.v1.PatternType + (*CreateGuardrailResponse)(nil), // 3: redpanda.api.aigateway.v1.CreateGuardrailResponse + (*GetGuardrailResponse)(nil), // 4: redpanda.api.aigateway.v1.GetGuardrailResponse + (*UpdateGuardrailResponse)(nil), // 5: redpanda.api.aigateway.v1.UpdateGuardrailResponse + (*DeleteGuardrailResponse)(nil), // 6: redpanda.api.aigateway.v1.DeleteGuardrailResponse + (*Guardrail)(nil), // 7: redpanda.api.aigateway.v1.Guardrail + (*ContentPattern)(nil), // 8: redpanda.api.aigateway.v1.ContentPattern + (*CreateGuardrailRequest)(nil), // 9: redpanda.api.aigateway.v1.CreateGuardrailRequest + (*GetGuardrailRequest)(nil), // 10: redpanda.api.aigateway.v1.GetGuardrailRequest + (*ListGuardrailsRequest)(nil), // 11: redpanda.api.aigateway.v1.ListGuardrailsRequest + (*ListGuardrailsResponse)(nil), // 12: redpanda.api.aigateway.v1.ListGuardrailsResponse + (*UpdateGuardrailRequest)(nil), // 13: redpanda.api.aigateway.v1.UpdateGuardrailRequest + (*DeleteGuardrailRequest)(nil), // 14: redpanda.api.aigateway.v1.DeleteGuardrailRequest + nil, // 15: redpanda.api.aigateway.v1.Guardrail.MetadataEntry + (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 17: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_guardrail_proto_depIdxs = []int32{ + 7, // 0: redpanda.api.aigateway.v1.CreateGuardrailResponse.guardrail:type_name -> redpanda.api.aigateway.v1.Guardrail + 7, // 1: redpanda.api.aigateway.v1.GetGuardrailResponse.guardrail:type_name -> redpanda.api.aigateway.v1.Guardrail + 7, // 2: redpanda.api.aigateway.v1.UpdateGuardrailResponse.guardrail:type_name -> redpanda.api.aigateway.v1.Guardrail + 0, // 3: redpanda.api.aigateway.v1.Guardrail.type:type_name -> redpanda.api.aigateway.v1.GuardrailType + 8, // 4: redpanda.api.aigateway.v1.Guardrail.patterns:type_name -> redpanda.api.aigateway.v1.ContentPattern + 1, // 5: redpanda.api.aigateway.v1.Guardrail.action:type_name -> redpanda.api.aigateway.v1.GuardrailAction + 15, // 6: redpanda.api.aigateway.v1.Guardrail.metadata:type_name -> redpanda.api.aigateway.v1.Guardrail.MetadataEntry + 16, // 7: redpanda.api.aigateway.v1.Guardrail.create_time:type_name -> google.protobuf.Timestamp + 16, // 8: redpanda.api.aigateway.v1.Guardrail.update_time:type_name -> google.protobuf.Timestamp + 2, // 9: redpanda.api.aigateway.v1.ContentPattern.type:type_name -> redpanda.api.aigateway.v1.PatternType + 7, // 10: redpanda.api.aigateway.v1.CreateGuardrailRequest.guardrail:type_name -> redpanda.api.aigateway.v1.Guardrail + 7, // 11: redpanda.api.aigateway.v1.ListGuardrailsResponse.guardrails:type_name -> redpanda.api.aigateway.v1.Guardrail + 7, // 12: redpanda.api.aigateway.v1.UpdateGuardrailRequest.guardrail:type_name -> redpanda.api.aigateway.v1.Guardrail + 17, // 13: redpanda.api.aigateway.v1.UpdateGuardrailRequest.update_mask:type_name -> google.protobuf.FieldMask + 9, // 14: redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail:input_type -> redpanda.api.aigateway.v1.CreateGuardrailRequest + 10, // 15: redpanda.api.aigateway.v1.GuardrailService.GetGuardrail:input_type -> redpanda.api.aigateway.v1.GetGuardrailRequest + 11, // 16: redpanda.api.aigateway.v1.GuardrailService.ListGuardrails:input_type -> redpanda.api.aigateway.v1.ListGuardrailsRequest + 13, // 17: redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail:input_type -> redpanda.api.aigateway.v1.UpdateGuardrailRequest + 14, // 18: redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail:input_type -> redpanda.api.aigateway.v1.DeleteGuardrailRequest + 3, // 19: redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail:output_type -> redpanda.api.aigateway.v1.CreateGuardrailResponse + 4, // 20: redpanda.api.aigateway.v1.GuardrailService.GetGuardrail:output_type -> redpanda.api.aigateway.v1.GetGuardrailResponse + 12, // 21: redpanda.api.aigateway.v1.GuardrailService.ListGuardrails:output_type -> redpanda.api.aigateway.v1.ListGuardrailsResponse + 5, // 22: redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail:output_type -> redpanda.api.aigateway.v1.UpdateGuardrailResponse + 6, // 23: redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail:output_type -> redpanda.api.aigateway.v1.DeleteGuardrailResponse + 19, // [19:24] is the sub-list for method output_type + 14, // [14:19] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_guardrail_proto_init() } +func file_redpanda_api_aigateway_v1_guardrail_proto_init() { + if File_redpanda_api_aigateway_v1_guardrail_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_guardrail_proto_rawDesc, + NumEnums: 3, + NumMessages: 13, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_guardrail_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_guardrail_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_guardrail_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_guardrail_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_guardrail_proto = out.File + file_redpanda_api_aigateway_v1_guardrail_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_guardrail_proto_goTypes = nil + file_redpanda_api_aigateway_v1_guardrail_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.gw.go new file mode 100644 index 0000000000..48e6f932bd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail.pb.gw.go @@ -0,0 +1,987 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/guardrail.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_GuardrailService_CreateGuardrail_0 = &utilities.DoubleArray{Encoding: map[string]int{"guardrail": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_GuardrailService_CreateGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_CreateGuardrail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_CreateGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_CreateGuardrail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GuardrailService_CreateGuardrail_1 = &utilities.DoubleArray{Encoding: map[string]int{"guardrail": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_GuardrailService_CreateGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGuardrailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_CreateGuardrail_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_CreateGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateGuardrailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_CreateGuardrail_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +func request_GuardrailService_GetGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_GetGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +func request_GuardrailService_GetGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_GetGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GuardrailService_ListGuardrails_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_GuardrailService_ListGuardrails_0(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGuardrailsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_ListGuardrails_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListGuardrails(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_ListGuardrails_0(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGuardrailsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_ListGuardrails_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListGuardrails(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GuardrailService_ListGuardrails_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_GuardrailService_ListGuardrails_1(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGuardrailsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_ListGuardrails_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListGuardrails(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_ListGuardrails_1(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListGuardrailsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_ListGuardrails_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListGuardrails(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GuardrailService_UpdateGuardrail_0 = &utilities.DoubleArray{Encoding: map[string]int{"guardrail": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_GuardrailService_UpdateGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Guardrail); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["guardrail.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "guardrail.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "guardrail.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "guardrail.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_UpdateGuardrail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_UpdateGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Guardrail); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["guardrail.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "guardrail.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "guardrail.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "guardrail.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_UpdateGuardrail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +var filter_GuardrailService_UpdateGuardrail_1 = &utilities.DoubleArray{Encoding: map[string]int{"guardrail": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_GuardrailService_UpdateGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Guardrail); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["guardrail.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "guardrail.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "guardrail.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "guardrail.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_UpdateGuardrail_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_UpdateGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Guardrail); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Guardrail); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["guardrail.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "guardrail.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "guardrail.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "guardrail.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GuardrailService_UpdateGuardrail_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +func request_GuardrailService_DeleteGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_DeleteGuardrail_0(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +func request_GuardrailService_DeleteGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, client GuardrailServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteGuardrail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_GuardrailService_DeleteGuardrail_1(ctx context.Context, marshaler runtime.Marshaler, server GuardrailServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteGuardrailRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteGuardrail(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterGuardrailServiceHandlerServer registers the http handlers for service GuardrailService to "mux". +// UnaryRPC :call GuardrailServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterGuardrailServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterGuardrailServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server GuardrailServiceServer) error { + mux.Handle(http.MethodPost, pattern_GuardrailService_CreateGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_CreateGuardrail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_CreateGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_GuardrailService_CreateGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail", runtime.WithHTTPPathPattern("/v1/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_CreateGuardrail_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_CreateGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_GetGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_GetGuardrail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_GetGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_GetGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail", runtime.WithHTTPPathPattern("/v1/{name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_GetGuardrail_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_GetGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_ListGuardrails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_ListGuardrails_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_ListGuardrails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_ListGuardrails_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails", runtime.WithHTTPPathPattern("/v1/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_ListGuardrails_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_ListGuardrails_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GuardrailService_UpdateGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail", runtime.WithHTTPPathPattern("/v1/{guardrail.name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_UpdateGuardrail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_UpdateGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GuardrailService_UpdateGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail", runtime.WithHTTPPathPattern("/v1/{guardrail.name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_UpdateGuardrail_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_UpdateGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GuardrailService_DeleteGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_DeleteGuardrail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_DeleteGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GuardrailService_DeleteGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail", runtime.WithHTTPPathPattern("/v1/{name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GuardrailService_DeleteGuardrail_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_DeleteGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterGuardrailServiceHandlerFromEndpoint is same as RegisterGuardrailServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterGuardrailServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterGuardrailServiceHandler(ctx, mux, conn) +} + +// RegisterGuardrailServiceHandler registers the http handlers for service GuardrailService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterGuardrailServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterGuardrailServiceHandlerClient(ctx, mux, NewGuardrailServiceClient(conn)) +} + +// RegisterGuardrailServiceHandlerClient registers the http handlers for service GuardrailService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "GuardrailServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "GuardrailServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "GuardrailServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterGuardrailServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client GuardrailServiceClient) error { + mux.Handle(http.MethodPost, pattern_GuardrailService_CreateGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_CreateGuardrail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_CreateGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_GuardrailService_CreateGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail", runtime.WithHTTPPathPattern("/v1/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_CreateGuardrail_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_CreateGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_GetGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_GetGuardrail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_GetGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_GetGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail", runtime.WithHTTPPathPattern("/v1/{name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_GetGuardrail_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_GetGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_ListGuardrails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_ListGuardrails_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_ListGuardrails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_GuardrailService_ListGuardrails_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails", runtime.WithHTTPPathPattern("/v1/guardrails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_ListGuardrails_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_ListGuardrails_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GuardrailService_UpdateGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail", runtime.WithHTTPPathPattern("/v1/{guardrail.name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_UpdateGuardrail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_UpdateGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_GuardrailService_UpdateGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail", runtime.WithHTTPPathPattern("/v1/{guardrail.name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_UpdateGuardrail_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_UpdateGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GuardrailService_DeleteGuardrail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_DeleteGuardrail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_DeleteGuardrail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_GuardrailService_DeleteGuardrail_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail", runtime.WithHTTPPathPattern("/v1/{name=guardrails/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GuardrailService_DeleteGuardrail_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_GuardrailService_DeleteGuardrail_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_GuardrailService_CreateGuardrail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "guardrails"}, "")) + pattern_GuardrailService_CreateGuardrail_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "guardrails"}, "")) + pattern_GuardrailService_GetGuardrail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "guardrails", "name"}, "")) + pattern_GuardrailService_GetGuardrail_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "guardrails", "name"}, "")) + pattern_GuardrailService_ListGuardrails_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "guardrails"}, "")) + pattern_GuardrailService_ListGuardrails_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "guardrails"}, "")) + pattern_GuardrailService_UpdateGuardrail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "guardrails", "guardrail.name"}, "")) + pattern_GuardrailService_UpdateGuardrail_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "guardrails", "guardrail.name"}, "")) + pattern_GuardrailService_DeleteGuardrail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "guardrails", "name"}, "")) + pattern_GuardrailService_DeleteGuardrail_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "guardrails", "name"}, "")) +) + +var ( + forward_GuardrailService_CreateGuardrail_0 = runtime.ForwardResponseMessage + forward_GuardrailService_CreateGuardrail_1 = runtime.ForwardResponseMessage + forward_GuardrailService_GetGuardrail_0 = runtime.ForwardResponseMessage + forward_GuardrailService_GetGuardrail_1 = runtime.ForwardResponseMessage + forward_GuardrailService_ListGuardrails_0 = runtime.ForwardResponseMessage + forward_GuardrailService_ListGuardrails_1 = runtime.ForwardResponseMessage + forward_GuardrailService_UpdateGuardrail_0 = runtime.ForwardResponseMessage + forward_GuardrailService_UpdateGuardrail_1 = runtime.ForwardResponseMessage + forward_GuardrailService_DeleteGuardrail_0 = runtime.ForwardResponseMessage + forward_GuardrailService_DeleteGuardrail_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail_grpc.pb.go new file mode 100644 index 0000000000..025908a414 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/guardrail_grpc.pb.go @@ -0,0 +1,274 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/guardrail.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + GuardrailService_CreateGuardrail_FullMethodName = "/redpanda.api.aigateway.v1.GuardrailService/CreateGuardrail" + GuardrailService_GetGuardrail_FullMethodName = "/redpanda.api.aigateway.v1.GuardrailService/GetGuardrail" + GuardrailService_ListGuardrails_FullMethodName = "/redpanda.api.aigateway.v1.GuardrailService/ListGuardrails" + GuardrailService_UpdateGuardrail_FullMethodName = "/redpanda.api.aigateway.v1.GuardrailService/UpdateGuardrail" + GuardrailService_DeleteGuardrail_FullMethodName = "/redpanda.api.aigateway.v1.GuardrailService/DeleteGuardrail" +) + +// GuardrailServiceClient is the client API for GuardrailService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GuardrailServiceClient interface { + CreateGuardrail(ctx context.Context, in *CreateGuardrailRequest, opts ...grpc.CallOption) (*CreateGuardrailResponse, error) + GetGuardrail(ctx context.Context, in *GetGuardrailRequest, opts ...grpc.CallOption) (*GetGuardrailResponse, error) + ListGuardrails(ctx context.Context, in *ListGuardrailsRequest, opts ...grpc.CallOption) (*ListGuardrailsResponse, error) + UpdateGuardrail(ctx context.Context, in *UpdateGuardrailRequest, opts ...grpc.CallOption) (*UpdateGuardrailResponse, error) + DeleteGuardrail(ctx context.Context, in *DeleteGuardrailRequest, opts ...grpc.CallOption) (*DeleteGuardrailResponse, error) +} + +type guardrailServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewGuardrailServiceClient(cc grpc.ClientConnInterface) GuardrailServiceClient { + return &guardrailServiceClient{cc} +} + +func (c *guardrailServiceClient) CreateGuardrail(ctx context.Context, in *CreateGuardrailRequest, opts ...grpc.CallOption) (*CreateGuardrailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateGuardrailResponse) + err := c.cc.Invoke(ctx, GuardrailService_CreateGuardrail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *guardrailServiceClient) GetGuardrail(ctx context.Context, in *GetGuardrailRequest, opts ...grpc.CallOption) (*GetGuardrailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetGuardrailResponse) + err := c.cc.Invoke(ctx, GuardrailService_GetGuardrail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *guardrailServiceClient) ListGuardrails(ctx context.Context, in *ListGuardrailsRequest, opts ...grpc.CallOption) (*ListGuardrailsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListGuardrailsResponse) + err := c.cc.Invoke(ctx, GuardrailService_ListGuardrails_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *guardrailServiceClient) UpdateGuardrail(ctx context.Context, in *UpdateGuardrailRequest, opts ...grpc.CallOption) (*UpdateGuardrailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateGuardrailResponse) + err := c.cc.Invoke(ctx, GuardrailService_UpdateGuardrail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *guardrailServiceClient) DeleteGuardrail(ctx context.Context, in *DeleteGuardrailRequest, opts ...grpc.CallOption) (*DeleteGuardrailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteGuardrailResponse) + err := c.cc.Invoke(ctx, GuardrailService_DeleteGuardrail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GuardrailServiceServer is the server API for GuardrailService service. +// All implementations must embed UnimplementedGuardrailServiceServer +// for forward compatibility. +type GuardrailServiceServer interface { + CreateGuardrail(context.Context, *CreateGuardrailRequest) (*CreateGuardrailResponse, error) + GetGuardrail(context.Context, *GetGuardrailRequest) (*GetGuardrailResponse, error) + ListGuardrails(context.Context, *ListGuardrailsRequest) (*ListGuardrailsResponse, error) + UpdateGuardrail(context.Context, *UpdateGuardrailRequest) (*UpdateGuardrailResponse, error) + DeleteGuardrail(context.Context, *DeleteGuardrailRequest) (*DeleteGuardrailResponse, error) + mustEmbedUnimplementedGuardrailServiceServer() +} + +// UnimplementedGuardrailServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedGuardrailServiceServer struct{} + +func (UnimplementedGuardrailServiceServer) CreateGuardrail(context.Context, *CreateGuardrailRequest) (*CreateGuardrailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGuardrail not implemented") +} +func (UnimplementedGuardrailServiceServer) GetGuardrail(context.Context, *GetGuardrailRequest) (*GetGuardrailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGuardrail not implemented") +} +func (UnimplementedGuardrailServiceServer) ListGuardrails(context.Context, *ListGuardrailsRequest) (*ListGuardrailsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGuardrails not implemented") +} +func (UnimplementedGuardrailServiceServer) UpdateGuardrail(context.Context, *UpdateGuardrailRequest) (*UpdateGuardrailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGuardrail not implemented") +} +func (UnimplementedGuardrailServiceServer) DeleteGuardrail(context.Context, *DeleteGuardrailRequest) (*DeleteGuardrailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGuardrail not implemented") +} +func (UnimplementedGuardrailServiceServer) mustEmbedUnimplementedGuardrailServiceServer() {} +func (UnimplementedGuardrailServiceServer) testEmbeddedByValue() {} + +// UnsafeGuardrailServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GuardrailServiceServer will +// result in compilation errors. +type UnsafeGuardrailServiceServer interface { + mustEmbedUnimplementedGuardrailServiceServer() +} + +func RegisterGuardrailServiceServer(s grpc.ServiceRegistrar, srv GuardrailServiceServer) { + // If the following call pancis, it indicates UnimplementedGuardrailServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&GuardrailService_ServiceDesc, srv) +} + +func _GuardrailService_CreateGuardrail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGuardrailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GuardrailServiceServer).CreateGuardrail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GuardrailService_CreateGuardrail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GuardrailServiceServer).CreateGuardrail(ctx, req.(*CreateGuardrailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GuardrailService_GetGuardrail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGuardrailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GuardrailServiceServer).GetGuardrail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GuardrailService_GetGuardrail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GuardrailServiceServer).GetGuardrail(ctx, req.(*GetGuardrailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GuardrailService_ListGuardrails_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGuardrailsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GuardrailServiceServer).ListGuardrails(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GuardrailService_ListGuardrails_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GuardrailServiceServer).ListGuardrails(ctx, req.(*ListGuardrailsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GuardrailService_UpdateGuardrail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGuardrailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GuardrailServiceServer).UpdateGuardrail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GuardrailService_UpdateGuardrail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GuardrailServiceServer).UpdateGuardrail(ctx, req.(*UpdateGuardrailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GuardrailService_DeleteGuardrail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGuardrailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GuardrailServiceServer).DeleteGuardrail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GuardrailService_DeleteGuardrail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GuardrailServiceServer).DeleteGuardrail(ctx, req.(*DeleteGuardrailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// GuardrailService_ServiceDesc is the grpc.ServiceDesc for GuardrailService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var GuardrailService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.GuardrailService", + HandlerType: (*GuardrailServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateGuardrail", + Handler: _GuardrailService_CreateGuardrail_Handler, + }, + { + MethodName: "GetGuardrail", + Handler: _GuardrailService_GetGuardrail_Handler, + }, + { + MethodName: "ListGuardrails", + Handler: _GuardrailService_ListGuardrails_Handler, + }, + { + MethodName: "UpdateGuardrail", + Handler: _GuardrailService_UpdateGuardrail_Handler, + }, + { + MethodName: "DeleteGuardrail", + Handler: _GuardrailService_DeleteGuardrail_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/guardrail.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.go new file mode 100644 index 0000000000..4c89f44891 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.go @@ -0,0 +1,1037 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/iam_settings.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// IAMSettingCategory defines setting categories. +type IAMSettingCategory int32 + +const ( + IAMSettingCategory_IAM_SETTING_CATEGORY_UNSPECIFIED IAMSettingCategory = 0 + // Security settings (hash algorithms, password policies) + IAMSettingCategory_IAM_SETTING_CATEGORY_SECURITY IAMSettingCategory = 1 + // OAuth2 settings (issuer, token lifetimes) + IAMSettingCategory_IAM_SETTING_CATEGORY_OAUTH2 IAMSettingCategory = 2 + // OIDC settings (auto-provisioning, claim mappings) + IAMSettingCategory_IAM_SETTING_CATEGORY_OIDC IAMSettingCategory = 3 + // JWKS settings (key rotation) + IAMSettingCategory_IAM_SETTING_CATEGORY_JWKS IAMSettingCategory = 4 + // Access control settings (default policies) + IAMSettingCategory_IAM_SETTING_CATEGORY_ACCESS_CONTROL IAMSettingCategory = 5 + // System settings (general configuration) + IAMSettingCategory_IAM_SETTING_CATEGORY_SYSTEM IAMSettingCategory = 6 +) + +// Enum value maps for IAMSettingCategory. +var ( + IAMSettingCategory_name = map[int32]string{ + 0: "IAM_SETTING_CATEGORY_UNSPECIFIED", + 1: "IAM_SETTING_CATEGORY_SECURITY", + 2: "IAM_SETTING_CATEGORY_OAUTH2", + 3: "IAM_SETTING_CATEGORY_OIDC", + 4: "IAM_SETTING_CATEGORY_JWKS", + 5: "IAM_SETTING_CATEGORY_ACCESS_CONTROL", + 6: "IAM_SETTING_CATEGORY_SYSTEM", + } + IAMSettingCategory_value = map[string]int32{ + "IAM_SETTING_CATEGORY_UNSPECIFIED": 0, + "IAM_SETTING_CATEGORY_SECURITY": 1, + "IAM_SETTING_CATEGORY_OAUTH2": 2, + "IAM_SETTING_CATEGORY_OIDC": 3, + "IAM_SETTING_CATEGORY_JWKS": 4, + "IAM_SETTING_CATEGORY_ACCESS_CONTROL": 5, + "IAM_SETTING_CATEGORY_SYSTEM": 6, + } +) + +func (x IAMSettingCategory) Enum() *IAMSettingCategory { + p := new(IAMSettingCategory) + *p = x + return p +} + +func (x IAMSettingCategory) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IAMSettingCategory) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_iam_settings_proto_enumTypes[0].Descriptor() +} + +func (IAMSettingCategory) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_iam_settings_proto_enumTypes[0] +} + +func (x IAMSettingCategory) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IAMSettingCategory.Descriptor instead. +func (IAMSettingCategory) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{0} +} + +// IAMSetting represents a single IAM configuration setting. +type IAMSetting struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Setting key (e.g., "security.default_hash_algorithm") + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Setting value as JSON + Value *structpb.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // Human-readable description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Setting category + Category IAMSettingCategory `protobuf:"varint,4,opt,name=category,proto3,enum=redpanda.api.aigateway.v1.IAMSettingCategory" json:"category,omitempty"` + // Whether this setting contains sensitive data (masked in UI) + Sensitive bool `protobuf:"varint,5,opt,name=sensitive,proto3" json:"sensitive,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,7,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IAMSetting) Reset() { + *x = IAMSetting{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IAMSetting) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IAMSetting) ProtoMessage() {} + +func (x *IAMSetting) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IAMSetting.ProtoReflect.Descriptor instead. +func (*IAMSetting) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{0} +} + +func (x *IAMSetting) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *IAMSetting) GetValue() *structpb.Value { + if x != nil { + return x.Value + } + return nil +} + +func (x *IAMSetting) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *IAMSetting) GetCategory() IAMSettingCategory { + if x != nil { + return x.Category + } + return IAMSettingCategory_IAM_SETTING_CATEGORY_UNSPECIFIED +} + +func (x *IAMSetting) GetSensitive() bool { + if x != nil { + return x.Sensitive + } + return false +} + +func (x *IAMSetting) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *IAMSetting) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// Request message for GetIAMSetting RPC. +type GetIAMSettingRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Setting key. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIAMSettingRequest) Reset() { + *x = GetIAMSettingRequest{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIAMSettingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIAMSettingRequest) ProtoMessage() {} + +func (x *GetIAMSettingRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetIAMSettingRequest.ProtoReflect.Descriptor instead. +func (*GetIAMSettingRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{1} +} + +func (x *GetIAMSettingRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +// Response message for GetIAMSetting RPC. +type GetIAMSettingResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Setting *IAMSetting `protobuf:"bytes,1,opt,name=setting,proto3" json:"setting,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIAMSettingResponse) Reset() { + *x = GetIAMSettingResponse{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIAMSettingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIAMSettingResponse) ProtoMessage() {} + +func (x *GetIAMSettingResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetIAMSettingResponse.ProtoReflect.Descriptor instead. +func (*GetIAMSettingResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{2} +} + +func (x *GetIAMSettingResponse) GetSetting() *IAMSetting { + if x != nil { + return x.Setting + } + return nil +} + +// Request message for ListIAMSettings RPC. +type ListIAMSettingsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Filter by category (optional) + Category IAMSettingCategory `protobuf:"varint,1,opt,name=category,proto3,enum=redpanda.api.aigateway.v1.IAMSettingCategory" json:"category,omitempty"` + // Whether to include sensitive settings (values will be masked) + IncludeSensitive bool `protobuf:"varint,2,opt,name=include_sensitive,json=includeSensitive,proto3" json:"include_sensitive,omitempty"` + // Maximum number of settings to return (max 100) + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIAMSettingsRequest) Reset() { + *x = ListIAMSettingsRequest{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIAMSettingsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIAMSettingsRequest) ProtoMessage() {} + +func (x *ListIAMSettingsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIAMSettingsRequest.ProtoReflect.Descriptor instead. +func (*ListIAMSettingsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{3} +} + +func (x *ListIAMSettingsRequest) GetCategory() IAMSettingCategory { + if x != nil { + return x.Category + } + return IAMSettingCategory_IAM_SETTING_CATEGORY_UNSPECIFIED +} + +func (x *ListIAMSettingsRequest) GetIncludeSensitive() bool { + if x != nil { + return x.IncludeSensitive + } + return false +} + +func (x *ListIAMSettingsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListIAMSettingsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListIAMSettings RPC. +type ListIAMSettingsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of settings + Settings []*IAMSetting `protobuf:"bytes,1,rep,name=settings,proto3" json:"settings,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIAMSettingsResponse) Reset() { + *x = ListIAMSettingsResponse{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIAMSettingsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIAMSettingsResponse) ProtoMessage() {} + +func (x *ListIAMSettingsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIAMSettingsResponse.ProtoReflect.Descriptor instead. +func (*ListIAMSettingsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{4} +} + +func (x *ListIAMSettingsResponse) GetSettings() []*IAMSetting { + if x != nil { + return x.Settings + } + return nil +} + +func (x *ListIAMSettingsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListIAMSettingsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateIAMSetting RPC. +type UpdateIAMSettingRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Setting key. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Required: New value. + Value *structpb.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIAMSettingRequest) Reset() { + *x = UpdateIAMSettingRequest{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIAMSettingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIAMSettingRequest) ProtoMessage() {} + +func (x *UpdateIAMSettingRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateIAMSettingRequest.ProtoReflect.Descriptor instead. +func (*UpdateIAMSettingRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{5} +} + +func (x *UpdateIAMSettingRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *UpdateIAMSettingRequest) GetValue() *structpb.Value { + if x != nil { + return x.Value + } + return nil +} + +// Response message for UpdateIAMSetting RPC. +type UpdateIAMSettingResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Setting *IAMSetting `protobuf:"bytes,1,opt,name=setting,proto3" json:"setting,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIAMSettingResponse) Reset() { + *x = UpdateIAMSettingResponse{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIAMSettingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIAMSettingResponse) ProtoMessage() {} + +func (x *UpdateIAMSettingResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateIAMSettingResponse.ProtoReflect.Descriptor instead. +func (*UpdateIAMSettingResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{6} +} + +func (x *UpdateIAMSettingResponse) GetSetting() *IAMSetting { + if x != nil { + return x.Setting + } + return nil +} + +// Request message for BatchUpdateIAMSettings RPC. +type BatchUpdateIAMSettingsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Settings to update + Settings []*IAMSettingUpdate `protobuf:"bytes,1,rep,name=settings,proto3" json:"settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BatchUpdateIAMSettingsRequest) Reset() { + *x = BatchUpdateIAMSettingsRequest{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BatchUpdateIAMSettingsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateIAMSettingsRequest) ProtoMessage() {} + +func (x *BatchUpdateIAMSettingsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateIAMSettingsRequest.ProtoReflect.Descriptor instead. +func (*BatchUpdateIAMSettingsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{7} +} + +func (x *BatchUpdateIAMSettingsRequest) GetSettings() []*IAMSettingUpdate { + if x != nil { + return x.Settings + } + return nil +} + +// IAMSettingUpdate represents a single setting update in a batch. +type IAMSettingUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Setting key. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Required: New value. + Value *structpb.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IAMSettingUpdate) Reset() { + *x = IAMSettingUpdate{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IAMSettingUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IAMSettingUpdate) ProtoMessage() {} + +func (x *IAMSettingUpdate) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IAMSettingUpdate.ProtoReflect.Descriptor instead. +func (*IAMSettingUpdate) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{8} +} + +func (x *IAMSettingUpdate) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *IAMSettingUpdate) GetValue() *structpb.Value { + if x != nil { + return x.Value + } + return nil +} + +// Response message for BatchUpdateIAMSettings RPC. +type BatchUpdateIAMSettingsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Updated settings + Settings []*IAMSetting `protobuf:"bytes,1,rep,name=settings,proto3" json:"settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BatchUpdateIAMSettingsResponse) Reset() { + *x = BatchUpdateIAMSettingsResponse{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BatchUpdateIAMSettingsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateIAMSettingsResponse) ProtoMessage() {} + +func (x *BatchUpdateIAMSettingsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateIAMSettingsResponse.ProtoReflect.Descriptor instead. +func (*BatchUpdateIAMSettingsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{9} +} + +func (x *BatchUpdateIAMSettingsResponse) GetSettings() []*IAMSetting { + if x != nil { + return x.Settings + } + return nil +} + +// Request message for DeleteIAMSetting RPC. +type DeleteIAMSettingRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Setting key. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteIAMSettingRequest) Reset() { + *x = DeleteIAMSettingRequest{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteIAMSettingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteIAMSettingRequest) ProtoMessage() {} + +func (x *DeleteIAMSettingRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteIAMSettingRequest.ProtoReflect.Descriptor instead. +func (*DeleteIAMSettingRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteIAMSettingRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +// Response message for DeleteIAMSetting RPC. +type DeleteIAMSettingResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteIAMSettingResponse) Reset() { + *x = DeleteIAMSettingResponse{} + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteIAMSettingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteIAMSettingResponse) ProtoMessage() {} + +func (x *DeleteIAMSettingResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteIAMSettingResponse.ProtoReflect.Descriptor instead. +func (*DeleteIAMSettingResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP(), []int{11} +} + +var File_redpanda_api_aigateway_v1_iam_settings_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_iam_settings_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x5f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x02, + 0x0a, 0x0a, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, + 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x22, 0x2d, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x58, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xe9, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x41, + 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x4e, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x30, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x12, 0x29, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x06, 0x1a, 0x04, 0x18, + 0x64, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0xa3, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5b, 0x0a, 0x18, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x6d, 0x0a, 0x1d, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5c, 0x0a, 0x10, 0x49, 0x41, 0x4d, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x30, 0x0a, 0x17, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x1a, 0x0a, + 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x86, 0x02, 0x0a, 0x12, 0x49, 0x41, + 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x24, 0x0a, 0x20, 0x49, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, + 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x41, 0x4d, 0x5f, 0x53, 0x45, + 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, + 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x41, 0x4d, + 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, + 0x59, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x41, + 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, + 0x52, 0x59, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x41, 0x4d, + 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, + 0x59, 0x5f, 0x4a, 0x57, 0x4b, 0x53, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x41, 0x4d, 0x5f, + 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, + 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x10, + 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x41, 0x4d, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, + 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, + 0x10, 0x06, 0x32, 0xd1, 0x06, 0x0a, 0x12, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x41, 0x4d, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x92, + 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, + 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x1a, 0x16, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, + 0x6b, 0x65, 0x79, 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, + 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x9b, 0x01, + 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x41, 0x4d, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x1a, 0x19, 0xca, 0x41, 0x16, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x85, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x49, 0x61, 0x6d, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, + 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, + 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescData = file_redpanda_api_aigateway_v1_iam_settings_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_iam_settings_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_iam_settings_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_iam_settings_proto_goTypes = []any{ + (IAMSettingCategory)(0), // 0: redpanda.api.aigateway.v1.IAMSettingCategory + (*IAMSetting)(nil), // 1: redpanda.api.aigateway.v1.IAMSetting + (*GetIAMSettingRequest)(nil), // 2: redpanda.api.aigateway.v1.GetIAMSettingRequest + (*GetIAMSettingResponse)(nil), // 3: redpanda.api.aigateway.v1.GetIAMSettingResponse + (*ListIAMSettingsRequest)(nil), // 4: redpanda.api.aigateway.v1.ListIAMSettingsRequest + (*ListIAMSettingsResponse)(nil), // 5: redpanda.api.aigateway.v1.ListIAMSettingsResponse + (*UpdateIAMSettingRequest)(nil), // 6: redpanda.api.aigateway.v1.UpdateIAMSettingRequest + (*UpdateIAMSettingResponse)(nil), // 7: redpanda.api.aigateway.v1.UpdateIAMSettingResponse + (*BatchUpdateIAMSettingsRequest)(nil), // 8: redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest + (*IAMSettingUpdate)(nil), // 9: redpanda.api.aigateway.v1.IAMSettingUpdate + (*BatchUpdateIAMSettingsResponse)(nil), // 10: redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse + (*DeleteIAMSettingRequest)(nil), // 11: redpanda.api.aigateway.v1.DeleteIAMSettingRequest + (*DeleteIAMSettingResponse)(nil), // 12: redpanda.api.aigateway.v1.DeleteIAMSettingResponse + (*structpb.Value)(nil), // 13: google.protobuf.Value + (*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_iam_settings_proto_depIdxs = []int32{ + 13, // 0: redpanda.api.aigateway.v1.IAMSetting.value:type_name -> google.protobuf.Value + 0, // 1: redpanda.api.aigateway.v1.IAMSetting.category:type_name -> redpanda.api.aigateway.v1.IAMSettingCategory + 14, // 2: redpanda.api.aigateway.v1.IAMSetting.update_time:type_name -> google.protobuf.Timestamp + 1, // 3: redpanda.api.aigateway.v1.GetIAMSettingResponse.setting:type_name -> redpanda.api.aigateway.v1.IAMSetting + 0, // 4: redpanda.api.aigateway.v1.ListIAMSettingsRequest.category:type_name -> redpanda.api.aigateway.v1.IAMSettingCategory + 1, // 5: redpanda.api.aigateway.v1.ListIAMSettingsResponse.settings:type_name -> redpanda.api.aigateway.v1.IAMSetting + 13, // 6: redpanda.api.aigateway.v1.UpdateIAMSettingRequest.value:type_name -> google.protobuf.Value + 1, // 7: redpanda.api.aigateway.v1.UpdateIAMSettingResponse.setting:type_name -> redpanda.api.aigateway.v1.IAMSetting + 9, // 8: redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest.settings:type_name -> redpanda.api.aigateway.v1.IAMSettingUpdate + 13, // 9: redpanda.api.aigateway.v1.IAMSettingUpdate.value:type_name -> google.protobuf.Value + 1, // 10: redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse.settings:type_name -> redpanda.api.aigateway.v1.IAMSetting + 2, // 11: redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting:input_type -> redpanda.api.aigateway.v1.GetIAMSettingRequest + 4, // 12: redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings:input_type -> redpanda.api.aigateway.v1.ListIAMSettingsRequest + 6, // 13: redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting:input_type -> redpanda.api.aigateway.v1.UpdateIAMSettingRequest + 8, // 14: redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings:input_type -> redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest + 11, // 15: redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting:input_type -> redpanda.api.aigateway.v1.DeleteIAMSettingRequest + 3, // 16: redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting:output_type -> redpanda.api.aigateway.v1.GetIAMSettingResponse + 5, // 17: redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings:output_type -> redpanda.api.aigateway.v1.ListIAMSettingsResponse + 7, // 18: redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting:output_type -> redpanda.api.aigateway.v1.UpdateIAMSettingResponse + 10, // 19: redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings:output_type -> redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse + 12, // 20: redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting:output_type -> redpanda.api.aigateway.v1.DeleteIAMSettingResponse + 16, // [16:21] is the sub-list for method output_type + 11, // [11:16] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_iam_settings_proto_init() } +func file_redpanda_api_aigateway_v1_iam_settings_proto_init() { + if File_redpanda_api_aigateway_v1_iam_settings_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_iam_settings_proto_rawDesc, + NumEnums: 1, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_iam_settings_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_iam_settings_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_iam_settings_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_iam_settings_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_iam_settings_proto = out.File + file_redpanda_api_aigateway_v1_iam_settings_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_iam_settings_proto_goTypes = nil + file_redpanda_api_aigateway_v1_iam_settings_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.gw.go new file mode 100644 index 0000000000..8650489abd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings.pb.gw.go @@ -0,0 +1,471 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/iam_settings.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_IAMSettingsService_GetIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, client IAMSettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := client.GetIAMSetting(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_IAMSettingsService_GetIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, server IAMSettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := server.GetIAMSetting(ctx, &protoReq) + return msg, metadata, err +} + +var filter_IAMSettingsService_ListIAMSettings_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_IAMSettingsService_ListIAMSettings_0(ctx context.Context, marshaler runtime.Marshaler, client IAMSettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListIAMSettingsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IAMSettingsService_ListIAMSettings_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListIAMSettings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_IAMSettingsService_ListIAMSettings_0(ctx context.Context, marshaler runtime.Marshaler, server IAMSettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListIAMSettingsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_IAMSettingsService_ListIAMSettings_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListIAMSettings(ctx, &protoReq) + return msg, metadata, err +} + +func request_IAMSettingsService_UpdateIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, client IAMSettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := client.UpdateIAMSetting(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_IAMSettingsService_UpdateIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, server IAMSettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := server.UpdateIAMSetting(ctx, &protoReq) + return msg, metadata, err +} + +func request_IAMSettingsService_BatchUpdateIAMSettings_0(ctx context.Context, marshaler runtime.Marshaler, client IAMSettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq BatchUpdateIAMSettingsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.BatchUpdateIAMSettings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_IAMSettingsService_BatchUpdateIAMSettings_0(ctx context.Context, marshaler runtime.Marshaler, server IAMSettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq BatchUpdateIAMSettingsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.BatchUpdateIAMSettings(ctx, &protoReq) + return msg, metadata, err +} + +func request_IAMSettingsService_DeleteIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, client IAMSettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := client.DeleteIAMSetting(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_IAMSettingsService_DeleteIAMSetting_0(ctx context.Context, marshaler runtime.Marshaler, server IAMSettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteIAMSettingRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") + } + protoReq.Key, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) + } + msg, err := server.DeleteIAMSetting(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterIAMSettingsServiceHandlerServer registers the http handlers for service IAMSettingsService to "mux". +// UnaryRPC :call IAMSettingsServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterIAMSettingsServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterIAMSettingsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server IAMSettingsServiceServer) error { + mux.Handle(http.MethodGet, pattern_IAMSettingsService_GetIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/GetIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_IAMSettingsService_GetIAMSetting_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_GetIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_IAMSettingsService_ListIAMSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/ListIAMSettings", runtime.WithHTTPPathPattern("/v1/iam/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_IAMSettingsService_ListIAMSettings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_ListIAMSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_IAMSettingsService_UpdateIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/UpdateIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_IAMSettingsService_UpdateIAMSetting_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_UpdateIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_IAMSettingsService_BatchUpdateIAMSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/BatchUpdateIAMSettings", runtime.WithHTTPPathPattern("/v1/iam/settings:batchUpdate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_IAMSettingsService_BatchUpdateIAMSettings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_BatchUpdateIAMSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_IAMSettingsService_DeleteIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/DeleteIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_IAMSettingsService_DeleteIAMSetting_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_DeleteIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterIAMSettingsServiceHandlerFromEndpoint is same as RegisterIAMSettingsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterIAMSettingsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterIAMSettingsServiceHandler(ctx, mux, conn) +} + +// RegisterIAMSettingsServiceHandler registers the http handlers for service IAMSettingsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterIAMSettingsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterIAMSettingsServiceHandlerClient(ctx, mux, NewIAMSettingsServiceClient(conn)) +} + +// RegisterIAMSettingsServiceHandlerClient registers the http handlers for service IAMSettingsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "IAMSettingsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "IAMSettingsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "IAMSettingsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterIAMSettingsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client IAMSettingsServiceClient) error { + mux.Handle(http.MethodGet, pattern_IAMSettingsService_GetIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/GetIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_IAMSettingsService_GetIAMSetting_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_GetIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_IAMSettingsService_ListIAMSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/ListIAMSettings", runtime.WithHTTPPathPattern("/v1/iam/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_IAMSettingsService_ListIAMSettings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_ListIAMSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_IAMSettingsService_UpdateIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/UpdateIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_IAMSettingsService_UpdateIAMSetting_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_UpdateIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_IAMSettingsService_BatchUpdateIAMSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/BatchUpdateIAMSettings", runtime.WithHTTPPathPattern("/v1/iam/settings:batchUpdate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_IAMSettingsService_BatchUpdateIAMSettings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_BatchUpdateIAMSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_IAMSettingsService_DeleteIAMSetting_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.IAMSettingsService/DeleteIAMSetting", runtime.WithHTTPPathPattern("/v1/iam/settings/{key}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_IAMSettingsService_DeleteIAMSetting_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_IAMSettingsService_DeleteIAMSetting_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_IAMSettingsService_GetIAMSetting_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "iam", "settings", "key"}, "")) + pattern_IAMSettingsService_ListIAMSettings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "iam", "settings"}, "")) + pattern_IAMSettingsService_UpdateIAMSetting_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "iam", "settings", "key"}, "")) + pattern_IAMSettingsService_BatchUpdateIAMSettings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "iam", "settings"}, "batchUpdate")) + pattern_IAMSettingsService_DeleteIAMSetting_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "iam", "settings", "key"}, "")) +) + +var ( + forward_IAMSettingsService_GetIAMSetting_0 = runtime.ForwardResponseMessage + forward_IAMSettingsService_ListIAMSettings_0 = runtime.ForwardResponseMessage + forward_IAMSettingsService_UpdateIAMSetting_0 = runtime.ForwardResponseMessage + forward_IAMSettingsService_BatchUpdateIAMSettings_0 = runtime.ForwardResponseMessage + forward_IAMSettingsService_DeleteIAMSetting_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings_grpc.pb.go new file mode 100644 index 0000000000..c3946e0262 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/iam_settings_grpc.pb.go @@ -0,0 +1,292 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/iam_settings.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + IAMSettingsService_GetIAMSetting_FullMethodName = "/redpanda.api.aigateway.v1.IAMSettingsService/GetIAMSetting" + IAMSettingsService_ListIAMSettings_FullMethodName = "/redpanda.api.aigateway.v1.IAMSettingsService/ListIAMSettings" + IAMSettingsService_UpdateIAMSetting_FullMethodName = "/redpanda.api.aigateway.v1.IAMSettingsService/UpdateIAMSetting" + IAMSettingsService_BatchUpdateIAMSettings_FullMethodName = "/redpanda.api.aigateway.v1.IAMSettingsService/BatchUpdateIAMSettings" + IAMSettingsService_DeleteIAMSetting_FullMethodName = "/redpanda.api.aigateway.v1.IAMSettingsService/DeleteIAMSetting" +) + +// IAMSettingsServiceClient is the client API for IAMSettingsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// IAMSettingsService manages IAM-related system settings. +// Settings are stored as key-value pairs organized by category. +// Categories: security, oauth2, oidc, jwks, access_control, system +type IAMSettingsServiceClient interface { + // Gets a specific IAM setting by key. + GetIAMSetting(ctx context.Context, in *GetIAMSettingRequest, opts ...grpc.CallOption) (*GetIAMSettingResponse, error) + // Lists IAM settings, optionally filtered by category. + ListIAMSettings(ctx context.Context, in *ListIAMSettingsRequest, opts ...grpc.CallOption) (*ListIAMSettingsResponse, error) + // Updates an IAM setting. + UpdateIAMSetting(ctx context.Context, in *UpdateIAMSettingRequest, opts ...grpc.CallOption) (*UpdateIAMSettingResponse, error) + // Batch updates multiple IAM settings. + BatchUpdateIAMSettings(ctx context.Context, in *BatchUpdateIAMSettingsRequest, opts ...grpc.CallOption) (*BatchUpdateIAMSettingsResponse, error) + // Deletes an IAM setting (resets to default). + DeleteIAMSetting(ctx context.Context, in *DeleteIAMSettingRequest, opts ...grpc.CallOption) (*DeleteIAMSettingResponse, error) +} + +type iAMSettingsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewIAMSettingsServiceClient(cc grpc.ClientConnInterface) IAMSettingsServiceClient { + return &iAMSettingsServiceClient{cc} +} + +func (c *iAMSettingsServiceClient) GetIAMSetting(ctx context.Context, in *GetIAMSettingRequest, opts ...grpc.CallOption) (*GetIAMSettingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetIAMSettingResponse) + err := c.cc.Invoke(ctx, IAMSettingsService_GetIAMSetting_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMSettingsServiceClient) ListIAMSettings(ctx context.Context, in *ListIAMSettingsRequest, opts ...grpc.CallOption) (*ListIAMSettingsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListIAMSettingsResponse) + err := c.cc.Invoke(ctx, IAMSettingsService_ListIAMSettings_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMSettingsServiceClient) UpdateIAMSetting(ctx context.Context, in *UpdateIAMSettingRequest, opts ...grpc.CallOption) (*UpdateIAMSettingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateIAMSettingResponse) + err := c.cc.Invoke(ctx, IAMSettingsService_UpdateIAMSetting_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMSettingsServiceClient) BatchUpdateIAMSettings(ctx context.Context, in *BatchUpdateIAMSettingsRequest, opts ...grpc.CallOption) (*BatchUpdateIAMSettingsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(BatchUpdateIAMSettingsResponse) + err := c.cc.Invoke(ctx, IAMSettingsService_BatchUpdateIAMSettings_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMSettingsServiceClient) DeleteIAMSetting(ctx context.Context, in *DeleteIAMSettingRequest, opts ...grpc.CallOption) (*DeleteIAMSettingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteIAMSettingResponse) + err := c.cc.Invoke(ctx, IAMSettingsService_DeleteIAMSetting_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IAMSettingsServiceServer is the server API for IAMSettingsService service. +// All implementations must embed UnimplementedIAMSettingsServiceServer +// for forward compatibility. +// +// IAMSettingsService manages IAM-related system settings. +// Settings are stored as key-value pairs organized by category. +// Categories: security, oauth2, oidc, jwks, access_control, system +type IAMSettingsServiceServer interface { + // Gets a specific IAM setting by key. + GetIAMSetting(context.Context, *GetIAMSettingRequest) (*GetIAMSettingResponse, error) + // Lists IAM settings, optionally filtered by category. + ListIAMSettings(context.Context, *ListIAMSettingsRequest) (*ListIAMSettingsResponse, error) + // Updates an IAM setting. + UpdateIAMSetting(context.Context, *UpdateIAMSettingRequest) (*UpdateIAMSettingResponse, error) + // Batch updates multiple IAM settings. + BatchUpdateIAMSettings(context.Context, *BatchUpdateIAMSettingsRequest) (*BatchUpdateIAMSettingsResponse, error) + // Deletes an IAM setting (resets to default). + DeleteIAMSetting(context.Context, *DeleteIAMSettingRequest) (*DeleteIAMSettingResponse, error) + mustEmbedUnimplementedIAMSettingsServiceServer() +} + +// UnimplementedIAMSettingsServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIAMSettingsServiceServer struct{} + +func (UnimplementedIAMSettingsServiceServer) GetIAMSetting(context.Context, *GetIAMSettingRequest) (*GetIAMSettingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIAMSetting not implemented") +} +func (UnimplementedIAMSettingsServiceServer) ListIAMSettings(context.Context, *ListIAMSettingsRequest) (*ListIAMSettingsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListIAMSettings not implemented") +} +func (UnimplementedIAMSettingsServiceServer) UpdateIAMSetting(context.Context, *UpdateIAMSettingRequest) (*UpdateIAMSettingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateIAMSetting not implemented") +} +func (UnimplementedIAMSettingsServiceServer) BatchUpdateIAMSettings(context.Context, *BatchUpdateIAMSettingsRequest) (*BatchUpdateIAMSettingsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchUpdateIAMSettings not implemented") +} +func (UnimplementedIAMSettingsServiceServer) DeleteIAMSetting(context.Context, *DeleteIAMSettingRequest) (*DeleteIAMSettingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteIAMSetting not implemented") +} +func (UnimplementedIAMSettingsServiceServer) mustEmbedUnimplementedIAMSettingsServiceServer() {} +func (UnimplementedIAMSettingsServiceServer) testEmbeddedByValue() {} + +// UnsafeIAMSettingsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IAMSettingsServiceServer will +// result in compilation errors. +type UnsafeIAMSettingsServiceServer interface { + mustEmbedUnimplementedIAMSettingsServiceServer() +} + +func RegisterIAMSettingsServiceServer(s grpc.ServiceRegistrar, srv IAMSettingsServiceServer) { + // If the following call pancis, it indicates UnimplementedIAMSettingsServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IAMSettingsService_ServiceDesc, srv) +} + +func _IAMSettingsService_GetIAMSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetIAMSettingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMSettingsServiceServer).GetIAMSetting(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMSettingsService_GetIAMSetting_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMSettingsServiceServer).GetIAMSetting(ctx, req.(*GetIAMSettingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMSettingsService_ListIAMSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListIAMSettingsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMSettingsServiceServer).ListIAMSettings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMSettingsService_ListIAMSettings_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMSettingsServiceServer).ListIAMSettings(ctx, req.(*ListIAMSettingsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMSettingsService_UpdateIAMSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateIAMSettingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMSettingsServiceServer).UpdateIAMSetting(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMSettingsService_UpdateIAMSetting_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMSettingsServiceServer).UpdateIAMSetting(ctx, req.(*UpdateIAMSettingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMSettingsService_BatchUpdateIAMSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchUpdateIAMSettingsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMSettingsServiceServer).BatchUpdateIAMSettings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMSettingsService_BatchUpdateIAMSettings_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMSettingsServiceServer).BatchUpdateIAMSettings(ctx, req.(*BatchUpdateIAMSettingsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMSettingsService_DeleteIAMSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteIAMSettingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMSettingsServiceServer).DeleteIAMSetting(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMSettingsService_DeleteIAMSetting_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMSettingsServiceServer).DeleteIAMSetting(ctx, req.(*DeleteIAMSettingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IAMSettingsService_ServiceDesc is the grpc.ServiceDesc for IAMSettingsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IAMSettingsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.IAMSettingsService", + HandlerType: (*IAMSettingsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetIAMSetting", + Handler: _IAMSettingsService_GetIAMSetting_Handler, + }, + { + MethodName: "ListIAMSettings", + Handler: _IAMSettingsService_ListIAMSettings_Handler, + }, + { + MethodName: "UpdateIAMSetting", + Handler: _IAMSettingsService_UpdateIAMSetting_Handler, + }, + { + MethodName: "BatchUpdateIAMSettings", + Handler: _IAMSettingsService_BatchUpdateIAMSettings_Handler, + }, + { + MethodName: "DeleteIAMSetting", + Handler: _IAMSettingsService_DeleteIAMSetting_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/iam_settings.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.go new file mode 100644 index 0000000000..7cc6322656 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.go @@ -0,0 +1,339 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/mcp_tools.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Request message for ListMCPTools +type ListMCPToolsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Gateway resource name (format: gateways/{gateway_id}) + // The gateway must have MCP orchestration configured + GatewayName string `protobuf:"bytes,1,opt,name=gateway_name,json=gatewayName,proto3" json:"gateway_name,omitempty"` + // Optional search query to filter tools by name or description + Search string `protobuf:"bytes,2,opt,name=search,proto3" json:"search,omitempty"` + // Optional category filter (e.g., "file", "web", "code", "database", "system") + Category string `protobuf:"bytes,3,opt,name=category,proto3" json:"category,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListMCPToolsRequest) Reset() { + *x = ListMCPToolsRequest{} + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListMCPToolsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMCPToolsRequest) ProtoMessage() {} + +func (x *ListMCPToolsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListMCPToolsRequest.ProtoReflect.Descriptor instead. +func (*ListMCPToolsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescGZIP(), []int{0} +} + +func (x *ListMCPToolsRequest) GetGatewayName() string { + if x != nil { + return x.GatewayName + } + return "" +} + +func (x *ListMCPToolsRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *ListMCPToolsRequest) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +// Response message for ListMCPTools +type ListMCPToolsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // List of MCP tools available in the gateway + Tools []*MCPTool `protobuf:"bytes,1,rep,name=tools,proto3" json:"tools,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListMCPToolsResponse) Reset() { + *x = ListMCPToolsResponse{} + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListMCPToolsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMCPToolsResponse) ProtoMessage() {} + +func (x *ListMCPToolsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListMCPToolsResponse.ProtoReflect.Descriptor instead. +func (*ListMCPToolsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescGZIP(), []int{1} +} + +func (x *ListMCPToolsResponse) GetTools() []*MCPTool { + if x != nil { + return x.Tools + } + return nil +} + +// MCPTool represents a tool available via the Model Context Protocol +type MCPTool struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Unique identifier for the tool (e.g., "read_file", "search_web") + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable description of what the tool does + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // JSON Schema defining the tool's input parameters as a JSON string + // This is the inputSchema from the MCP specification + InputSchema string `protobuf:"bytes,3,opt,name=input_schema,json=inputSchema,proto3" json:"input_schema,omitempty"` + // Optional category for filtering/grouping (e.g., "file", "web", "code") + Category string `protobuf:"bytes,4,opt,name=category,proto3" json:"category,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MCPTool) Reset() { + *x = MCPTool{} + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MCPTool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MCPTool) ProtoMessage() {} + +func (x *MCPTool) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MCPTool.ProtoReflect.Descriptor instead. +func (*MCPTool) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescGZIP(), []int{2} +} + +func (x *MCPTool) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MCPTool) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *MCPTool) GetInputSchema() string { + if x != nil { + return x.InputSchema + } + return "" +} + +func (x *MCPTool) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +var File_redpanda_api_aigateway_v1_mcp_tools_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x63, 0x70, 0x5f, + 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x01, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x44, 0xe0, 0x41, 0x02, + 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x10, 0x01, 0x32, 0x15, 0x5e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x2b, + 0x24, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, 0x02, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x12, 0x46, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x2a, 0xba, 0x48, 0x27, 0x72, 0x25, 0x52, 0x00, 0x52, 0x04, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x03, 0x77, 0x65, 0x62, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x08, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x50, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x38, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x43, 0x50, 0x54, + 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x07, 0x4d, + 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x21, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, + 0x18, 0x80, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, 0x08, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x12, 0x23, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, + 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x32, 0xb4, 0x01, 0x0a, 0x0f, 0x4d, 0x43, + 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa0, 0x01, + 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x2e, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x43, 0x50, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x63, 0x70, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x42, 0x82, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x42, 0x0d, 0x4d, 0x63, 0x70, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, + 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, + 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescData = file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_redpanda_api_aigateway_v1_mcp_tools_proto_goTypes = []any{ + (*ListMCPToolsRequest)(nil), // 0: redpanda.api.aigateway.v1.ListMCPToolsRequest + (*ListMCPToolsResponse)(nil), // 1: redpanda.api.aigateway.v1.ListMCPToolsResponse + (*MCPTool)(nil), // 2: redpanda.api.aigateway.v1.MCPTool +} +var file_redpanda_api_aigateway_v1_mcp_tools_proto_depIdxs = []int32{ + 2, // 0: redpanda.api.aigateway.v1.ListMCPToolsResponse.tools:type_name -> redpanda.api.aigateway.v1.MCPTool + 0, // 1: redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools:input_type -> redpanda.api.aigateway.v1.ListMCPToolsRequest + 1, // 2: redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools:output_type -> redpanda.api.aigateway.v1.ListMCPToolsResponse + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_mcp_tools_proto_init() } +func file_redpanda_api_aigateway_v1_mcp_tools_proto_init() { + if File_redpanda_api_aigateway_v1_mcp_tools_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_mcp_tools_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_mcp_tools_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_mcp_tools_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_mcp_tools_proto = out.File + file_redpanda_api_aigateway_v1_mcp_tools_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_mcp_tools_proto_goTypes = nil + file_redpanda_api_aigateway_v1_mcp_tools_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.gw.go new file mode 100644 index 0000000000..c824cfdd57 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools.pb.gw.go @@ -0,0 +1,183 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/mcp_tools.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_MCPToolsService_ListMCPTools_0 = &utilities.DoubleArray{Encoding: map[string]int{"gateway_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_MCPToolsService_ListMCPTools_0(ctx context.Context, marshaler runtime.Marshaler, client MCPToolsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListMCPToolsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MCPToolsService_ListMCPTools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListMCPTools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_MCPToolsService_ListMCPTools_0(ctx context.Context, marshaler runtime.Marshaler, server MCPToolsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListMCPToolsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MCPToolsService_ListMCPTools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListMCPTools(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterMCPToolsServiceHandlerServer registers the http handlers for service MCPToolsService to "mux". +// UnaryRPC :call MCPToolsServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMCPToolsServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterMCPToolsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MCPToolsServiceServer) error { + mux.Handle(http.MethodGet, pattern_MCPToolsService_ListMCPTools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.MCPToolsService/ListMCPTools", runtime.WithHTTPPathPattern("/v1/{gateway_name=gateways/*}/mcp-tools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MCPToolsService_ListMCPTools_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_MCPToolsService_ListMCPTools_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterMCPToolsServiceHandlerFromEndpoint is same as RegisterMCPToolsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterMCPToolsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterMCPToolsServiceHandler(ctx, mux, conn) +} + +// RegisterMCPToolsServiceHandler registers the http handlers for service MCPToolsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterMCPToolsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterMCPToolsServiceHandlerClient(ctx, mux, NewMCPToolsServiceClient(conn)) +} + +// RegisterMCPToolsServiceHandlerClient registers the http handlers for service MCPToolsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MCPToolsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MCPToolsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "MCPToolsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterMCPToolsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MCPToolsServiceClient) error { + mux.Handle(http.MethodGet, pattern_MCPToolsService_ListMCPTools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.MCPToolsService/ListMCPTools", runtime.WithHTTPPathPattern("/v1/{gateway_name=gateways/*}/mcp-tools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MCPToolsService_ListMCPTools_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_MCPToolsService_ListMCPTools_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_MCPToolsService_ListMCPTools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "gateway_name", "mcp-tools"}, "")) +) + +var ( + forward_MCPToolsService_ListMCPTools_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools_grpc.pb.go new file mode 100644 index 0000000000..0c59afd4b4 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/mcp_tools_grpc.pb.go @@ -0,0 +1,132 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/mcp_tools.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + MCPToolsService_ListMCPTools_FullMethodName = "/redpanda.api.aigateway.v1.MCPToolsService/ListMCPTools" +) + +// MCPToolsServiceClient is the client API for MCPToolsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// MCPToolsService provides access to MCP (Model Context Protocol) tools +// available in a gateway. This service proxies the tools/list call to the +// MCP Gateway and returns the available tools with their schemas. +type MCPToolsServiceClient interface { + // ListMCPTools returns the list of tools available in a gateway + ListMCPTools(ctx context.Context, in *ListMCPToolsRequest, opts ...grpc.CallOption) (*ListMCPToolsResponse, error) +} + +type mCPToolsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMCPToolsServiceClient(cc grpc.ClientConnInterface) MCPToolsServiceClient { + return &mCPToolsServiceClient{cc} +} + +func (c *mCPToolsServiceClient) ListMCPTools(ctx context.Context, in *ListMCPToolsRequest, opts ...grpc.CallOption) (*ListMCPToolsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListMCPToolsResponse) + err := c.cc.Invoke(ctx, MCPToolsService_ListMCPTools_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MCPToolsServiceServer is the server API for MCPToolsService service. +// All implementations must embed UnimplementedMCPToolsServiceServer +// for forward compatibility. +// +// MCPToolsService provides access to MCP (Model Context Protocol) tools +// available in a gateway. This service proxies the tools/list call to the +// MCP Gateway and returns the available tools with their schemas. +type MCPToolsServiceServer interface { + // ListMCPTools returns the list of tools available in a gateway + ListMCPTools(context.Context, *ListMCPToolsRequest) (*ListMCPToolsResponse, error) + mustEmbedUnimplementedMCPToolsServiceServer() +} + +// UnimplementedMCPToolsServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedMCPToolsServiceServer struct{} + +func (UnimplementedMCPToolsServiceServer) ListMCPTools(context.Context, *ListMCPToolsRequest) (*ListMCPToolsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMCPTools not implemented") +} +func (UnimplementedMCPToolsServiceServer) mustEmbedUnimplementedMCPToolsServiceServer() {} +func (UnimplementedMCPToolsServiceServer) testEmbeddedByValue() {} + +// UnsafeMCPToolsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MCPToolsServiceServer will +// result in compilation errors. +type UnsafeMCPToolsServiceServer interface { + mustEmbedUnimplementedMCPToolsServiceServer() +} + +func RegisterMCPToolsServiceServer(s grpc.ServiceRegistrar, srv MCPToolsServiceServer) { + // If the following call pancis, it indicates UnimplementedMCPToolsServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&MCPToolsService_ServiceDesc, srv) +} + +func _MCPToolsService_ListMCPTools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListMCPToolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MCPToolsServiceServer).ListMCPTools(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MCPToolsService_ListMCPTools_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MCPToolsServiceServer).ListMCPTools(ctx, req.(*ListMCPToolsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// MCPToolsService_ServiceDesc is the grpc.ServiceDesc for MCPToolsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MCPToolsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.MCPToolsService", + HandlerType: (*MCPToolsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListMCPTools", + Handler: _MCPToolsService_ListMCPTools_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/mcp_tools.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.go new file mode 100644 index 0000000000..60572fc1f7 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.go @@ -0,0 +1,1164 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/model_providers.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// ModelProvider represents an LLM provider (e.g., OpenAI, Anthropic). +// Providers are seeded by migrations and cannot be created/deleted via API. +type ModelProvider struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name: model_providers/{id} + // Example: model_providers/openai + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Display name for UI + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Provider description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Provider website URL + WebsiteUrl string `protobuf:"bytes,4,opt,name=website_url,json=websiteUrl,proto3" json:"website_url,omitempty"` + // Provider logo URL + LogoUrl string `protobuf:"bytes,5,opt,name=logo_url,json=logoUrl,proto3" json:"logo_url,omitempty"` + // Enable/disable toggle for routing + // When false, all models from this provider are effectively disabled + Enabled bool `protobuf:"varint,6,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Country code where provider is headquartered (e.g., "US", "FR", "CA") + Headquarters string `protobuf:"bytes,11,opt,name=headquarters,proto3" json:"headquarters,omitempty"` + // Data training policy: + // - "never": Provider never trains on customer data + // - "opt-out": Training can be disabled via provider settings + // - "always": Provider may use data for training + DataPolicy string `protobuf:"bytes,12,opt,name=data_policy,json=dataPolicy,proto3" json:"data_policy,omitempty"` + // Compliance certifications (e.g., "SOC2", "GDPR", "HIPAA", "ISO27001") + Certifications []string `protobuf:"bytes,13,rep,name=certifications,proto3" json:"certifications,omitempty"` + // Data retention period in days (0 = no retention, -1 = unknown) + DataRetentionDays int32 `protobuf:"varint,14,opt,name=data_retention_days,json=dataRetentionDays,proto3" json:"data_retention_days,omitempty"` + // Data processing region(s) (e.g., "US", "EU", "APAC") + DataRegion []string `protobuf:"bytes,15,rep,name=data_region,json=dataRegion,proto3" json:"data_region,omitempty"` + // Base URL for API requests (e.g., "https://api.openai.com") + BaseUrl string `protobuf:"bytes,16,opt,name=base_url,json=baseUrl,proto3" json:"base_url,omitempty"` + // Authentication type used by this provider + AuthType AuthType `protobuf:"varint,17,opt,name=auth_type,json=authType,proto3,enum=redpanda.api.aigateway.v1.AuthType" json:"auth_type,omitempty"` + // True if provider natively uses OpenAI-compatible API format + // (e.g., OpenAI, Mistral, Groq, Together, Fireworks, DeepSeek, Cerebras) + OpenaiNative bool `protobuf:"varint,20,opt,name=openai_native,json=openaiNative,proto3" json:"openai_native,omitempty"` + // OpenAI compatibility configuration for non-native providers. + // Only populated for providers where transforms have been implemented. + // null/empty means transforms are not available for this provider. + OpenaiCompat *OpenAICompatConfig `protobuf:"bytes,21,opt,name=openai_compat,json=openaiCompat,proto3" json:"openai_compat,omitempty"` + // Audit fields + CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Creator string `protobuf:"bytes,9,opt,name=creator,proto3" json:"creator,omitempty"` + Updater string `protobuf:"bytes,10,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ModelProvider) Reset() { + *x = ModelProvider{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ModelProvider) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ModelProvider) ProtoMessage() {} + +func (x *ModelProvider) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ModelProvider.ProtoReflect.Descriptor instead. +func (*ModelProvider) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{0} +} + +func (x *ModelProvider) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ModelProvider) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *ModelProvider) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ModelProvider) GetWebsiteUrl() string { + if x != nil { + return x.WebsiteUrl + } + return "" +} + +func (x *ModelProvider) GetLogoUrl() string { + if x != nil { + return x.LogoUrl + } + return "" +} + +func (x *ModelProvider) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ModelProvider) GetHeadquarters() string { + if x != nil { + return x.Headquarters + } + return "" +} + +func (x *ModelProvider) GetDataPolicy() string { + if x != nil { + return x.DataPolicy + } + return "" +} + +func (x *ModelProvider) GetCertifications() []string { + if x != nil { + return x.Certifications + } + return nil +} + +func (x *ModelProvider) GetDataRetentionDays() int32 { + if x != nil { + return x.DataRetentionDays + } + return 0 +} + +func (x *ModelProvider) GetDataRegion() []string { + if x != nil { + return x.DataRegion + } + return nil +} + +func (x *ModelProvider) GetBaseUrl() string { + if x != nil { + return x.BaseUrl + } + return "" +} + +func (x *ModelProvider) GetAuthType() AuthType { + if x != nil { + return x.AuthType + } + return AuthType_AUTH_TYPE_UNSPECIFIED +} + +func (x *ModelProvider) GetOpenaiNative() bool { + if x != nil { + return x.OpenaiNative + } + return false +} + +func (x *ModelProvider) GetOpenaiCompat() *OpenAICompatConfig { + if x != nil { + return x.OpenaiCompat + } + return nil +} + +func (x *ModelProvider) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *ModelProvider) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *ModelProvider) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *ModelProvider) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +type GetModelProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetModelProviderRequest) Reset() { + *x = GetModelProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetModelProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModelProviderRequest) ProtoMessage() {} + +func (x *GetModelProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModelProviderRequest.ProtoReflect.Descriptor instead. +func (*GetModelProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{1} +} + +func (x *GetModelProviderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetModelProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProvider *ModelProvider `protobuf:"bytes,1,opt,name=model_provider,json=modelProvider,proto3" json:"model_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetModelProviderResponse) Reset() { + *x = GetModelProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetModelProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModelProviderResponse) ProtoMessage() {} + +func (x *GetModelProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModelProviderResponse.ProtoReflect.Descriptor instead. +func (*GetModelProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{2} +} + +func (x *GetModelProviderResponse) GetModelProvider() *ModelProvider { + if x != nil { + return x.ModelProvider + } + return nil +} + +type ListModelProvidersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // AIP-160 filter expression. + // Supported fields: provider_id, enabled, display_name + // Examples: + // - enabled = "true" + // - provider_id = "openai" + // - display_name = "Anthropic" + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListModelProvidersRequest) Reset() { + *x = ListModelProvidersRequest{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListModelProvidersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListModelProvidersRequest) ProtoMessage() {} + +func (x *ListModelProvidersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListModelProvidersRequest.ProtoReflect.Descriptor instead. +func (*ListModelProvidersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{3} +} + +func (x *ListModelProvidersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListModelProvidersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListModelProvidersRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +type ListModelProvidersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProviders []*ModelProvider `protobuf:"bytes,1,rep,name=model_providers,json=modelProviders,proto3" json:"model_providers,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListModelProvidersResponse) Reset() { + *x = ListModelProvidersResponse{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListModelProvidersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListModelProvidersResponse) ProtoMessage() {} + +func (x *ListModelProvidersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListModelProvidersResponse.ProtoReflect.Descriptor instead. +func (*ListModelProvidersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{4} +} + +func (x *ListModelProvidersResponse) GetModelProviders() []*ModelProvider { + if x != nil { + return x.ModelProviders + } + return nil +} + +func (x *ListModelProvidersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListModelProvidersResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateModelProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProvider *ModelProvider `protobuf:"bytes,1,opt,name=model_provider,json=modelProvider,proto3" json:"model_provider,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateModelProviderRequest) Reset() { + *x = UpdateModelProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateModelProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateModelProviderRequest) ProtoMessage() {} + +func (x *UpdateModelProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateModelProviderRequest.ProtoReflect.Descriptor instead. +func (*UpdateModelProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{5} +} + +func (x *UpdateModelProviderRequest) GetModelProvider() *ModelProvider { + if x != nil { + return x.ModelProvider + } + return nil +} + +func (x *UpdateModelProviderRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type UpdateModelProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProvider *ModelProvider `protobuf:"bytes,1,opt,name=model_provider,json=modelProvider,proto3" json:"model_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateModelProviderResponse) Reset() { + *x = UpdateModelProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateModelProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateModelProviderResponse) ProtoMessage() {} + +func (x *UpdateModelProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateModelProviderResponse.ProtoReflect.Descriptor instead. +func (*UpdateModelProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{6} +} + +func (x *UpdateModelProviderResponse) GetModelProvider() *ModelProvider { + if x != nil { + return x.ModelProvider + } + return nil +} + +type EnableModelProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableModelProviderRequest) Reset() { + *x = EnableModelProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableModelProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableModelProviderRequest) ProtoMessage() {} + +func (x *EnableModelProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableModelProviderRequest.ProtoReflect.Descriptor instead. +func (*EnableModelProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{7} +} + +func (x *EnableModelProviderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type EnableModelProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProvider *ModelProvider `protobuf:"bytes,1,opt,name=model_provider,json=modelProvider,proto3" json:"model_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableModelProviderResponse) Reset() { + *x = EnableModelProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableModelProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableModelProviderResponse) ProtoMessage() {} + +func (x *EnableModelProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableModelProviderResponse.ProtoReflect.Descriptor instead. +func (*EnableModelProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{8} +} + +func (x *EnableModelProviderResponse) GetModelProvider() *ModelProvider { + if x != nil { + return x.ModelProvider + } + return nil +} + +type DisableModelProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableModelProviderRequest) Reset() { + *x = DisableModelProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableModelProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableModelProviderRequest) ProtoMessage() {} + +func (x *DisableModelProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableModelProviderRequest.ProtoReflect.Descriptor instead. +func (*DisableModelProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{9} +} + +func (x *DisableModelProviderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type DisableModelProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelProvider *ModelProvider `protobuf:"bytes,1,opt,name=model_provider,json=modelProvider,proto3" json:"model_provider,omitempty"` + // Number of models that were cascade-disabled + DisabledModelsCount int32 `protobuf:"varint,2,opt,name=disabled_models_count,json=disabledModelsCount,proto3" json:"disabled_models_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableModelProviderResponse) Reset() { + *x = DisableModelProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableModelProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableModelProviderResponse) ProtoMessage() {} + +func (x *DisableModelProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableModelProviderResponse.ProtoReflect.Descriptor instead. +func (*DisableModelProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{10} +} + +func (x *DisableModelProviderResponse) GetModelProvider() *ModelProvider { + if x != nil { + return x.ModelProvider + } + return nil +} + +func (x *DisableModelProviderResponse) GetDisabledModelsCount() int32 { + if x != nil { + return x.DisabledModelsCount + } + return 0 +} + +// OpenAI compatibility configuration for non-native providers. +// When a provider pool has this config applied, requests in OpenAI format +// are automatically transformed to the provider's native format. +type OpenAICompatConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Request transforms to apply (e.g., ["strip_model_prefix", "openai_to_anthropic"]) + RequestTransforms []string `protobuf:"bytes,1,rep,name=request_transforms,json=requestTransforms,proto3" json:"request_transforms,omitempty"` + // Response transforms to apply (e.g., ["anthropic_to_openai"]) + ResponseTransforms []string `protobuf:"bytes,2,rep,name=response_transforms,json=responseTransforms,proto3" json:"response_transforms,omitempty"` + // Path rewrite configuration for providers that don't use /v1/chat/completions + PathRewrite *PathRewrite `protobuf:"bytes,3,opt,name=path_rewrite,json=pathRewrite,proto3" json:"path_rewrite,omitempty"` + // Auth header name override (e.g., "x-api-key" for Anthropic). + // If empty, uses default "Authorization" with "Bearer " prefix. + AuthHeader string `protobuf:"bytes,4,opt,name=auth_header,json=authHeader,proto3" json:"auth_header,omitempty"` + // Extra headers to include with every request (e.g., anthropic-version) + ExtraHeaders map[string]string `protobuf:"bytes,5,rep,name=extra_headers,json=extraHeaders,proto3" json:"extra_headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OpenAICompatConfig) Reset() { + *x = OpenAICompatConfig{} + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OpenAICompatConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenAICompatConfig) ProtoMessage() {} + +func (x *OpenAICompatConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpenAICompatConfig.ProtoReflect.Descriptor instead. +func (*OpenAICompatConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP(), []int{11} +} + +func (x *OpenAICompatConfig) GetRequestTransforms() []string { + if x != nil { + return x.RequestTransforms + } + return nil +} + +func (x *OpenAICompatConfig) GetResponseTransforms() []string { + if x != nil { + return x.ResponseTransforms + } + return nil +} + +func (x *OpenAICompatConfig) GetPathRewrite() *PathRewrite { + if x != nil { + return x.PathRewrite + } + return nil +} + +func (x *OpenAICompatConfig) GetAuthHeader() string { + if x != nil { + return x.AuthHeader + } + return "" +} + +func (x *OpenAICompatConfig) GetExtraHeaders() map[string]string { + if x != nil { + return x.ExtraHeaders + } + return nil +} + +var File_redpanda_api_aigateway_v1_model_providers_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_model_providers_proto_rawDesc = []byte{ + 0x0a, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x06, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x71, 0x75, + 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2e, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x40, 0x0a, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x4e, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x3a, 0x48, 0xea, 0x41, 0x45, 0x0a, 0x24, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x12, 0x1d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x22, 0x5b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, + 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x6b, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xb6, 0x01, + 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x6e, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x5e, 0x0a, 0x1a, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x6e, 0x0a, 0x1b, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x5f, 0x0a, 0x1b, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x1c, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x87, 0x03, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, + 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x64, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0x9a, 0x07, 0x0a, 0x15, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x34, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0xc9, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x32, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0xb8, 0x01, 0x0a, 0x14, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, + 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x88, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, + 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, + 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, + 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, + 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_model_providers_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_model_providers_proto_rawDescData = file_redpanda_api_aigateway_v1_model_providers_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_model_providers_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_model_providers_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_model_providers_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_model_providers_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_model_providers_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_redpanda_api_aigateway_v1_model_providers_proto_goTypes = []any{ + (*ModelProvider)(nil), // 0: redpanda.api.aigateway.v1.ModelProvider + (*GetModelProviderRequest)(nil), // 1: redpanda.api.aigateway.v1.GetModelProviderRequest + (*GetModelProviderResponse)(nil), // 2: redpanda.api.aigateway.v1.GetModelProviderResponse + (*ListModelProvidersRequest)(nil), // 3: redpanda.api.aigateway.v1.ListModelProvidersRequest + (*ListModelProvidersResponse)(nil), // 4: redpanda.api.aigateway.v1.ListModelProvidersResponse + (*UpdateModelProviderRequest)(nil), // 5: redpanda.api.aigateway.v1.UpdateModelProviderRequest + (*UpdateModelProviderResponse)(nil), // 6: redpanda.api.aigateway.v1.UpdateModelProviderResponse + (*EnableModelProviderRequest)(nil), // 7: redpanda.api.aigateway.v1.EnableModelProviderRequest + (*EnableModelProviderResponse)(nil), // 8: redpanda.api.aigateway.v1.EnableModelProviderResponse + (*DisableModelProviderRequest)(nil), // 9: redpanda.api.aigateway.v1.DisableModelProviderRequest + (*DisableModelProviderResponse)(nil), // 10: redpanda.api.aigateway.v1.DisableModelProviderResponse + (*OpenAICompatConfig)(nil), // 11: redpanda.api.aigateway.v1.OpenAICompatConfig + nil, // 12: redpanda.api.aigateway.v1.OpenAICompatConfig.ExtraHeadersEntry + (AuthType)(0), // 13: redpanda.api.aigateway.v1.AuthType + (*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 15: google.protobuf.FieldMask + (*PathRewrite)(nil), // 16: redpanda.api.aigateway.v1.PathRewrite +} +var file_redpanda_api_aigateway_v1_model_providers_proto_depIdxs = []int32{ + 13, // 0: redpanda.api.aigateway.v1.ModelProvider.auth_type:type_name -> redpanda.api.aigateway.v1.AuthType + 11, // 1: redpanda.api.aigateway.v1.ModelProvider.openai_compat:type_name -> redpanda.api.aigateway.v1.OpenAICompatConfig + 14, // 2: redpanda.api.aigateway.v1.ModelProvider.create_time:type_name -> google.protobuf.Timestamp + 14, // 3: redpanda.api.aigateway.v1.ModelProvider.update_time:type_name -> google.protobuf.Timestamp + 0, // 4: redpanda.api.aigateway.v1.GetModelProviderResponse.model_provider:type_name -> redpanda.api.aigateway.v1.ModelProvider + 0, // 5: redpanda.api.aigateway.v1.ListModelProvidersResponse.model_providers:type_name -> redpanda.api.aigateway.v1.ModelProvider + 0, // 6: redpanda.api.aigateway.v1.UpdateModelProviderRequest.model_provider:type_name -> redpanda.api.aigateway.v1.ModelProvider + 15, // 7: redpanda.api.aigateway.v1.UpdateModelProviderRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 8: redpanda.api.aigateway.v1.UpdateModelProviderResponse.model_provider:type_name -> redpanda.api.aigateway.v1.ModelProvider + 0, // 9: redpanda.api.aigateway.v1.EnableModelProviderResponse.model_provider:type_name -> redpanda.api.aigateway.v1.ModelProvider + 0, // 10: redpanda.api.aigateway.v1.DisableModelProviderResponse.model_provider:type_name -> redpanda.api.aigateway.v1.ModelProvider + 16, // 11: redpanda.api.aigateway.v1.OpenAICompatConfig.path_rewrite:type_name -> redpanda.api.aigateway.v1.PathRewrite + 12, // 12: redpanda.api.aigateway.v1.OpenAICompatConfig.extra_headers:type_name -> redpanda.api.aigateway.v1.OpenAICompatConfig.ExtraHeadersEntry + 1, // 13: redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider:input_type -> redpanda.api.aigateway.v1.GetModelProviderRequest + 3, // 14: redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders:input_type -> redpanda.api.aigateway.v1.ListModelProvidersRequest + 5, // 15: redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider:input_type -> redpanda.api.aigateway.v1.UpdateModelProviderRequest + 7, // 16: redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider:input_type -> redpanda.api.aigateway.v1.EnableModelProviderRequest + 9, // 17: redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider:input_type -> redpanda.api.aigateway.v1.DisableModelProviderRequest + 2, // 18: redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider:output_type -> redpanda.api.aigateway.v1.GetModelProviderResponse + 4, // 19: redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders:output_type -> redpanda.api.aigateway.v1.ListModelProvidersResponse + 6, // 20: redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider:output_type -> redpanda.api.aigateway.v1.UpdateModelProviderResponse + 8, // 21: redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider:output_type -> redpanda.api.aigateway.v1.EnableModelProviderResponse + 10, // 22: redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider:output_type -> redpanda.api.aigateway.v1.DisableModelProviderResponse + 18, // [18:23] is the sub-list for method output_type + 13, // [13:18] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_model_providers_proto_init() } +func file_redpanda_api_aigateway_v1_model_providers_proto_init() { + if File_redpanda_api_aigateway_v1_model_providers_proto != nil { + return + } + file_redpanda_api_aigateway_v1_backend_pool_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_model_providers_proto_rawDesc, + NumEnums: 0, + NumMessages: 13, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_model_providers_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_model_providers_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_model_providers_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_model_providers_proto = out.File + file_redpanda_api_aigateway_v1_model_providers_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_model_providers_proto_goTypes = nil + file_redpanda_api_aigateway_v1_model_providers_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.gw.go new file mode 100644 index 0000000000..a3dbc17b34 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers.pb.gw.go @@ -0,0 +1,531 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/model_providers.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_ModelProvidersService_GetModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ModelProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetModelProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelProvidersService_GetModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ModelProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetModelProvider(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelProvidersService_ListModelProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ModelProvidersService_ListModelProviders_0(ctx context.Context, marshaler runtime.Marshaler, client ModelProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListModelProvidersRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelProvidersService_ListModelProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListModelProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelProvidersService_ListModelProviders_0(ctx context.Context, marshaler runtime.Marshaler, server ModelProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListModelProvidersRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelProvidersService_ListModelProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListModelProviders(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelProvidersService_UpdateModelProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"model_provider": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_ModelProvidersService_UpdateModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ModelProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.ModelProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.ModelProvider); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["model_provider.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "model_provider.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "model_provider.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "model_provider.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelProvidersService_UpdateModelProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateModelProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelProvidersService_UpdateModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ModelProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.ModelProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.ModelProvider); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["model_provider.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "model_provider.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "model_provider.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "model_provider.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelProvidersService_UpdateModelProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateModelProvider(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelProvidersService_EnableModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ModelProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.EnableModelProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelProvidersService_EnableModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ModelProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.EnableModelProvider(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelProvidersService_DisableModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ModelProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DisableModelProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelProvidersService_DisableModelProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ModelProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableModelProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DisableModelProvider(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterModelProvidersServiceHandlerServer registers the http handlers for service ModelProvidersService to "mux". +// UnaryRPC :call ModelProvidersServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterModelProvidersServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterModelProvidersServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ModelProvidersServiceServer) error { + mux.Handle(http.MethodGet, pattern_ModelProvidersService_GetModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/GetModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelProvidersService_GetModelProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_GetModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelProvidersService_ListModelProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/ListModelProviders", runtime.WithHTTPPathPattern("/v1/model_providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelProvidersService_ListModelProviders_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_ListModelProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelProvidersService_UpdateModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/UpdateModelProvider", runtime.WithHTTPPathPattern("/v1/{model_provider.name=model_providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelProvidersService_UpdateModelProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_UpdateModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelProvidersService_EnableModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/EnableModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}:enable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelProvidersService_EnableModelProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_EnableModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelProvidersService_DisableModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/DisableModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelProvidersService_DisableModelProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_DisableModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterModelProvidersServiceHandlerFromEndpoint is same as RegisterModelProvidersServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterModelProvidersServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterModelProvidersServiceHandler(ctx, mux, conn) +} + +// RegisterModelProvidersServiceHandler registers the http handlers for service ModelProvidersService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterModelProvidersServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterModelProvidersServiceHandlerClient(ctx, mux, NewModelProvidersServiceClient(conn)) +} + +// RegisterModelProvidersServiceHandlerClient registers the http handlers for service ModelProvidersService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ModelProvidersServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ModelProvidersServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ModelProvidersServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterModelProvidersServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ModelProvidersServiceClient) error { + mux.Handle(http.MethodGet, pattern_ModelProvidersService_GetModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/GetModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelProvidersService_GetModelProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_GetModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelProvidersService_ListModelProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/ListModelProviders", runtime.WithHTTPPathPattern("/v1/model_providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelProvidersService_ListModelProviders_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_ListModelProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelProvidersService_UpdateModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/UpdateModelProvider", runtime.WithHTTPPathPattern("/v1/{model_provider.name=model_providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelProvidersService_UpdateModelProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_UpdateModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelProvidersService_EnableModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/EnableModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}:enable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelProvidersService_EnableModelProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_EnableModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelProvidersService_DisableModelProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelProvidersService/DisableModelProvider", runtime.WithHTTPPathPattern("/v1/{name=model_providers/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelProvidersService_DisableModelProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelProvidersService_DisableModelProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ModelProvidersService_GetModelProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "model_providers", "name"}, "")) + pattern_ModelProvidersService_ListModelProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "model_providers"}, "")) + pattern_ModelProvidersService_UpdateModelProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "model_providers", "model_provider.name"}, "")) + pattern_ModelProvidersService_EnableModelProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "model_providers", "name"}, "enable")) + pattern_ModelProvidersService_DisableModelProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "model_providers", "name"}, "disable")) +) + +var ( + forward_ModelProvidersService_GetModelProvider_0 = runtime.ForwardResponseMessage + forward_ModelProvidersService_ListModelProviders_0 = runtime.ForwardResponseMessage + forward_ModelProvidersService_UpdateModelProvider_0 = runtime.ForwardResponseMessage + forward_ModelProvidersService_EnableModelProvider_0 = runtime.ForwardResponseMessage + forward_ModelProvidersService_DisableModelProvider_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers_grpc.pb.go new file mode 100644 index 0000000000..9b49c46812 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/model_providers_grpc.pb.go @@ -0,0 +1,288 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/model_providers.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ModelProvidersService_GetModelProvider_FullMethodName = "/redpanda.api.aigateway.v1.ModelProvidersService/GetModelProvider" + ModelProvidersService_ListModelProviders_FullMethodName = "/redpanda.api.aigateway.v1.ModelProvidersService/ListModelProviders" + ModelProvidersService_UpdateModelProvider_FullMethodName = "/redpanda.api.aigateway.v1.ModelProvidersService/UpdateModelProvider" + ModelProvidersService_EnableModelProvider_FullMethodName = "/redpanda.api.aigateway.v1.ModelProvidersService/EnableModelProvider" + ModelProvidersService_DisableModelProvider_FullMethodName = "/redpanda.api.aigateway.v1.ModelProvidersService/DisableModelProvider" +) + +// ModelProvidersServiceClient is the client API for ModelProvidersService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ModelProvidersService manages LLM provider configurations. +// Providers are seeded by migrations; this service allows enabling/disabling +// and updating provider metadata. Disabling a provider will cascade-disable +// all its models. +type ModelProvidersServiceClient interface { + GetModelProvider(ctx context.Context, in *GetModelProviderRequest, opts ...grpc.CallOption) (*GetModelProviderResponse, error) + ListModelProviders(ctx context.Context, in *ListModelProvidersRequest, opts ...grpc.CallOption) (*ListModelProvidersResponse, error) + UpdateModelProvider(ctx context.Context, in *UpdateModelProviderRequest, opts ...grpc.CallOption) (*UpdateModelProviderResponse, error) + // Enable a provider for routing (does NOT auto-enable its models) + EnableModelProvider(ctx context.Context, in *EnableModelProviderRequest, opts ...grpc.CallOption) (*EnableModelProviderResponse, error) + // Disable a provider (cascade-disables ALL its models) + DisableModelProvider(ctx context.Context, in *DisableModelProviderRequest, opts ...grpc.CallOption) (*DisableModelProviderResponse, error) +} + +type modelProvidersServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewModelProvidersServiceClient(cc grpc.ClientConnInterface) ModelProvidersServiceClient { + return &modelProvidersServiceClient{cc} +} + +func (c *modelProvidersServiceClient) GetModelProvider(ctx context.Context, in *GetModelProviderRequest, opts ...grpc.CallOption) (*GetModelProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetModelProviderResponse) + err := c.cc.Invoke(ctx, ModelProvidersService_GetModelProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelProvidersServiceClient) ListModelProviders(ctx context.Context, in *ListModelProvidersRequest, opts ...grpc.CallOption) (*ListModelProvidersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListModelProvidersResponse) + err := c.cc.Invoke(ctx, ModelProvidersService_ListModelProviders_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelProvidersServiceClient) UpdateModelProvider(ctx context.Context, in *UpdateModelProviderRequest, opts ...grpc.CallOption) (*UpdateModelProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateModelProviderResponse) + err := c.cc.Invoke(ctx, ModelProvidersService_UpdateModelProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelProvidersServiceClient) EnableModelProvider(ctx context.Context, in *EnableModelProviderRequest, opts ...grpc.CallOption) (*EnableModelProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EnableModelProviderResponse) + err := c.cc.Invoke(ctx, ModelProvidersService_EnableModelProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelProvidersServiceClient) DisableModelProvider(ctx context.Context, in *DisableModelProviderRequest, opts ...grpc.CallOption) (*DisableModelProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DisableModelProviderResponse) + err := c.cc.Invoke(ctx, ModelProvidersService_DisableModelProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ModelProvidersServiceServer is the server API for ModelProvidersService service. +// All implementations must embed UnimplementedModelProvidersServiceServer +// for forward compatibility. +// +// ModelProvidersService manages LLM provider configurations. +// Providers are seeded by migrations; this service allows enabling/disabling +// and updating provider metadata. Disabling a provider will cascade-disable +// all its models. +type ModelProvidersServiceServer interface { + GetModelProvider(context.Context, *GetModelProviderRequest) (*GetModelProviderResponse, error) + ListModelProviders(context.Context, *ListModelProvidersRequest) (*ListModelProvidersResponse, error) + UpdateModelProvider(context.Context, *UpdateModelProviderRequest) (*UpdateModelProviderResponse, error) + // Enable a provider for routing (does NOT auto-enable its models) + EnableModelProvider(context.Context, *EnableModelProviderRequest) (*EnableModelProviderResponse, error) + // Disable a provider (cascade-disables ALL its models) + DisableModelProvider(context.Context, *DisableModelProviderRequest) (*DisableModelProviderResponse, error) + mustEmbedUnimplementedModelProvidersServiceServer() +} + +// UnimplementedModelProvidersServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedModelProvidersServiceServer struct{} + +func (UnimplementedModelProvidersServiceServer) GetModelProvider(context.Context, *GetModelProviderRequest) (*GetModelProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetModelProvider not implemented") +} +func (UnimplementedModelProvidersServiceServer) ListModelProviders(context.Context, *ListModelProvidersRequest) (*ListModelProvidersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListModelProviders not implemented") +} +func (UnimplementedModelProvidersServiceServer) UpdateModelProvider(context.Context, *UpdateModelProviderRequest) (*UpdateModelProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateModelProvider not implemented") +} +func (UnimplementedModelProvidersServiceServer) EnableModelProvider(context.Context, *EnableModelProviderRequest) (*EnableModelProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnableModelProvider not implemented") +} +func (UnimplementedModelProvidersServiceServer) DisableModelProvider(context.Context, *DisableModelProviderRequest) (*DisableModelProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableModelProvider not implemented") +} +func (UnimplementedModelProvidersServiceServer) mustEmbedUnimplementedModelProvidersServiceServer() {} +func (UnimplementedModelProvidersServiceServer) testEmbeddedByValue() {} + +// UnsafeModelProvidersServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ModelProvidersServiceServer will +// result in compilation errors. +type UnsafeModelProvidersServiceServer interface { + mustEmbedUnimplementedModelProvidersServiceServer() +} + +func RegisterModelProvidersServiceServer(s grpc.ServiceRegistrar, srv ModelProvidersServiceServer) { + // If the following call pancis, it indicates UnimplementedModelProvidersServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ModelProvidersService_ServiceDesc, srv) +} + +func _ModelProvidersService_GetModelProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetModelProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelProvidersServiceServer).GetModelProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelProvidersService_GetModelProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelProvidersServiceServer).GetModelProvider(ctx, req.(*GetModelProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelProvidersService_ListModelProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListModelProvidersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelProvidersServiceServer).ListModelProviders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelProvidersService_ListModelProviders_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelProvidersServiceServer).ListModelProviders(ctx, req.(*ListModelProvidersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelProvidersService_UpdateModelProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateModelProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelProvidersServiceServer).UpdateModelProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelProvidersService_UpdateModelProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelProvidersServiceServer).UpdateModelProvider(ctx, req.(*UpdateModelProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelProvidersService_EnableModelProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnableModelProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelProvidersServiceServer).EnableModelProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelProvidersService_EnableModelProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelProvidersServiceServer).EnableModelProvider(ctx, req.(*EnableModelProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelProvidersService_DisableModelProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableModelProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelProvidersServiceServer).DisableModelProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelProvidersService_DisableModelProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelProvidersServiceServer).DisableModelProvider(ctx, req.(*DisableModelProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ModelProvidersService_ServiceDesc is the grpc.ServiceDesc for ModelProvidersService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ModelProvidersService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.ModelProvidersService", + HandlerType: (*ModelProvidersServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetModelProvider", + Handler: _ModelProvidersService_GetModelProvider_Handler, + }, + { + MethodName: "ListModelProviders", + Handler: _ModelProvidersService_ListModelProviders_Handler, + }, + { + MethodName: "UpdateModelProvider", + Handler: _ModelProvidersService_UpdateModelProvider_Handler, + }, + { + MethodName: "EnableModelProvider", + Handler: _ModelProvidersService_EnableModelProvider_Handler, + }, + { + MethodName: "DisableModelProvider", + Handler: _ModelProvidersService_DisableModelProvider_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/model_providers.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.go new file mode 100644 index 0000000000..09f14f4247 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.go @@ -0,0 +1,1337 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/models.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Model represents an LLM model in the catalog. +// Models exist independently of pricing and can be enabled/disabled for routing. +type Model struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name format: + // - Direct access: models/{model_owner}/{model_id} (e.g., models/anthropic/claude-3-5-sonnet) + // - Hosted provider: models/{model_owner}/{model_id}/{provider} (e.g., models/anthropic/claude-3-5-sonnet/aws-bedrock) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Display name for UI + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Model identification + // model_owner: The company that created/owns the model (e.g., "openai", "anthropic", "google", "meta") + // This is distinct from hosting providers (Azure, AWS Bedrock) which are configured separately. + ModelOwner string `protobuf:"bytes,3,opt,name=model_owner,json=modelOwner,proto3" json:"model_owner,omitempty"` + ModelId string `protobuf:"bytes,4,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` // e.g., "gpt-4o", "claude-3-5-sonnet" + // Hosting provider - the service hosting this model + // Always populated. For direct API access, provider equals model_owner. + // Examples: "anthropic", "openai" (direct), "aws-bedrock", "azure", "google-vertex" (hosted) + Provider string `protobuf:"bytes,14,opt,name=provider,proto3" json:"provider,omitempty"` + // Provider-specific model identifier - the actual model ID to use when calling the provider's API. + // Always populated. For direct access, equals model_id. For hosted providers, this is the + // provider-specific ID (e.g., "anthropic.claude-3-5-sonnet-20241022-v2:0" for AWS Bedrock). + ProviderModelId string `protobuf:"bytes,15,opt,name=provider_model_id,json=providerModelId,proto3" json:"provider_model_id,omitempty"` + // Modalities that this model supports - array for multimodal models + // Examples: ["chat"], ["chat", "vision"], ["chat", "vision", "audio"], ["embedding"] + Modalities []string `protobuf:"bytes,5,rep,name=modalities,proto3" json:"modalities,omitempty"` + // Model capabilities + ContextWindow int32 `protobuf:"varint,6,opt,name=context_window,json=contextWindow,proto3" json:"context_window,omitempty"` // Maximum context window size + Description string `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"` // Human-readable description + // Metadata for additional model properties + Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Enable/disable toggle for routing + // When false, model appears in UI but generates 0 req/s rate limit in data plane + Enabled bool `protobuf:"varint,9,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Audit fields + CreateTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Creator string `protobuf:"bytes,12,opt,name=creator,proto3" json:"creator,omitempty"` + Updater string `protobuf:"bytes,13,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Model) Reset() { + *x = Model{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Model) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Model) ProtoMessage() {} + +func (x *Model) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Model.ProtoReflect.Descriptor instead. +func (*Model) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{0} +} + +func (x *Model) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Model) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Model) GetModelOwner() string { + if x != nil { + return x.ModelOwner + } + return "" +} + +func (x *Model) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *Model) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *Model) GetProviderModelId() string { + if x != nil { + return x.ProviderModelId + } + return "" +} + +func (x *Model) GetModalities() []string { + if x != nil { + return x.Modalities + } + return nil +} + +func (x *Model) GetContextWindow() int32 { + if x != nil { + return x.ContextWindow + } + return 0 +} + +func (x *Model) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Model) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Model) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Model) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Model) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Model) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Model) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +type CreateModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ModelId string `protobuf:"bytes,1,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` + Model *Model `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateModelRequest) Reset() { + *x = CreateModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateModelRequest) ProtoMessage() {} + +func (x *CreateModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateModelRequest.ProtoReflect.Descriptor instead. +func (*CreateModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateModelRequest) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *CreateModelRequest) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type CreateModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateModelResponse) Reset() { + *x = CreateModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateModelResponse) ProtoMessage() {} + +func (x *CreateModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateModelResponse.ProtoReflect.Descriptor instead. +func (*CreateModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateModelResponse) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type GetModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetModelRequest) Reset() { + *x = GetModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModelRequest) ProtoMessage() {} + +func (x *GetModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModelRequest.ProtoReflect.Descriptor instead. +func (*GetModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{3} +} + +func (x *GetModelRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetModelResponse) Reset() { + *x = GetModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModelResponse) ProtoMessage() {} + +func (x *GetModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModelResponse.ProtoReflect.Descriptor instead. +func (*GetModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{4} +} + +func (x *GetModelResponse) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type ListModelsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by model_owner, provider, model_id, modality (checks if contained in modalities array), or enabled status + // Examples: + // + // model_owner = "anthropic" (the company that created the model) + // provider = "aws-bedrock" (the hosting provider) + // model_id = "claude-3-5-sonnet" + // modality = "chat" (matches models with "chat" in their modalities array) + // modality = "vision" (matches multimodal models that support vision) + // enabled = true + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListModelsRequest) Reset() { + *x = ListModelsRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListModelsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListModelsRequest) ProtoMessage() {} + +func (x *ListModelsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListModelsRequest.ProtoReflect.Descriptor instead. +func (*ListModelsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{5} +} + +func (x *ListModelsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListModelsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListModelsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListModelsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListModelsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Models []*Model `protobuf:"bytes,1,rep,name=models,proto3" json:"models,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListModelsResponse) Reset() { + *x = ListModelsResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListModelsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListModelsResponse) ProtoMessage() {} + +func (x *ListModelsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListModelsResponse.ProtoReflect.Descriptor instead. +func (*ListModelsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{6} +} + +func (x *ListModelsResponse) GetModels() []*Model { + if x != nil { + return x.Models + } + return nil +} + +func (x *ListModelsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListModelsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateModelRequest) Reset() { + *x = UpdateModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateModelRequest) ProtoMessage() {} + +func (x *UpdateModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateModelRequest.ProtoReflect.Descriptor instead. +func (*UpdateModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{7} +} + +func (x *UpdateModelRequest) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +func (x *UpdateModelRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type UpdateModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateModelResponse) Reset() { + *x = UpdateModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateModelResponse) ProtoMessage() {} + +func (x *UpdateModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateModelResponse.ProtoReflect.Descriptor instead. +func (*UpdateModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateModelResponse) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type DeleteModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteModelRequest) Reset() { + *x = DeleteModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteModelRequest) ProtoMessage() {} + +func (x *DeleteModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteModelRequest.ProtoReflect.Descriptor instead. +func (*DeleteModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{9} +} + +func (x *DeleteModelRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type DeleteModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteModelResponse) Reset() { + *x = DeleteModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteModelResponse) ProtoMessage() {} + +func (x *DeleteModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteModelResponse.ProtoReflect.Descriptor instead. +func (*DeleteModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{10} +} + +type EnableModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableModelRequest) Reset() { + *x = EnableModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableModelRequest) ProtoMessage() {} + +func (x *EnableModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableModelRequest.ProtoReflect.Descriptor instead. +func (*EnableModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{11} +} + +func (x *EnableModelRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type EnableModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableModelResponse) Reset() { + *x = EnableModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableModelResponse) ProtoMessage() {} + +func (x *EnableModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableModelResponse.ProtoReflect.Descriptor instead. +func (*EnableModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{12} +} + +func (x *EnableModelResponse) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type DisableModelRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableModelRequest) Reset() { + *x = DisableModelRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableModelRequest) ProtoMessage() {} + +func (x *DisableModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableModelRequest.ProtoReflect.Descriptor instead. +func (*DisableModelRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{13} +} + +func (x *DisableModelRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type DisableModelResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Model *Model `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableModelResponse) Reset() { + *x = DisableModelResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableModelResponse) ProtoMessage() {} + +func (x *DisableModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableModelResponse.ProtoReflect.Descriptor instead. +func (*DisableModelResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{14} +} + +func (x *DisableModelResponse) GetModel() *Model { + if x != nil { + return x.Model + } + return nil +} + +type ListDisabledModelsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDisabledModelsRequest) Reset() { + *x = ListDisabledModelsRequest{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDisabledModelsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDisabledModelsRequest) ProtoMessage() {} + +func (x *ListDisabledModelsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDisabledModelsRequest.ProtoReflect.Descriptor instead. +func (*ListDisabledModelsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{15} +} + +func (x *ListDisabledModelsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListDisabledModelsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListDisabledModelsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Models []*Model `protobuf:"bytes,1,rep,name=models,proto3" json:"models,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDisabledModelsResponse) Reset() { + *x = ListDisabledModelsResponse{} + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDisabledModelsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDisabledModelsResponse) ProtoMessage() {} + +func (x *ListDisabledModelsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_models_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDisabledModelsResponse.ProtoReflect.Descriptor instead. +func (*ListDisabledModelsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP(), []int{16} +} + +func (x *ListDisabledModelsResponse) GetModels() []*Model { + if x != nil { + return x.Models + } + return nil +} + +func (x *ListDisabledModelsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListDisabledModelsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +var File_redpanda_api_aigateway_v1_models_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_models_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xee, 0x05, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x6d, 0x6f, + 0x64, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x34, 0xea, 0x41, 0x31, + 0x0a, 0x1c, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x11, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, + 0x7d, 0x22, 0x6c, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, + 0x4d, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x4b, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x24, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1e, 0x0a, 0x1c, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x95, 0x01, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x4d, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x4e, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1e, + 0x0a, 0x1c, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x0a, 0x12, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x24, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1e, 0x0a, 0x1c, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x13, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x4f, 0x0a, 0x13, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x24, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1e, 0x0a, 0x1c, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x57, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x32, 0x95, 0x09, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x12, 0x80, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x2f, 0x2a, 0x7d, 0x12, 0x7d, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x32, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, + 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x97, 0x01, + 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2e, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x34, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x3a, + 0x6c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x80, 0x02, 0x0a, + 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0b, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, + 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, + 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_models_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_models_proto_rawDescData = file_redpanda_api_aigateway_v1_models_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_models_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_models_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_models_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_models_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_models_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_models_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_redpanda_api_aigateway_v1_models_proto_goTypes = []any{ + (*Model)(nil), // 0: redpanda.api.aigateway.v1.Model + (*CreateModelRequest)(nil), // 1: redpanda.api.aigateway.v1.CreateModelRequest + (*CreateModelResponse)(nil), // 2: redpanda.api.aigateway.v1.CreateModelResponse + (*GetModelRequest)(nil), // 3: redpanda.api.aigateway.v1.GetModelRequest + (*GetModelResponse)(nil), // 4: redpanda.api.aigateway.v1.GetModelResponse + (*ListModelsRequest)(nil), // 5: redpanda.api.aigateway.v1.ListModelsRequest + (*ListModelsResponse)(nil), // 6: redpanda.api.aigateway.v1.ListModelsResponse + (*UpdateModelRequest)(nil), // 7: redpanda.api.aigateway.v1.UpdateModelRequest + (*UpdateModelResponse)(nil), // 8: redpanda.api.aigateway.v1.UpdateModelResponse + (*DeleteModelRequest)(nil), // 9: redpanda.api.aigateway.v1.DeleteModelRequest + (*DeleteModelResponse)(nil), // 10: redpanda.api.aigateway.v1.DeleteModelResponse + (*EnableModelRequest)(nil), // 11: redpanda.api.aigateway.v1.EnableModelRequest + (*EnableModelResponse)(nil), // 12: redpanda.api.aigateway.v1.EnableModelResponse + (*DisableModelRequest)(nil), // 13: redpanda.api.aigateway.v1.DisableModelRequest + (*DisableModelResponse)(nil), // 14: redpanda.api.aigateway.v1.DisableModelResponse + (*ListDisabledModelsRequest)(nil), // 15: redpanda.api.aigateway.v1.ListDisabledModelsRequest + (*ListDisabledModelsResponse)(nil), // 16: redpanda.api.aigateway.v1.ListDisabledModelsResponse + nil, // 17: redpanda.api.aigateway.v1.Model.MetadataEntry + (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 19: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_models_proto_depIdxs = []int32{ + 17, // 0: redpanda.api.aigateway.v1.Model.metadata:type_name -> redpanda.api.aigateway.v1.Model.MetadataEntry + 18, // 1: redpanda.api.aigateway.v1.Model.create_time:type_name -> google.protobuf.Timestamp + 18, // 2: redpanda.api.aigateway.v1.Model.update_time:type_name -> google.protobuf.Timestamp + 0, // 3: redpanda.api.aigateway.v1.CreateModelRequest.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 4: redpanda.api.aigateway.v1.CreateModelResponse.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 5: redpanda.api.aigateway.v1.GetModelResponse.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 6: redpanda.api.aigateway.v1.ListModelsResponse.models:type_name -> redpanda.api.aigateway.v1.Model + 0, // 7: redpanda.api.aigateway.v1.UpdateModelRequest.model:type_name -> redpanda.api.aigateway.v1.Model + 19, // 8: redpanda.api.aigateway.v1.UpdateModelRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 9: redpanda.api.aigateway.v1.UpdateModelResponse.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 10: redpanda.api.aigateway.v1.EnableModelResponse.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 11: redpanda.api.aigateway.v1.DisableModelResponse.model:type_name -> redpanda.api.aigateway.v1.Model + 0, // 12: redpanda.api.aigateway.v1.ListDisabledModelsResponse.models:type_name -> redpanda.api.aigateway.v1.Model + 1, // 13: redpanda.api.aigateway.v1.ModelsService.CreateModel:input_type -> redpanda.api.aigateway.v1.CreateModelRequest + 3, // 14: redpanda.api.aigateway.v1.ModelsService.GetModel:input_type -> redpanda.api.aigateway.v1.GetModelRequest + 5, // 15: redpanda.api.aigateway.v1.ModelsService.ListModels:input_type -> redpanda.api.aigateway.v1.ListModelsRequest + 7, // 16: redpanda.api.aigateway.v1.ModelsService.UpdateModel:input_type -> redpanda.api.aigateway.v1.UpdateModelRequest + 9, // 17: redpanda.api.aigateway.v1.ModelsService.DeleteModel:input_type -> redpanda.api.aigateway.v1.DeleteModelRequest + 11, // 18: redpanda.api.aigateway.v1.ModelsService.EnableModel:input_type -> redpanda.api.aigateway.v1.EnableModelRequest + 13, // 19: redpanda.api.aigateway.v1.ModelsService.DisableModel:input_type -> redpanda.api.aigateway.v1.DisableModelRequest + 15, // 20: redpanda.api.aigateway.v1.ModelsService.ListDisabledModels:input_type -> redpanda.api.aigateway.v1.ListDisabledModelsRequest + 2, // 21: redpanda.api.aigateway.v1.ModelsService.CreateModel:output_type -> redpanda.api.aigateway.v1.CreateModelResponse + 4, // 22: redpanda.api.aigateway.v1.ModelsService.GetModel:output_type -> redpanda.api.aigateway.v1.GetModelResponse + 6, // 23: redpanda.api.aigateway.v1.ModelsService.ListModels:output_type -> redpanda.api.aigateway.v1.ListModelsResponse + 8, // 24: redpanda.api.aigateway.v1.ModelsService.UpdateModel:output_type -> redpanda.api.aigateway.v1.UpdateModelResponse + 10, // 25: redpanda.api.aigateway.v1.ModelsService.DeleteModel:output_type -> redpanda.api.aigateway.v1.DeleteModelResponse + 12, // 26: redpanda.api.aigateway.v1.ModelsService.EnableModel:output_type -> redpanda.api.aigateway.v1.EnableModelResponse + 14, // 27: redpanda.api.aigateway.v1.ModelsService.DisableModel:output_type -> redpanda.api.aigateway.v1.DisableModelResponse + 16, // 28: redpanda.api.aigateway.v1.ModelsService.ListDisabledModels:output_type -> redpanda.api.aigateway.v1.ListDisabledModelsResponse + 21, // [21:29] is the sub-list for method output_type + 13, // [13:21] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_models_proto_init() } +func file_redpanda_api_aigateway_v1_models_proto_init() { + if File_redpanda_api_aigateway_v1_models_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_models_proto_rawDesc, + NumEnums: 0, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_models_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_models_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_models_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_models_proto = out.File + file_redpanda_api_aigateway_v1_models_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_models_proto_goTypes = nil + file_redpanda_api_aigateway_v1_models_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.gw.go new file mode 100644 index 0000000000..3664c758b9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/models.pb.gw.go @@ -0,0 +1,763 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/models.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_ModelsService_CreateModel_0 = &utilities.DoubleArray{Encoding: map[string]int{"model": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ModelsService_CreateModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateModelRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Model); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_CreateModel_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_CreateModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateModelRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Model); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_CreateModel_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateModel(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelsService_GetModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetModelRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_GetModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetModelRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetModel(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelsService_ListModels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ModelsService_ListModels_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListModelsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_ListModels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListModels(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_ListModels_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListModelsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_ListModels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListModels(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelsService_UpdateModel_0 = &utilities.DoubleArray{Encoding: map[string]int{"model": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_ModelsService_UpdateModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateModelRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Model); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Model); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["model.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "model.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "model.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "model.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_UpdateModel_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_UpdateModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateModelRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Model); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Model); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["model.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "model.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "model.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "model.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_UpdateModel_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateModel(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelsService_DeleteModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteModelRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_DeleteModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteModelRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteModel(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelsService_EnableModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableModelRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.EnableModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_EnableModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableModelRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.EnableModel(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelsService_DisableModel_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableModelRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DisableModel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_DisableModel_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableModelRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DisableModel(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelsService_ListDisabledModels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ModelsService_ListDisabledModels_0(ctx context.Context, marshaler runtime.Marshaler, client ModelsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDisabledModelsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_ListDisabledModels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListDisabledModels(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelsService_ListDisabledModels_0(ctx context.Context, marshaler runtime.Marshaler, server ModelsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDisabledModelsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelsService_ListDisabledModels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListDisabledModels(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterModelsServiceHandlerServer registers the http handlers for service ModelsService to "mux". +// UnaryRPC :call ModelsServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterModelsServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterModelsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ModelsServiceServer) error { + mux.Handle(http.MethodPost, pattern_ModelsService_CreateModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/CreateModel", runtime.WithHTTPPathPattern("/v1/models")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_CreateModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_CreateModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_GetModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/GetModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_GetModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_GetModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_ListModels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/ListModels", runtime.WithHTTPPathPattern("/v1/models")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_ListModels_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_ListModels_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelsService_UpdateModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/UpdateModel", runtime.WithHTTPPathPattern("/v1/{model.name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_UpdateModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_UpdateModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelsService_DeleteModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/DeleteModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_DeleteModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_DeleteModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelsService_EnableModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/EnableModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}:enable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_EnableModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_EnableModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelsService_DisableModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/DisableModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_DisableModel_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_DisableModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_ListDisabledModels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/ListDisabledModels", runtime.WithHTTPPathPattern("/v1/models:listDisabled")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelsService_ListDisabledModels_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_ListDisabledModels_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterModelsServiceHandlerFromEndpoint is same as RegisterModelsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterModelsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterModelsServiceHandler(ctx, mux, conn) +} + +// RegisterModelsServiceHandler registers the http handlers for service ModelsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterModelsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterModelsServiceHandlerClient(ctx, mux, NewModelsServiceClient(conn)) +} + +// RegisterModelsServiceHandlerClient registers the http handlers for service ModelsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ModelsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ModelsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ModelsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterModelsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ModelsServiceClient) error { + mux.Handle(http.MethodPost, pattern_ModelsService_CreateModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/CreateModel", runtime.WithHTTPPathPattern("/v1/models")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_CreateModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_CreateModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_GetModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/GetModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_GetModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_GetModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_ListModels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/ListModels", runtime.WithHTTPPathPattern("/v1/models")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_ListModels_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_ListModels_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelsService_UpdateModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/UpdateModel", runtime.WithHTTPPathPattern("/v1/{model.name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_UpdateModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_UpdateModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelsService_DeleteModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/DeleteModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_DeleteModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_DeleteModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelsService_EnableModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/EnableModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}:enable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_EnableModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_EnableModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelsService_DisableModel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/DisableModel", runtime.WithHTTPPathPattern("/v1/{name=models/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_DisableModel_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_DisableModel_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelsService_ListDisabledModels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelsService/ListDisabledModels", runtime.WithHTTPPathPattern("/v1/models:listDisabled")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelsService_ListDisabledModels_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelsService_ListDisabledModels_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ModelsService_CreateModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "models"}, "")) + pattern_ModelsService_GetModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "models", "name"}, "")) + pattern_ModelsService_ListModels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "models"}, "")) + pattern_ModelsService_UpdateModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "models", "model.name"}, "")) + pattern_ModelsService_DeleteModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "models", "name"}, "")) + pattern_ModelsService_EnableModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "models", "name"}, "enable")) + pattern_ModelsService_DisableModel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "models", "name"}, "disable")) + pattern_ModelsService_ListDisabledModels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "models"}, "listDisabled")) +) + +var ( + forward_ModelsService_CreateModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_GetModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_ListModels_0 = runtime.ForwardResponseMessage + forward_ModelsService_UpdateModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_DeleteModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_EnableModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_DisableModel_0 = runtime.ForwardResponseMessage + forward_ModelsService_ListDisabledModels_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/models_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/models_grpc.pb.go new file mode 100644 index 0000000000..25547a2f3d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/models_grpc.pb.go @@ -0,0 +1,394 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/models.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ModelsService_CreateModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/CreateModel" + ModelsService_GetModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/GetModel" + ModelsService_ListModels_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/ListModels" + ModelsService_UpdateModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/UpdateModel" + ModelsService_DeleteModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/DeleteModel" + ModelsService_EnableModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/EnableModel" + ModelsService_DisableModel_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/DisableModel" + ModelsService_ListDisabledModels_FullMethodName = "/redpanda.api.aigateway.v1.ModelsService/ListDisabledModels" +) + +// ModelsServiceClient is the client API for ModelsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ModelsServiceClient interface { + CreateModel(ctx context.Context, in *CreateModelRequest, opts ...grpc.CallOption) (*CreateModelResponse, error) + GetModel(ctx context.Context, in *GetModelRequest, opts ...grpc.CallOption) (*GetModelResponse, error) + ListModels(ctx context.Context, in *ListModelsRequest, opts ...grpc.CallOption) (*ListModelsResponse, error) + UpdateModel(ctx context.Context, in *UpdateModelRequest, opts ...grpc.CallOption) (*UpdateModelResponse, error) + DeleteModel(ctx context.Context, in *DeleteModelRequest, opts ...grpc.CallOption) (*DeleteModelResponse, error) + // Enable a model for routing + EnableModel(ctx context.Context, in *EnableModelRequest, opts ...grpc.CallOption) (*EnableModelResponse, error) + // Disable a model (generates 0 req/s rate limit) + DisableModel(ctx context.Context, in *DisableModelRequest, opts ...grpc.CallOption) (*DisableModelResponse, error) + // List all disabled models (for generating rate limit rules) + ListDisabledModels(ctx context.Context, in *ListDisabledModelsRequest, opts ...grpc.CallOption) (*ListDisabledModelsResponse, error) +} + +type modelsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewModelsServiceClient(cc grpc.ClientConnInterface) ModelsServiceClient { + return &modelsServiceClient{cc} +} + +func (c *modelsServiceClient) CreateModel(ctx context.Context, in *CreateModelRequest, opts ...grpc.CallOption) (*CreateModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateModelResponse) + err := c.cc.Invoke(ctx, ModelsService_CreateModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) GetModel(ctx context.Context, in *GetModelRequest, opts ...grpc.CallOption) (*GetModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetModelResponse) + err := c.cc.Invoke(ctx, ModelsService_GetModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) ListModels(ctx context.Context, in *ListModelsRequest, opts ...grpc.CallOption) (*ListModelsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListModelsResponse) + err := c.cc.Invoke(ctx, ModelsService_ListModels_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) UpdateModel(ctx context.Context, in *UpdateModelRequest, opts ...grpc.CallOption) (*UpdateModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateModelResponse) + err := c.cc.Invoke(ctx, ModelsService_UpdateModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) DeleteModel(ctx context.Context, in *DeleteModelRequest, opts ...grpc.CallOption) (*DeleteModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteModelResponse) + err := c.cc.Invoke(ctx, ModelsService_DeleteModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) EnableModel(ctx context.Context, in *EnableModelRequest, opts ...grpc.CallOption) (*EnableModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EnableModelResponse) + err := c.cc.Invoke(ctx, ModelsService_EnableModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) DisableModel(ctx context.Context, in *DisableModelRequest, opts ...grpc.CallOption) (*DisableModelResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DisableModelResponse) + err := c.cc.Invoke(ctx, ModelsService_DisableModel_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelsServiceClient) ListDisabledModels(ctx context.Context, in *ListDisabledModelsRequest, opts ...grpc.CallOption) (*ListDisabledModelsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListDisabledModelsResponse) + err := c.cc.Invoke(ctx, ModelsService_ListDisabledModels_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ModelsServiceServer is the server API for ModelsService service. +// All implementations must embed UnimplementedModelsServiceServer +// for forward compatibility. +type ModelsServiceServer interface { + CreateModel(context.Context, *CreateModelRequest) (*CreateModelResponse, error) + GetModel(context.Context, *GetModelRequest) (*GetModelResponse, error) + ListModels(context.Context, *ListModelsRequest) (*ListModelsResponse, error) + UpdateModel(context.Context, *UpdateModelRequest) (*UpdateModelResponse, error) + DeleteModel(context.Context, *DeleteModelRequest) (*DeleteModelResponse, error) + // Enable a model for routing + EnableModel(context.Context, *EnableModelRequest) (*EnableModelResponse, error) + // Disable a model (generates 0 req/s rate limit) + DisableModel(context.Context, *DisableModelRequest) (*DisableModelResponse, error) + // List all disabled models (for generating rate limit rules) + ListDisabledModels(context.Context, *ListDisabledModelsRequest) (*ListDisabledModelsResponse, error) + mustEmbedUnimplementedModelsServiceServer() +} + +// UnimplementedModelsServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedModelsServiceServer struct{} + +func (UnimplementedModelsServiceServer) CreateModel(context.Context, *CreateModelRequest) (*CreateModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateModel not implemented") +} +func (UnimplementedModelsServiceServer) GetModel(context.Context, *GetModelRequest) (*GetModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetModel not implemented") +} +func (UnimplementedModelsServiceServer) ListModels(context.Context, *ListModelsRequest) (*ListModelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListModels not implemented") +} +func (UnimplementedModelsServiceServer) UpdateModel(context.Context, *UpdateModelRequest) (*UpdateModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateModel not implemented") +} +func (UnimplementedModelsServiceServer) DeleteModel(context.Context, *DeleteModelRequest) (*DeleteModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteModel not implemented") +} +func (UnimplementedModelsServiceServer) EnableModel(context.Context, *EnableModelRequest) (*EnableModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnableModel not implemented") +} +func (UnimplementedModelsServiceServer) DisableModel(context.Context, *DisableModelRequest) (*DisableModelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableModel not implemented") +} +func (UnimplementedModelsServiceServer) ListDisabledModels(context.Context, *ListDisabledModelsRequest) (*ListDisabledModelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDisabledModels not implemented") +} +func (UnimplementedModelsServiceServer) mustEmbedUnimplementedModelsServiceServer() {} +func (UnimplementedModelsServiceServer) testEmbeddedByValue() {} + +// UnsafeModelsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ModelsServiceServer will +// result in compilation errors. +type UnsafeModelsServiceServer interface { + mustEmbedUnimplementedModelsServiceServer() +} + +func RegisterModelsServiceServer(s grpc.ServiceRegistrar, srv ModelsServiceServer) { + // If the following call pancis, it indicates UnimplementedModelsServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ModelsService_ServiceDesc, srv) +} + +func _ModelsService_CreateModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).CreateModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_CreateModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).CreateModel(ctx, req.(*CreateModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_GetModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).GetModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_GetModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).GetModel(ctx, req.(*GetModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_ListModels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListModelsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).ListModels(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_ListModels_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).ListModels(ctx, req.(*ListModelsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_UpdateModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).UpdateModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_UpdateModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).UpdateModel(ctx, req.(*UpdateModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_DeleteModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).DeleteModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_DeleteModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).DeleteModel(ctx, req.(*DeleteModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_EnableModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnableModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).EnableModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_EnableModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).EnableModel(ctx, req.(*EnableModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_DisableModel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableModelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).DisableModel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_DisableModel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).DisableModel(ctx, req.(*DisableModelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelsService_ListDisabledModels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListDisabledModelsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelsServiceServer).ListDisabledModels(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelsService_ListDisabledModels_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelsServiceServer).ListDisabledModels(ctx, req.(*ListDisabledModelsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ModelsService_ServiceDesc is the grpc.ServiceDesc for ModelsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ModelsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.ModelsService", + HandlerType: (*ModelsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateModel", + Handler: _ModelsService_CreateModel_Handler, + }, + { + MethodName: "GetModel", + Handler: _ModelsService_GetModel_Handler, + }, + { + MethodName: "ListModels", + Handler: _ModelsService_ListModels_Handler, + }, + { + MethodName: "UpdateModel", + Handler: _ModelsService_UpdateModel_Handler, + }, + { + MethodName: "DeleteModel", + Handler: _ModelsService_DeleteModel_Handler, + }, + { + MethodName: "EnableModel", + Handler: _ModelsService_EnableModel_Handler, + }, + { + MethodName: "DisableModel", + Handler: _ModelsService_DisableModel_Handler, + }, + { + MethodName: "ListDisabledModels", + Handler: _ModelsService_ListDisabledModels_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/models.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.go new file mode 100644 index 0000000000..32136fd5aa --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.go @@ -0,0 +1,1667 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/oauth2_client.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// OAuth2ClientType defines the type of OAuth2 client. +type OAuth2ClientType int32 + +const ( + OAuth2ClientType_OAUTH2_CLIENT_TYPE_UNSPECIFIED OAuth2ClientType = 0 + // Interactive user clients (future: authorization_code flow) + OAuth2ClientType_OAUTH2_CLIENT_TYPE_USER OAuth2ClientType = 1 + // Service/machine clients (client_credentials flow) + OAuth2ClientType_OAUTH2_CLIENT_TYPE_SERVICE OAuth2ClientType = 2 +) + +// Enum value maps for OAuth2ClientType. +var ( + OAuth2ClientType_name = map[int32]string{ + 0: "OAUTH2_CLIENT_TYPE_UNSPECIFIED", + 1: "OAUTH2_CLIENT_TYPE_USER", + 2: "OAUTH2_CLIENT_TYPE_SERVICE", + } + OAuth2ClientType_value = map[string]int32{ + "OAUTH2_CLIENT_TYPE_UNSPECIFIED": 0, + "OAUTH2_CLIENT_TYPE_USER": 1, + "OAUTH2_CLIENT_TYPE_SERVICE": 2, + } +) + +func (x OAuth2ClientType) Enum() *OAuth2ClientType { + p := new(OAuth2ClientType) + *p = x + return p +} + +func (x OAuth2ClientType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (OAuth2ClientType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_enumTypes[0].Descriptor() +} + +func (OAuth2ClientType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_oauth2_client_proto_enumTypes[0] +} + +func (x OAuth2ClientType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use OAuth2ClientType.Descriptor instead. +func (OAuth2ClientType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{0} +} + +// OAuth2Client represents an OAuth2 client for machine-to-machine authentication. +type OAuth2Client struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `oauth2/clients/{client_id}` + // Client ID is a globally unique identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Client type: 'user' (interactive) or 'service' (machine-to-machine) + ClientType OAuth2ClientType `protobuf:"varint,4,opt,name=client_type,json=clientType,proto3,enum=redpanda.api.aigateway.v1.OAuth2ClientType" json:"client_type,omitempty"` + // Owner reference (exactly one must be set) + // + // Types that are valid to be assigned to Owner: + // + // *OAuth2Client_Organization + // *OAuth2Client_Workspace + // *OAuth2Client_Team + // *OAuth2Client_User + // *OAuth2Client_Gateway + Owner isOAuth2Client_Owner `protobuf_oneof:"owner"` + // OAuth2 redirect URIs (for authorization_code flow, future use) + RedirectUris []string `protobuf:"bytes,10,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` + // Allowed OAuth2 scopes + Scopes []string `protobuf:"bytes,11,rep,name=scopes,proto3" json:"scopes,omitempty"` + // Supported grant types (default: client_credentials) + GrantTypes []string `protobuf:"bytes,12,rep,name=grant_types,json=grantTypes,proto3" json:"grant_types,omitempty"` + // Whether this client is active + Enabled bool `protobuf:"varint,13,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Optional: Expiration time for the client + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // Output only. Last time this client was used + LastUsedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=last_used_at,json=lastUsedAt,proto3" json:"last_used_at,omitempty"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,18,opt,name=creator,proto3" json:"creator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OAuth2Client) Reset() { + *x = OAuth2Client{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OAuth2Client) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OAuth2Client) ProtoMessage() {} + +func (x *OAuth2Client) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OAuth2Client.ProtoReflect.Descriptor instead. +func (*OAuth2Client) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{0} +} + +func (x *OAuth2Client) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OAuth2Client) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *OAuth2Client) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *OAuth2Client) GetClientType() OAuth2ClientType { + if x != nil { + return x.ClientType + } + return OAuth2ClientType_OAUTH2_CLIENT_TYPE_UNSPECIFIED +} + +func (x *OAuth2Client) GetOwner() isOAuth2Client_Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *OAuth2Client) GetOrganization() string { + if x != nil { + if x, ok := x.Owner.(*OAuth2Client_Organization); ok { + return x.Organization + } + } + return "" +} + +func (x *OAuth2Client) GetWorkspace() string { + if x != nil { + if x, ok := x.Owner.(*OAuth2Client_Workspace); ok { + return x.Workspace + } + } + return "" +} + +func (x *OAuth2Client) GetTeam() string { + if x != nil { + if x, ok := x.Owner.(*OAuth2Client_Team); ok { + return x.Team + } + } + return "" +} + +func (x *OAuth2Client) GetUser() string { + if x != nil { + if x, ok := x.Owner.(*OAuth2Client_User); ok { + return x.User + } + } + return "" +} + +func (x *OAuth2Client) GetGateway() string { + if x != nil { + if x, ok := x.Owner.(*OAuth2Client_Gateway); ok { + return x.Gateway + } + } + return "" +} + +func (x *OAuth2Client) GetRedirectUris() []string { + if x != nil { + return x.RedirectUris + } + return nil +} + +func (x *OAuth2Client) GetScopes() []string { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *OAuth2Client) GetGrantTypes() []string { + if x != nil { + return x.GrantTypes + } + return nil +} + +func (x *OAuth2Client) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *OAuth2Client) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *OAuth2Client) GetLastUsedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastUsedAt + } + return nil +} + +func (x *OAuth2Client) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *OAuth2Client) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *OAuth2Client) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +type isOAuth2Client_Owner interface { + isOAuth2Client_Owner() +} + +type OAuth2Client_Organization struct { + // Organization that owns this client + Organization string `protobuf:"bytes,5,opt,name=organization,proto3,oneof"` +} + +type OAuth2Client_Workspace struct { + // Workspace that owns this client + Workspace string `protobuf:"bytes,6,opt,name=workspace,proto3,oneof"` +} + +type OAuth2Client_Team struct { + // Team that owns this client + Team string `protobuf:"bytes,7,opt,name=team,proto3,oneof"` +} + +type OAuth2Client_User struct { + // User that owns this client + User string `protobuf:"bytes,8,opt,name=user,proto3,oneof"` +} + +type OAuth2Client_Gateway struct { + // Gateway that owns this client + Gateway string `protobuf:"bytes,9,opt,name=gateway,proto3,oneof"` +} + +func (*OAuth2Client_Organization) isOAuth2Client_Owner() {} + +func (*OAuth2Client_Workspace) isOAuth2Client_Owner() {} + +func (*OAuth2Client_Team) isOAuth2Client_Owner() {} + +func (*OAuth2Client_User) isOAuth2Client_Owner() {} + +func (*OAuth2Client_Gateway) isOAuth2Client_Owner() {} + +// OAuth2ClientWithSecret is returned only on creation or secret rotation. +type OAuth2ClientWithSecret struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The OAuth2 client + Client *OAuth2Client `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + // Output only. The plaintext client secret. + // This is ONLY returned during creation or rotation. + // Store this securely - it cannot be retrieved again. + ClientSecret string `protobuf:"bytes,2,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OAuth2ClientWithSecret) Reset() { + *x = OAuth2ClientWithSecret{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OAuth2ClientWithSecret) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OAuth2ClientWithSecret) ProtoMessage() {} + +func (x *OAuth2ClientWithSecret) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OAuth2ClientWithSecret.ProtoReflect.Descriptor instead. +func (*OAuth2ClientWithSecret) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{1} +} + +func (x *OAuth2ClientWithSecret) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +func (x *OAuth2ClientWithSecret) GetClientSecret() string { + if x != nil { + return x.ClientSecret + } + return "" +} + +// Request message for CreateOAuth2Client RPC. +type CreateOAuth2ClientRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The OAuth2 client to create. + Client *OAuth2Client `protobuf:"bytes,2,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOAuth2ClientRequest) Reset() { + *x = CreateOAuth2ClientRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOAuth2ClientRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOAuth2ClientRequest) ProtoMessage() {} + +func (x *CreateOAuth2ClientRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOAuth2ClientRequest.ProtoReflect.Descriptor instead. +func (*CreateOAuth2ClientRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateOAuth2ClientRequest) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +// Response message for CreateOAuth2Client RPC. +// Includes the plaintext secret - store it securely! +type CreateOAuth2ClientResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Client *OAuth2ClientWithSecret `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOAuth2ClientResponse) Reset() { + *x = CreateOAuth2ClientResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOAuth2ClientResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOAuth2ClientResponse) ProtoMessage() {} + +func (x *CreateOAuth2ClientResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOAuth2ClientResponse.ProtoReflect.Descriptor instead. +func (*CreateOAuth2ClientResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateOAuth2ClientResponse) GetClient() *OAuth2ClientWithSecret { + if x != nil { + return x.Client + } + return nil +} + +// Request message for GetOAuth2Client RPC. +type GetOAuth2ClientRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the client. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOAuth2ClientRequest) Reset() { + *x = GetOAuth2ClientRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOAuth2ClientRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOAuth2ClientRequest) ProtoMessage() {} + +func (x *GetOAuth2ClientRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOAuth2ClientRequest.ProtoReflect.Descriptor instead. +func (*GetOAuth2ClientRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{4} +} + +func (x *GetOAuth2ClientRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetOAuth2Client RPC. +// Note: client_secret is never returned. +type GetOAuth2ClientResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Client *OAuth2Client `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOAuth2ClientResponse) Reset() { + *x = GetOAuth2ClientResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOAuth2ClientResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOAuth2ClientResponse) ProtoMessage() {} + +func (x *GetOAuth2ClientResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOAuth2ClientResponse.ProtoReflect.Descriptor instead. +func (*GetOAuth2ClientResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{5} +} + +func (x *GetOAuth2ClientResponse) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +// Request message for ListOAuth2Clients RPC. +type ListOAuth2ClientsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Filter by owner type and ID (optional) + // Format examples: + // + // organization=accounts/*/organizations/* + // workspace=accounts/*/organizations/*/workspaces/* + // user=accounts/*/organizations/*/users/* + // gateway=gateways/* + Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"` + // Filter by client type + ClientType OAuth2ClientType `protobuf:"varint,2,opt,name=client_type,json=clientType,proto3,enum=redpanda.api.aigateway.v1.OAuth2ClientType" json:"client_type,omitempty"` + // Maximum number of clients to return (max 1000) + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOAuth2ClientsRequest) Reset() { + *x = ListOAuth2ClientsRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOAuth2ClientsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOAuth2ClientsRequest) ProtoMessage() {} + +func (x *ListOAuth2ClientsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOAuth2ClientsRequest.ProtoReflect.Descriptor instead. +func (*ListOAuth2ClientsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{6} +} + +func (x *ListOAuth2ClientsRequest) GetOwner() string { + if x != nil { + return x.Owner + } + return "" +} + +func (x *ListOAuth2ClientsRequest) GetClientType() OAuth2ClientType { + if x != nil { + return x.ClientType + } + return OAuth2ClientType_OAUTH2_CLIENT_TYPE_UNSPECIFIED +} + +func (x *ListOAuth2ClientsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListOAuth2ClientsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListOAuth2ClientsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListOAuth2ClientsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListOAuth2Clients RPC. +type ListOAuth2ClientsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of OAuth2 clients (without secrets) + Clients []*OAuth2Client `protobuf:"bytes,1,rep,name=clients,proto3" json:"clients,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOAuth2ClientsResponse) Reset() { + *x = ListOAuth2ClientsResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOAuth2ClientsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOAuth2ClientsResponse) ProtoMessage() {} + +func (x *ListOAuth2ClientsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOAuth2ClientsResponse.ProtoReflect.Descriptor instead. +func (*ListOAuth2ClientsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{7} +} + +func (x *ListOAuth2ClientsResponse) GetClients() []*OAuth2Client { + if x != nil { + return x.Clients + } + return nil +} + +func (x *ListOAuth2ClientsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListOAuth2ClientsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateOAuth2Client RPC. +type UpdateOAuth2ClientRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The client to update. + Client *OAuth2Client `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + // The fields to update. + // Allowed fields: display_name, description, redirect_uris, scopes, grant_types, enabled, expires_at + // Note: Owner cannot be changed after creation. + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateOAuth2ClientRequest) Reset() { + *x = UpdateOAuth2ClientRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateOAuth2ClientRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateOAuth2ClientRequest) ProtoMessage() {} + +func (x *UpdateOAuth2ClientRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateOAuth2ClientRequest.ProtoReflect.Descriptor instead. +func (*UpdateOAuth2ClientRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateOAuth2ClientRequest) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +func (x *UpdateOAuth2ClientRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateOAuth2Client RPC. +type UpdateOAuth2ClientResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Client *OAuth2Client `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateOAuth2ClientResponse) Reset() { + *x = UpdateOAuth2ClientResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateOAuth2ClientResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateOAuth2ClientResponse) ProtoMessage() {} + +func (x *UpdateOAuth2ClientResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateOAuth2ClientResponse.ProtoReflect.Descriptor instead. +func (*UpdateOAuth2ClientResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateOAuth2ClientResponse) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +// Request message for DeleteOAuth2Client RPC. +type DeleteOAuth2ClientRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the client to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOAuth2ClientRequest) Reset() { + *x = DeleteOAuth2ClientRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOAuth2ClientRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOAuth2ClientRequest) ProtoMessage() {} + +func (x *DeleteOAuth2ClientRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOAuth2ClientRequest.ProtoReflect.Descriptor instead. +func (*DeleteOAuth2ClientRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteOAuth2ClientRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DeleteOAuth2Client RPC. +type DeleteOAuth2ClientResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOAuth2ClientResponse) Reset() { + *x = DeleteOAuth2ClientResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOAuth2ClientResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOAuth2ClientResponse) ProtoMessage() {} + +func (x *DeleteOAuth2ClientResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOAuth2ClientResponse.ProtoReflect.Descriptor instead. +func (*DeleteOAuth2ClientResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{11} +} + +// Request message for RotateOAuth2ClientSecret RPC. +type RotateOAuth2ClientSecretRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the client. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateOAuth2ClientSecretRequest) Reset() { + *x = RotateOAuth2ClientSecretRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateOAuth2ClientSecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateOAuth2ClientSecretRequest) ProtoMessage() {} + +func (x *RotateOAuth2ClientSecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotateOAuth2ClientSecretRequest.ProtoReflect.Descriptor instead. +func (*RotateOAuth2ClientSecretRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{12} +} + +func (x *RotateOAuth2ClientSecretRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RotateOAuth2ClientSecret RPC. +// Includes the new plaintext secret - store it securely! +type RotateOAuth2ClientSecretResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Client *OAuth2ClientWithSecret `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateOAuth2ClientSecretResponse) Reset() { + *x = RotateOAuth2ClientSecretResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateOAuth2ClientSecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateOAuth2ClientSecretResponse) ProtoMessage() {} + +func (x *RotateOAuth2ClientSecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotateOAuth2ClientSecretResponse.ProtoReflect.Descriptor instead. +func (*RotateOAuth2ClientSecretResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{13} +} + +func (x *RotateOAuth2ClientSecretResponse) GetClient() *OAuth2ClientWithSecret { + if x != nil { + return x.Client + } + return nil +} + +// Request message for DisableOAuth2Client RPC. +type DisableOAuth2ClientRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the client to disable. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableOAuth2ClientRequest) Reset() { + *x = DisableOAuth2ClientRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableOAuth2ClientRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableOAuth2ClientRequest) ProtoMessage() {} + +func (x *DisableOAuth2ClientRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableOAuth2ClientRequest.ProtoReflect.Descriptor instead. +func (*DisableOAuth2ClientRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{14} +} + +func (x *DisableOAuth2ClientRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DisableOAuth2Client RPC. +type DisableOAuth2ClientResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Client *OAuth2Client `protobuf:"bytes,1,opt,name=client,proto3" json:"client,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DisableOAuth2ClientResponse) Reset() { + *x = DisableOAuth2ClientResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DisableOAuth2ClientResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableOAuth2ClientResponse) ProtoMessage() {} + +func (x *DisableOAuth2ClientResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableOAuth2ClientResponse.ProtoReflect.Descriptor instead. +func (*DisableOAuth2ClientResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{15} +} + +func (x *DisableOAuth2ClientResponse) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +// Request message for ValidateClientCredentials RPC. +type ValidateClientCredentialsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Client ID (the resource name suffix, e.g., from "oauth2/clients/{id}") + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // Client secret to validate + ClientSecret string `protobuf:"bytes,2,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidateClientCredentialsRequest) Reset() { + *x = ValidateClientCredentialsRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidateClientCredentialsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateClientCredentialsRequest) ProtoMessage() {} + +func (x *ValidateClientCredentialsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateClientCredentialsRequest.ProtoReflect.Descriptor instead. +func (*ValidateClientCredentialsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{16} +} + +func (x *ValidateClientCredentialsRequest) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +func (x *ValidateClientCredentialsRequest) GetClientSecret() string { + if x != nil { + return x.ClientSecret + } + return "" +} + +// Response message for ValidateClientCredentials RPC. +type ValidateClientCredentialsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether the credentials are valid + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + // The authenticated client (only set if valid=true) + Client *OAuth2Client `protobuf:"bytes,2,opt,name=client,proto3" json:"client,omitempty"` + // Error message if validation failed (for logging/debugging) + ErrorMessage string `protobuf:"bytes,3,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidateClientCredentialsResponse) Reset() { + *x = ValidateClientCredentialsResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidateClientCredentialsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateClientCredentialsResponse) ProtoMessage() {} + +func (x *ValidateClientCredentialsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateClientCredentialsResponse.ProtoReflect.Descriptor instead. +func (*ValidateClientCredentialsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP(), []int{17} +} + +func (x *ValidateClientCredentialsResponse) GetValid() bool { + if x != nil { + return x.Valid + } + return false +} + +func (x *ValidateClientCredentialsResponse) GetClient() *OAuth2Client { + if x != nil { + return x.Client + } + return nil +} + +func (x *ValidateClientCredentialsResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +var File_redpanda_api_aigateway_v1_oauth2_client_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDesc = []byte{ + 0x0a, 0x2d, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, + 0x68, 0x32, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x08, + 0x0a, 0x0c, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x17, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xfa, 0x41, 0x25, 0x0a, 0x23, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x65, + 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, + 0x61, 0x6d, 0x12, 0x36, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x20, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x73, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x07, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xfa, 0x41, 0x20, + 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x48, 0x00, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x41, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x41, 0xea, 0x41, 0x3e, 0x0a, 0x23, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x12, 0x17, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x7d, 0x42, 0x07, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x72, 0x0a, 0x19, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4a, 0x04, + 0x08, 0x01, 0x10, 0x02, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, + 0x67, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, + 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x59, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, + 0x95, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, + 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xa5, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, + 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0xa3, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, + 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x5d, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, + 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x62, 0x0a, 0x1f, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x20, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x1a, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x5e, 0x0a, 0x1b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x22, 0x6e, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2a, 0x73, 0x0a, 0x10, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x41, 0x55, 0x54, + 0x48, 0x32, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, + 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x41, 0x55, + 0x54, 0x48, 0x32, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x32, 0xc4, 0x0b, 0x0a, 0x13, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, + 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x06, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, + 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9d, 0x01, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x9a, 0x01, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x3a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x32, 0x22, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, + 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa6, + 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc8, 0x01, 0x0a, 0x18, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x12, 0xb4, 0x01, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, + 0x7d, 0x3a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0xc9, 0x01, 0x0a, 0x19, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, + 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x3a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x42, 0x86, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x42, 0x11, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, + 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, + 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescData = file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_oauth2_client_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_redpanda_api_aigateway_v1_oauth2_client_proto_goTypes = []any{ + (OAuth2ClientType)(0), // 0: redpanda.api.aigateway.v1.OAuth2ClientType + (*OAuth2Client)(nil), // 1: redpanda.api.aigateway.v1.OAuth2Client + (*OAuth2ClientWithSecret)(nil), // 2: redpanda.api.aigateway.v1.OAuth2ClientWithSecret + (*CreateOAuth2ClientRequest)(nil), // 3: redpanda.api.aigateway.v1.CreateOAuth2ClientRequest + (*CreateOAuth2ClientResponse)(nil), // 4: redpanda.api.aigateway.v1.CreateOAuth2ClientResponse + (*GetOAuth2ClientRequest)(nil), // 5: redpanda.api.aigateway.v1.GetOAuth2ClientRequest + (*GetOAuth2ClientResponse)(nil), // 6: redpanda.api.aigateway.v1.GetOAuth2ClientResponse + (*ListOAuth2ClientsRequest)(nil), // 7: redpanda.api.aigateway.v1.ListOAuth2ClientsRequest + (*ListOAuth2ClientsResponse)(nil), // 8: redpanda.api.aigateway.v1.ListOAuth2ClientsResponse + (*UpdateOAuth2ClientRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest + (*UpdateOAuth2ClientResponse)(nil), // 10: redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse + (*DeleteOAuth2ClientRequest)(nil), // 11: redpanda.api.aigateway.v1.DeleteOAuth2ClientRequest + (*DeleteOAuth2ClientResponse)(nil), // 12: redpanda.api.aigateway.v1.DeleteOAuth2ClientResponse + (*RotateOAuth2ClientSecretRequest)(nil), // 13: redpanda.api.aigateway.v1.RotateOAuth2ClientSecretRequest + (*RotateOAuth2ClientSecretResponse)(nil), // 14: redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse + (*DisableOAuth2ClientRequest)(nil), // 15: redpanda.api.aigateway.v1.DisableOAuth2ClientRequest + (*DisableOAuth2ClientResponse)(nil), // 16: redpanda.api.aigateway.v1.DisableOAuth2ClientResponse + (*ValidateClientCredentialsRequest)(nil), // 17: redpanda.api.aigateway.v1.ValidateClientCredentialsRequest + (*ValidateClientCredentialsResponse)(nil), // 18: redpanda.api.aigateway.v1.ValidateClientCredentialsResponse + (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 20: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_oauth2_client_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.OAuth2Client.client_type:type_name -> redpanda.api.aigateway.v1.OAuth2ClientType + 19, // 1: redpanda.api.aigateway.v1.OAuth2Client.expires_at:type_name -> google.protobuf.Timestamp + 19, // 2: redpanda.api.aigateway.v1.OAuth2Client.last_used_at:type_name -> google.protobuf.Timestamp + 19, // 3: redpanda.api.aigateway.v1.OAuth2Client.create_time:type_name -> google.protobuf.Timestamp + 19, // 4: redpanda.api.aigateway.v1.OAuth2Client.update_time:type_name -> google.protobuf.Timestamp + 1, // 5: redpanda.api.aigateway.v1.OAuth2ClientWithSecret.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 1, // 6: redpanda.api.aigateway.v1.CreateOAuth2ClientRequest.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 2, // 7: redpanda.api.aigateway.v1.CreateOAuth2ClientResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2ClientWithSecret + 1, // 8: redpanda.api.aigateway.v1.GetOAuth2ClientResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 0, // 9: redpanda.api.aigateway.v1.ListOAuth2ClientsRequest.client_type:type_name -> redpanda.api.aigateway.v1.OAuth2ClientType + 1, // 10: redpanda.api.aigateway.v1.ListOAuth2ClientsResponse.clients:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 1, // 11: redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 20, // 12: redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest.update_mask:type_name -> google.protobuf.FieldMask + 1, // 13: redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 2, // 14: redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2ClientWithSecret + 1, // 15: redpanda.api.aigateway.v1.DisableOAuth2ClientResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 1, // 16: redpanda.api.aigateway.v1.ValidateClientCredentialsResponse.client:type_name -> redpanda.api.aigateway.v1.OAuth2Client + 3, // 17: redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client:input_type -> redpanda.api.aigateway.v1.CreateOAuth2ClientRequest + 5, // 18: redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client:input_type -> redpanda.api.aigateway.v1.GetOAuth2ClientRequest + 7, // 19: redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients:input_type -> redpanda.api.aigateway.v1.ListOAuth2ClientsRequest + 9, // 20: redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client:input_type -> redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest + 11, // 21: redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client:input_type -> redpanda.api.aigateway.v1.DeleteOAuth2ClientRequest + 13, // 22: redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret:input_type -> redpanda.api.aigateway.v1.RotateOAuth2ClientSecretRequest + 15, // 23: redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client:input_type -> redpanda.api.aigateway.v1.DisableOAuth2ClientRequest + 17, // 24: redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials:input_type -> redpanda.api.aigateway.v1.ValidateClientCredentialsRequest + 4, // 25: redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client:output_type -> redpanda.api.aigateway.v1.CreateOAuth2ClientResponse + 6, // 26: redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client:output_type -> redpanda.api.aigateway.v1.GetOAuth2ClientResponse + 8, // 27: redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients:output_type -> redpanda.api.aigateway.v1.ListOAuth2ClientsResponse + 10, // 28: redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client:output_type -> redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse + 12, // 29: redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client:output_type -> redpanda.api.aigateway.v1.DeleteOAuth2ClientResponse + 14, // 30: redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret:output_type -> redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse + 16, // 31: redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client:output_type -> redpanda.api.aigateway.v1.DisableOAuth2ClientResponse + 18, // 32: redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials:output_type -> redpanda.api.aigateway.v1.ValidateClientCredentialsResponse + 25, // [25:33] is the sub-list for method output_type + 17, // [17:25] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_oauth2_client_proto_init() } +func file_redpanda_api_aigateway_v1_oauth2_client_proto_init() { + if File_redpanda_api_aigateway_v1_oauth2_client_proto != nil { + return + } + file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes[0].OneofWrappers = []any{ + (*OAuth2Client_Organization)(nil), + (*OAuth2Client_Workspace)(nil), + (*OAuth2Client_Team)(nil), + (*OAuth2Client_User)(nil), + (*OAuth2Client_Gateway)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDesc, + NumEnums: 1, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_oauth2_client_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_oauth2_client_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_oauth2_client_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_oauth2_client_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_oauth2_client_proto = out.File + file_redpanda_api_aigateway_v1_oauth2_client_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_oauth2_client_proto_goTypes = nil + file_redpanda_api_aigateway_v1_oauth2_client_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.gw.go new file mode 100644 index 0000000000..a4b4b2f976 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client.pb.gw.go @@ -0,0 +1,741 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/oauth2_client.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_OAuth2ClientService_CreateOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOAuth2ClientRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Client); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.CreateOAuth2Client(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_CreateOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOAuth2ClientRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Client); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateOAuth2Client(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2ClientService_GetOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetOAuth2Client(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_GetOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetOAuth2Client(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OAuth2ClientService_ListOAuth2Clients_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_OAuth2ClientService_ListOAuth2Clients_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOAuth2ClientsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2ClientService_ListOAuth2Clients_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListOAuth2Clients(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_ListOAuth2Clients_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOAuth2ClientsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2ClientService_ListOAuth2Clients_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListOAuth2Clients(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OAuth2ClientService_UpdateOAuth2Client_0 = &utilities.DoubleArray{Encoding: map[string]int{"client": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_OAuth2ClientService_UpdateOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Client); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Client); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["client.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "client.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "client.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "client.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2ClientService_UpdateOAuth2Client_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateOAuth2Client(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_UpdateOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Client); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Client); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["client.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "client.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "client.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "client.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2ClientService_UpdateOAuth2Client_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateOAuth2Client(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2ClientService_DeleteOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteOAuth2Client(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_DeleteOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteOAuth2Client(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2ClientService_RotateOAuth2ClientSecret_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotateOAuth2ClientSecretRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RotateOAuth2ClientSecret(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_RotateOAuth2ClientSecret_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotateOAuth2ClientSecretRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RotateOAuth2ClientSecret(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2ClientService_DisableOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DisableOAuth2Client(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_DisableOAuth2Client_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableOAuth2ClientRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DisableOAuth2Client(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2ClientService_ValidateClientCredentials_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2ClientServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ValidateClientCredentialsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.ValidateClientCredentials(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2ClientService_ValidateClientCredentials_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2ClientServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ValidateClientCredentialsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ValidateClientCredentials(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterOAuth2ClientServiceHandlerServer registers the http handlers for service OAuth2ClientService to "mux". +// UnaryRPC :call OAuth2ClientServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterOAuth2ClientServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterOAuth2ClientServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server OAuth2ClientServiceServer) error { + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_CreateOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/CreateOAuth2Client", runtime.WithHTTPPathPattern("/v1/oauth2/clients")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_CreateOAuth2Client_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_CreateOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2ClientService_GetOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/GetOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_GetOAuth2Client_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_GetOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2ClientService_ListOAuth2Clients_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/ListOAuth2Clients", runtime.WithHTTPPathPattern("/v1/oauth2/clients")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_ListOAuth2Clients_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_ListOAuth2Clients_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_OAuth2ClientService_UpdateOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/UpdateOAuth2Client", runtime.WithHTTPPathPattern("/v1/{client.name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_UpdateOAuth2Client_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_UpdateOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OAuth2ClientService_DeleteOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/DeleteOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_DeleteOAuth2Client_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_DeleteOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_RotateOAuth2ClientSecret_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/RotateOAuth2ClientSecret", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}:rotateSecret")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_RotateOAuth2ClientSecret_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_RotateOAuth2ClientSecret_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_DisableOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/DisableOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_DisableOAuth2Client_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_DisableOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_ValidateClientCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/ValidateClientCredentials", runtime.WithHTTPPathPattern("/v1/oauth2/clients:validateCredentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2ClientService_ValidateClientCredentials_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_ValidateClientCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterOAuth2ClientServiceHandlerFromEndpoint is same as RegisterOAuth2ClientServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterOAuth2ClientServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterOAuth2ClientServiceHandler(ctx, mux, conn) +} + +// RegisterOAuth2ClientServiceHandler registers the http handlers for service OAuth2ClientService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterOAuth2ClientServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterOAuth2ClientServiceHandlerClient(ctx, mux, NewOAuth2ClientServiceClient(conn)) +} + +// RegisterOAuth2ClientServiceHandlerClient registers the http handlers for service OAuth2ClientService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "OAuth2ClientServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "OAuth2ClientServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "OAuth2ClientServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterOAuth2ClientServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client OAuth2ClientServiceClient) error { + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_CreateOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/CreateOAuth2Client", runtime.WithHTTPPathPattern("/v1/oauth2/clients")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_CreateOAuth2Client_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_CreateOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2ClientService_GetOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/GetOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_GetOAuth2Client_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_GetOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2ClientService_ListOAuth2Clients_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/ListOAuth2Clients", runtime.WithHTTPPathPattern("/v1/oauth2/clients")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_ListOAuth2Clients_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_ListOAuth2Clients_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_OAuth2ClientService_UpdateOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/UpdateOAuth2Client", runtime.WithHTTPPathPattern("/v1/{client.name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_UpdateOAuth2Client_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_UpdateOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OAuth2ClientService_DeleteOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/DeleteOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_DeleteOAuth2Client_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_DeleteOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_RotateOAuth2ClientSecret_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/RotateOAuth2ClientSecret", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}:rotateSecret")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_RotateOAuth2ClientSecret_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_RotateOAuth2ClientSecret_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_DisableOAuth2Client_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/DisableOAuth2Client", runtime.WithHTTPPathPattern("/v1/{name=oauth2/clients/*}:disable")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_DisableOAuth2Client_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_DisableOAuth2Client_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2ClientService_ValidateClientCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2ClientService/ValidateClientCredentials", runtime.WithHTTPPathPattern("/v1/oauth2/clients:validateCredentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2ClientService_ValidateClientCredentials_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2ClientService_ValidateClientCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_OAuth2ClientService_CreateOAuth2Client_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "clients"}, "")) + pattern_OAuth2ClientService_GetOAuth2Client_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "clients", "name"}, "")) + pattern_OAuth2ClientService_ListOAuth2Clients_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "clients"}, "")) + pattern_OAuth2ClientService_UpdateOAuth2Client_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "clients", "client.name"}, "")) + pattern_OAuth2ClientService_DeleteOAuth2Client_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "clients", "name"}, "")) + pattern_OAuth2ClientService_RotateOAuth2ClientSecret_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "clients", "name"}, "rotateSecret")) + pattern_OAuth2ClientService_DisableOAuth2Client_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "clients", "name"}, "disable")) + pattern_OAuth2ClientService_ValidateClientCredentials_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "clients"}, "validateCredentials")) +) + +var ( + forward_OAuth2ClientService_CreateOAuth2Client_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_GetOAuth2Client_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_ListOAuth2Clients_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_UpdateOAuth2Client_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_DeleteOAuth2Client_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_RotateOAuth2ClientSecret_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_DisableOAuth2Client_0 = runtime.ForwardResponseMessage + forward_OAuth2ClientService_ValidateClientCredentials_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client_grpc.pb.go new file mode 100644 index 0000000000..5a54927069 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_client_grpc.pb.go @@ -0,0 +1,420 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/oauth2_client.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + OAuth2ClientService_CreateOAuth2Client_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/CreateOAuth2Client" + OAuth2ClientService_GetOAuth2Client_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/GetOAuth2Client" + OAuth2ClientService_ListOAuth2Clients_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/ListOAuth2Clients" + OAuth2ClientService_UpdateOAuth2Client_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/UpdateOAuth2Client" + OAuth2ClientService_DeleteOAuth2Client_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/DeleteOAuth2Client" + OAuth2ClientService_RotateOAuth2ClientSecret_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/RotateOAuth2ClientSecret" + OAuth2ClientService_DisableOAuth2Client_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/DisableOAuth2Client" + OAuth2ClientService_ValidateClientCredentials_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2ClientService/ValidateClientCredentials" +) + +// OAuth2ClientServiceClient is the client API for OAuth2ClientService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// OAuth2ClientService manages OAuth2 client credentials. +// Clients can be owned by organizations, workspaces, teams, users, or gateways. +// Resource name: oauth2/clients/{client_id} +type OAuth2ClientServiceClient interface { + // Creates a new OAuth2 client. + // Returns the client with plaintext secret (only returned on creation). + CreateOAuth2Client(ctx context.Context, in *CreateOAuth2ClientRequest, opts ...grpc.CallOption) (*CreateOAuth2ClientResponse, error) + // Gets an OAuth2 client by name. + // Note: The client_secret is never returned after creation. + GetOAuth2Client(ctx context.Context, in *GetOAuth2ClientRequest, opts ...grpc.CallOption) (*GetOAuth2ClientResponse, error) + // Lists OAuth2 clients. + ListOAuth2Clients(ctx context.Context, in *ListOAuth2ClientsRequest, opts ...grpc.CallOption) (*ListOAuth2ClientsResponse, error) + // Updates an OAuth2 client. + UpdateOAuth2Client(ctx context.Context, in *UpdateOAuth2ClientRequest, opts ...grpc.CallOption) (*UpdateOAuth2ClientResponse, error) + // Deletes an OAuth2 client. + DeleteOAuth2Client(ctx context.Context, in *DeleteOAuth2ClientRequest, opts ...grpc.CallOption) (*DeleteOAuth2ClientResponse, error) + // Rotates an OAuth2 client's secret. + // Returns the new plaintext secret (only returned during rotation). + RotateOAuth2ClientSecret(ctx context.Context, in *RotateOAuth2ClientSecretRequest, opts ...grpc.CallOption) (*RotateOAuth2ClientSecretResponse, error) + // Disables an OAuth2 client (soft delete). + DisableOAuth2Client(ctx context.Context, in *DisableOAuth2ClientRequest, opts ...grpc.CallOption) (*DisableOAuth2ClientResponse, error) + // Validates OAuth2 client credentials. + // Used for authenticating client_credentials grant requests. + ValidateClientCredentials(ctx context.Context, in *ValidateClientCredentialsRequest, opts ...grpc.CallOption) (*ValidateClientCredentialsResponse, error) +} + +type oAuth2ClientServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewOAuth2ClientServiceClient(cc grpc.ClientConnInterface) OAuth2ClientServiceClient { + return &oAuth2ClientServiceClient{cc} +} + +func (c *oAuth2ClientServiceClient) CreateOAuth2Client(ctx context.Context, in *CreateOAuth2ClientRequest, opts ...grpc.CallOption) (*CreateOAuth2ClientResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateOAuth2ClientResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_CreateOAuth2Client_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) GetOAuth2Client(ctx context.Context, in *GetOAuth2ClientRequest, opts ...grpc.CallOption) (*GetOAuth2ClientResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetOAuth2ClientResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_GetOAuth2Client_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) ListOAuth2Clients(ctx context.Context, in *ListOAuth2ClientsRequest, opts ...grpc.CallOption) (*ListOAuth2ClientsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListOAuth2ClientsResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_ListOAuth2Clients_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) UpdateOAuth2Client(ctx context.Context, in *UpdateOAuth2ClientRequest, opts ...grpc.CallOption) (*UpdateOAuth2ClientResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateOAuth2ClientResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_UpdateOAuth2Client_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) DeleteOAuth2Client(ctx context.Context, in *DeleteOAuth2ClientRequest, opts ...grpc.CallOption) (*DeleteOAuth2ClientResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteOAuth2ClientResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_DeleteOAuth2Client_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) RotateOAuth2ClientSecret(ctx context.Context, in *RotateOAuth2ClientSecretRequest, opts ...grpc.CallOption) (*RotateOAuth2ClientSecretResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RotateOAuth2ClientSecretResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_RotateOAuth2ClientSecret_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) DisableOAuth2Client(ctx context.Context, in *DisableOAuth2ClientRequest, opts ...grpc.CallOption) (*DisableOAuth2ClientResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DisableOAuth2ClientResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_DisableOAuth2Client_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2ClientServiceClient) ValidateClientCredentials(ctx context.Context, in *ValidateClientCredentialsRequest, opts ...grpc.CallOption) (*ValidateClientCredentialsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ValidateClientCredentialsResponse) + err := c.cc.Invoke(ctx, OAuth2ClientService_ValidateClientCredentials_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OAuth2ClientServiceServer is the server API for OAuth2ClientService service. +// All implementations must embed UnimplementedOAuth2ClientServiceServer +// for forward compatibility. +// +// OAuth2ClientService manages OAuth2 client credentials. +// Clients can be owned by organizations, workspaces, teams, users, or gateways. +// Resource name: oauth2/clients/{client_id} +type OAuth2ClientServiceServer interface { + // Creates a new OAuth2 client. + // Returns the client with plaintext secret (only returned on creation). + CreateOAuth2Client(context.Context, *CreateOAuth2ClientRequest) (*CreateOAuth2ClientResponse, error) + // Gets an OAuth2 client by name. + // Note: The client_secret is never returned after creation. + GetOAuth2Client(context.Context, *GetOAuth2ClientRequest) (*GetOAuth2ClientResponse, error) + // Lists OAuth2 clients. + ListOAuth2Clients(context.Context, *ListOAuth2ClientsRequest) (*ListOAuth2ClientsResponse, error) + // Updates an OAuth2 client. + UpdateOAuth2Client(context.Context, *UpdateOAuth2ClientRequest) (*UpdateOAuth2ClientResponse, error) + // Deletes an OAuth2 client. + DeleteOAuth2Client(context.Context, *DeleteOAuth2ClientRequest) (*DeleteOAuth2ClientResponse, error) + // Rotates an OAuth2 client's secret. + // Returns the new plaintext secret (only returned during rotation). + RotateOAuth2ClientSecret(context.Context, *RotateOAuth2ClientSecretRequest) (*RotateOAuth2ClientSecretResponse, error) + // Disables an OAuth2 client (soft delete). + DisableOAuth2Client(context.Context, *DisableOAuth2ClientRequest) (*DisableOAuth2ClientResponse, error) + // Validates OAuth2 client credentials. + // Used for authenticating client_credentials grant requests. + ValidateClientCredentials(context.Context, *ValidateClientCredentialsRequest) (*ValidateClientCredentialsResponse, error) + mustEmbedUnimplementedOAuth2ClientServiceServer() +} + +// UnimplementedOAuth2ClientServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedOAuth2ClientServiceServer struct{} + +func (UnimplementedOAuth2ClientServiceServer) CreateOAuth2Client(context.Context, *CreateOAuth2ClientRequest) (*CreateOAuth2ClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateOAuth2Client not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) GetOAuth2Client(context.Context, *GetOAuth2ClientRequest) (*GetOAuth2ClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetOAuth2Client not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) ListOAuth2Clients(context.Context, *ListOAuth2ClientsRequest) (*ListOAuth2ClientsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListOAuth2Clients not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) UpdateOAuth2Client(context.Context, *UpdateOAuth2ClientRequest) (*UpdateOAuth2ClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateOAuth2Client not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) DeleteOAuth2Client(context.Context, *DeleteOAuth2ClientRequest) (*DeleteOAuth2ClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteOAuth2Client not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) RotateOAuth2ClientSecret(context.Context, *RotateOAuth2ClientSecretRequest) (*RotateOAuth2ClientSecretResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotateOAuth2ClientSecret not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) DisableOAuth2Client(context.Context, *DisableOAuth2ClientRequest) (*DisableOAuth2ClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableOAuth2Client not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) ValidateClientCredentials(context.Context, *ValidateClientCredentialsRequest) (*ValidateClientCredentialsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateClientCredentials not implemented") +} +func (UnimplementedOAuth2ClientServiceServer) mustEmbedUnimplementedOAuth2ClientServiceServer() {} +func (UnimplementedOAuth2ClientServiceServer) testEmbeddedByValue() {} + +// UnsafeOAuth2ClientServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OAuth2ClientServiceServer will +// result in compilation errors. +type UnsafeOAuth2ClientServiceServer interface { + mustEmbedUnimplementedOAuth2ClientServiceServer() +} + +func RegisterOAuth2ClientServiceServer(s grpc.ServiceRegistrar, srv OAuth2ClientServiceServer) { + // If the following call pancis, it indicates UnimplementedOAuth2ClientServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&OAuth2ClientService_ServiceDesc, srv) +} + +func _OAuth2ClientService_CreateOAuth2Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateOAuth2ClientRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).CreateOAuth2Client(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_CreateOAuth2Client_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).CreateOAuth2Client(ctx, req.(*CreateOAuth2ClientRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_GetOAuth2Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetOAuth2ClientRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).GetOAuth2Client(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_GetOAuth2Client_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).GetOAuth2Client(ctx, req.(*GetOAuth2ClientRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_ListOAuth2Clients_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListOAuth2ClientsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).ListOAuth2Clients(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_ListOAuth2Clients_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).ListOAuth2Clients(ctx, req.(*ListOAuth2ClientsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_UpdateOAuth2Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateOAuth2ClientRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).UpdateOAuth2Client(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_UpdateOAuth2Client_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).UpdateOAuth2Client(ctx, req.(*UpdateOAuth2ClientRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_DeleteOAuth2Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteOAuth2ClientRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).DeleteOAuth2Client(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_DeleteOAuth2Client_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).DeleteOAuth2Client(ctx, req.(*DeleteOAuth2ClientRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_RotateOAuth2ClientSecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RotateOAuth2ClientSecretRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).RotateOAuth2ClientSecret(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_RotateOAuth2ClientSecret_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).RotateOAuth2ClientSecret(ctx, req.(*RotateOAuth2ClientSecretRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_DisableOAuth2Client_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableOAuth2ClientRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).DisableOAuth2Client(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_DisableOAuth2Client_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).DisableOAuth2Client(ctx, req.(*DisableOAuth2ClientRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2ClientService_ValidateClientCredentials_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateClientCredentialsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2ClientServiceServer).ValidateClientCredentials(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2ClientService_ValidateClientCredentials_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2ClientServiceServer).ValidateClientCredentials(ctx, req.(*ValidateClientCredentialsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// OAuth2ClientService_ServiceDesc is the grpc.ServiceDesc for OAuth2ClientService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var OAuth2ClientService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.OAuth2ClientService", + HandlerType: (*OAuth2ClientServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateOAuth2Client", + Handler: _OAuth2ClientService_CreateOAuth2Client_Handler, + }, + { + MethodName: "GetOAuth2Client", + Handler: _OAuth2ClientService_GetOAuth2Client_Handler, + }, + { + MethodName: "ListOAuth2Clients", + Handler: _OAuth2ClientService_ListOAuth2Clients_Handler, + }, + { + MethodName: "UpdateOAuth2Client", + Handler: _OAuth2ClientService_UpdateOAuth2Client_Handler, + }, + { + MethodName: "DeleteOAuth2Client", + Handler: _OAuth2ClientService_DeleteOAuth2Client_Handler, + }, + { + MethodName: "RotateOAuth2ClientSecret", + Handler: _OAuth2ClientService_RotateOAuth2ClientSecret_Handler, + }, + { + MethodName: "DisableOAuth2Client", + Handler: _OAuth2ClientService_DisableOAuth2Client_Handler, + }, + { + MethodName: "ValidateClientCredentials", + Handler: _OAuth2ClientService_ValidateClientCredentials_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/oauth2_client.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.go new file mode 100644 index 0000000000..1a11acafa0 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.go @@ -0,0 +1,1322 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/oauth2_key.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// OAuth2KeyAlgorithm defines supported signing algorithms. +type OAuth2KeyAlgorithm int32 + +const ( + OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_UNSPECIFIED OAuth2KeyAlgorithm = 0 + // RSA PKCS#1 v1.5 with SHA-256 + OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_RS256 OAuth2KeyAlgorithm = 1 + // RSA PKCS#1 v1.5 with SHA-384 + OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_RS384 OAuth2KeyAlgorithm = 2 + // RSA PKCS#1 v1.5 with SHA-512 + OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_RS512 OAuth2KeyAlgorithm = 3 +) + +// Enum value maps for OAuth2KeyAlgorithm. +var ( + OAuth2KeyAlgorithm_name = map[int32]string{ + 0: "OAUTH2_KEY_ALGORITHM_UNSPECIFIED", + 1: "OAUTH2_KEY_ALGORITHM_RS256", + 2: "OAUTH2_KEY_ALGORITHM_RS384", + 3: "OAUTH2_KEY_ALGORITHM_RS512", + } + OAuth2KeyAlgorithm_value = map[string]int32{ + "OAUTH2_KEY_ALGORITHM_UNSPECIFIED": 0, + "OAUTH2_KEY_ALGORITHM_RS256": 1, + "OAUTH2_KEY_ALGORITHM_RS384": 2, + "OAUTH2_KEY_ALGORITHM_RS512": 3, + } +) + +func (x OAuth2KeyAlgorithm) Enum() *OAuth2KeyAlgorithm { + p := new(OAuth2KeyAlgorithm) + *p = x + return p +} + +func (x OAuth2KeyAlgorithm) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (OAuth2KeyAlgorithm) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_enumTypes[0].Descriptor() +} + +func (OAuth2KeyAlgorithm) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_oauth2_key_proto_enumTypes[0] +} + +func (x OAuth2KeyAlgorithm) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use OAuth2KeyAlgorithm.Descriptor instead. +func (OAuth2KeyAlgorithm) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{0} +} + +// OAuth2Key represents a JWKS signing key for OAuth2 tokens. +type OAuth2Key struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `oauth2/keys/{key_id}` + // Key ID (kid) is a globally unique identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Signing algorithm: RS256, RS384, RS512 + Algorithm OAuth2KeyAlgorithm `protobuf:"varint,2,opt,name=algorithm,proto3,enum=redpanda.api.aigateway.v1.OAuth2KeyAlgorithm" json:"algorithm,omitempty"` + // Output only. PEM-encoded RSA public key + PublicKey string `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // Whether this key is active for signing new tokens + Active bool `protobuf:"varint,4,opt,name=active,proto3" json:"active,omitempty"` + // Optional: When this key should stop being used for signing + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,7,opt,name=creator,proto3" json:"creator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OAuth2Key) Reset() { + *x = OAuth2Key{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OAuth2Key) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OAuth2Key) ProtoMessage() {} + +func (x *OAuth2Key) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OAuth2Key.ProtoReflect.Descriptor instead. +func (*OAuth2Key) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{0} +} + +func (x *OAuth2Key) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OAuth2Key) GetAlgorithm() OAuth2KeyAlgorithm { + if x != nil { + return x.Algorithm + } + return OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_UNSPECIFIED +} + +func (x *OAuth2Key) GetPublicKey() string { + if x != nil { + return x.PublicKey + } + return "" +} + +func (x *OAuth2Key) GetActive() bool { + if x != nil { + return x.Active + } + return false +} + +func (x *OAuth2Key) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *OAuth2Key) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *OAuth2Key) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +// Request message for CreateOAuth2Key RPC. +type CreateOAuth2KeyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The key ID to use. If empty, server generates one. + KeyId string `protobuf:"bytes,1,opt,name=key_id,json=keyId,proto3" json:"key_id,omitempty"` + // Signing algorithm (default: RS256) + Algorithm OAuth2KeyAlgorithm `protobuf:"varint,2,opt,name=algorithm,proto3,enum=redpanda.api.aigateway.v1.OAuth2KeyAlgorithm" json:"algorithm,omitempty"` + // Optional: Expiration time for the key + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOAuth2KeyRequest) Reset() { + *x = CreateOAuth2KeyRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOAuth2KeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOAuth2KeyRequest) ProtoMessage() {} + +func (x *CreateOAuth2KeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOAuth2KeyRequest.ProtoReflect.Descriptor instead. +func (*CreateOAuth2KeyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateOAuth2KeyRequest) GetKeyId() string { + if x != nil { + return x.KeyId + } + return "" +} + +func (x *CreateOAuth2KeyRequest) GetAlgorithm() OAuth2KeyAlgorithm { + if x != nil { + return x.Algorithm + } + return OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_UNSPECIFIED +} + +func (x *CreateOAuth2KeyRequest) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +// Response message for CreateOAuth2Key RPC. +type CreateOAuth2KeyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Key *OAuth2Key `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOAuth2KeyResponse) Reset() { + *x = CreateOAuth2KeyResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOAuth2KeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOAuth2KeyResponse) ProtoMessage() {} + +func (x *CreateOAuth2KeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOAuth2KeyResponse.ProtoReflect.Descriptor instead. +func (*CreateOAuth2KeyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateOAuth2KeyResponse) GetKey() *OAuth2Key { + if x != nil { + return x.Key + } + return nil +} + +// Request message for GetOAuth2Key RPC. +type GetOAuth2KeyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the key. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOAuth2KeyRequest) Reset() { + *x = GetOAuth2KeyRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOAuth2KeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOAuth2KeyRequest) ProtoMessage() {} + +func (x *GetOAuth2KeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOAuth2KeyRequest.ProtoReflect.Descriptor instead. +func (*GetOAuth2KeyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{3} +} + +func (x *GetOAuth2KeyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetOAuth2Key RPC. +type GetOAuth2KeyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Key *OAuth2Key `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOAuth2KeyResponse) Reset() { + *x = GetOAuth2KeyResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOAuth2KeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOAuth2KeyResponse) ProtoMessage() {} + +func (x *GetOAuth2KeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOAuth2KeyResponse.ProtoReflect.Descriptor instead. +func (*GetOAuth2KeyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{4} +} + +func (x *GetOAuth2KeyResponse) GetKey() *OAuth2Key { + if x != nil { + return x.Key + } + return nil +} + +// Request message for ListOAuth2Keys RPC. +type ListOAuth2KeysRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Filter to only active keys + ActiveOnly bool `protobuf:"varint,1,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + // Maximum number of keys to return (max 100) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOAuth2KeysRequest) Reset() { + *x = ListOAuth2KeysRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOAuth2KeysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOAuth2KeysRequest) ProtoMessage() {} + +func (x *ListOAuth2KeysRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOAuth2KeysRequest.ProtoReflect.Descriptor instead. +func (*ListOAuth2KeysRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{5} +} + +func (x *ListOAuth2KeysRequest) GetActiveOnly() bool { + if x != nil { + return x.ActiveOnly + } + return false +} + +func (x *ListOAuth2KeysRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListOAuth2KeysRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListOAuth2Keys RPC. +type ListOAuth2KeysResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of keys + Keys []*OAuth2Key `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOAuth2KeysResponse) Reset() { + *x = ListOAuth2KeysResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOAuth2KeysResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOAuth2KeysResponse) ProtoMessage() {} + +func (x *ListOAuth2KeysResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOAuth2KeysResponse.ProtoReflect.Descriptor instead. +func (*ListOAuth2KeysResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{6} +} + +func (x *ListOAuth2KeysResponse) GetKeys() []*OAuth2Key { + if x != nil { + return x.Keys + } + return nil +} + +func (x *ListOAuth2KeysResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListOAuth2KeysResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for DeactivateOAuth2Key RPC. +type DeactivateOAuth2KeyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the key to deactivate. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeactivateOAuth2KeyRequest) Reset() { + *x = DeactivateOAuth2KeyRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeactivateOAuth2KeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeactivateOAuth2KeyRequest) ProtoMessage() {} + +func (x *DeactivateOAuth2KeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeactivateOAuth2KeyRequest.ProtoReflect.Descriptor instead. +func (*DeactivateOAuth2KeyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{7} +} + +func (x *DeactivateOAuth2KeyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DeactivateOAuth2Key RPC. +type DeactivateOAuth2KeyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Key *OAuth2Key `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeactivateOAuth2KeyResponse) Reset() { + *x = DeactivateOAuth2KeyResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeactivateOAuth2KeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeactivateOAuth2KeyResponse) ProtoMessage() {} + +func (x *DeactivateOAuth2KeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeactivateOAuth2KeyResponse.ProtoReflect.Descriptor instead. +func (*DeactivateOAuth2KeyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{8} +} + +func (x *DeactivateOAuth2KeyResponse) GetKey() *OAuth2Key { + if x != nil { + return x.Key + } + return nil +} + +// Request message for DeleteOAuth2Key RPC. +type DeleteOAuth2KeyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the key to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOAuth2KeyRequest) Reset() { + *x = DeleteOAuth2KeyRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOAuth2KeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOAuth2KeyRequest) ProtoMessage() {} + +func (x *DeleteOAuth2KeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOAuth2KeyRequest.ProtoReflect.Descriptor instead. +func (*DeleteOAuth2KeyRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{9} +} + +func (x *DeleteOAuth2KeyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DeleteOAuth2Key RPC. +type DeleteOAuth2KeyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOAuth2KeyResponse) Reset() { + *x = DeleteOAuth2KeyResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOAuth2KeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOAuth2KeyResponse) ProtoMessage() {} + +func (x *DeleteOAuth2KeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOAuth2KeyResponse.ProtoReflect.Descriptor instead. +func (*DeleteOAuth2KeyResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{10} +} + +// Request message for RotateOAuth2Keys RPC. +type RotateOAuth2KeysRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Signing algorithm for the new key (default: RS256) + Algorithm OAuth2KeyAlgorithm `protobuf:"varint,1,opt,name=algorithm,proto3,enum=redpanda.api.aigateway.v1.OAuth2KeyAlgorithm" json:"algorithm,omitempty"` + // Deactivate all existing active keys + DeactivateExisting bool `protobuf:"varint,2,opt,name=deactivate_existing,json=deactivateExisting,proto3" json:"deactivate_existing,omitempty"` + // Grace period in hours before deactivating old keys (default: 24) + // Old keys will be marked to expire after this period + GracePeriodHours int32 `protobuf:"varint,3,opt,name=grace_period_hours,json=gracePeriodHours,proto3" json:"grace_period_hours,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateOAuth2KeysRequest) Reset() { + *x = RotateOAuth2KeysRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateOAuth2KeysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateOAuth2KeysRequest) ProtoMessage() {} + +func (x *RotateOAuth2KeysRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotateOAuth2KeysRequest.ProtoReflect.Descriptor instead. +func (*RotateOAuth2KeysRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{11} +} + +func (x *RotateOAuth2KeysRequest) GetAlgorithm() OAuth2KeyAlgorithm { + if x != nil { + return x.Algorithm + } + return OAuth2KeyAlgorithm_OAUTH2_KEY_ALGORITHM_UNSPECIFIED +} + +func (x *RotateOAuth2KeysRequest) GetDeactivateExisting() bool { + if x != nil { + return x.DeactivateExisting + } + return false +} + +func (x *RotateOAuth2KeysRequest) GetGracePeriodHours() int32 { + if x != nil { + return x.GracePeriodHours + } + return 0 +} + +// Response message for RotateOAuth2Keys RPC. +type RotateOAuth2KeysResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The newly created active key + NewKey *OAuth2Key `protobuf:"bytes,1,opt,name=new_key,json=newKey,proto3" json:"new_key,omitempty"` + // Keys that were deactivated + DeactivatedKeys []*OAuth2Key `protobuf:"bytes,2,rep,name=deactivated_keys,json=deactivatedKeys,proto3" json:"deactivated_keys,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateOAuth2KeysResponse) Reset() { + *x = RotateOAuth2KeysResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateOAuth2KeysResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateOAuth2KeysResponse) ProtoMessage() {} + +func (x *RotateOAuth2KeysResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotateOAuth2KeysResponse.ProtoReflect.Descriptor instead. +func (*RotateOAuth2KeysResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{12} +} + +func (x *RotateOAuth2KeysResponse) GetNewKey() *OAuth2Key { + if x != nil { + return x.NewKey + } + return nil +} + +func (x *RotateOAuth2KeysResponse) GetDeactivatedKeys() []*OAuth2Key { + if x != nil { + return x.DeactivatedKeys + } + return nil +} + +// Request message for GetJWKS RPC. +type GetJWKSRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetJWKSRequest) Reset() { + *x = GetJWKSRequest{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetJWKSRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJWKSRequest) ProtoMessage() {} + +func (x *GetJWKSRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJWKSRequest.ProtoReflect.Descriptor instead. +func (*GetJWKSRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{13} +} + +// Response message for GetJWKS RPC. +// Returns RFC 7517 compliant JWKS. +type GetJWKSResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // JSON Web Key Set + Keys []*JSONWebKey `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetJWKSResponse) Reset() { + *x = GetJWKSResponse{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetJWKSResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJWKSResponse) ProtoMessage() {} + +func (x *GetJWKSResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJWKSResponse.ProtoReflect.Descriptor instead. +func (*GetJWKSResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{14} +} + +func (x *GetJWKSResponse) GetKeys() []*JSONWebKey { + if x != nil { + return x.Keys + } + return nil +} + +// JSONWebKey represents a single key in JWKS format (RFC 7517). +type JSONWebKey struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Key type (always "RSA" for our keys) + Kty string `protobuf:"bytes,1,opt,name=kty,proto3" json:"kty,omitempty"` + // Public key use ("sig" for signature) + Use string `protobuf:"bytes,2,opt,name=use,proto3" json:"use,omitempty"` + // Key ID + Kid string `protobuf:"bytes,3,opt,name=kid,proto3" json:"kid,omitempty"` + // Algorithm (RS256, RS384, RS512) + Alg string `protobuf:"bytes,4,opt,name=alg,proto3" json:"alg,omitempty"` + // RSA modulus (Base64url encoded) + N string `protobuf:"bytes,5,opt,name=n,proto3" json:"n,omitempty"` + // RSA exponent (Base64url encoded) + E string `protobuf:"bytes,6,opt,name=e,proto3" json:"e,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONWebKey) Reset() { + *x = JSONWebKey{} + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONWebKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONWebKey) ProtoMessage() {} + +func (x *JSONWebKey) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JSONWebKey.ProtoReflect.Descriptor instead. +func (*JSONWebKey) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP(), []int{15} +} + +func (x *JSONWebKey) GetKty() string { + if x != nil { + return x.Kty + } + return "" +} + +func (x *JSONWebKey) GetUse() string { + if x != nil { + return x.Use + } + return "" +} + +func (x *JSONWebKey) GetKid() string { + if x != nil { + return x.Kid + } + return "" +} + +func (x *JSONWebKey) GetAlg() string { + if x != nil { + return x.Alg + } + return "" +} + +func (x *JSONWebKey) GetN() string { + if x != nil { + return x.N + } + return "" +} + +func (x *JSONWebKey) GetE() string { + if x != nil { + return x.E + } + return "" +} + +var File_redpanda_api_aigateway_v1_oauth2_key_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDesc = []byte{ + 0x0a, 0x2a, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, + 0x68, 0x32, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x03, 0x0a, 0x09, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x50, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3e, 0x0a, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x40, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x38, + 0xea, 0x41, 0x35, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x41, 0x75, 0x74, + 0x68, 0x32, 0x4b, 0x65, 0x79, 0x12, 0x11, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x6b, 0x65, + 0x79, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x22, 0xc6, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x12, + 0x50, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, + 0x74, 0x22, 0x51, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x22, 0x53, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, + 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x36, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, + 0x01, 0xba, 0x48, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x5a, 0x0a, 0x1a, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x55, 0x0a, 0x1b, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, + 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x56, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x17, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, + 0x74, 0x68, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x41, + 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x61, + 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x34, 0x0a, 0x13, 0x64, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x64, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3b, + 0x0a, 0x12, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, + 0x48, 0x07, 0x1a, 0x05, 0x18, 0xa8, 0x01, 0x28, 0x00, 0x52, 0x10, 0x67, 0x72, 0x61, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x18, + 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x6e, 0x65, 0x77, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, + 0x06, 0x6e, 0x65, 0x77, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x10, 0x64, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, + 0x57, 0x4b, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4a, 0x57, 0x4b, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, + 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x57, 0x65, 0x62, 0x4b, + 0x65, 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x70, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, + 0x57, 0x65, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x73, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x61, 0x6c, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x6c, 0x67, 0x12, 0x0c, + 0x0a, 0x01, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x6e, 0x12, 0x0c, 0x0a, 0x01, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x65, 0x2a, 0x9a, 0x01, 0x0a, 0x12, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x12, 0x24, 0x0a, 0x20, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x4b, 0x45, 0x59, 0x5f, + 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54, 0x48, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x41, 0x55, 0x54, 0x48, + 0x32, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54, 0x48, 0x4d, 0x5f, + 0x52, 0x53, 0x32, 0x35, 0x36, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x41, 0x55, 0x54, 0x48, + 0x32, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54, 0x48, 0x4d, 0x5f, + 0x52, 0x53, 0x33, 0x38, 0x34, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x41, 0x55, 0x54, 0x48, + 0x32, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54, 0x48, 0x4d, 0x5f, + 0x52, 0x53, 0x35, 0x31, 0x32, 0x10, 0x03, 0x32, 0xfe, 0x08, 0x0a, 0x10, 0x4f, 0x41, 0x75, 0x74, + 0x68, 0x32, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x94, 0x01, 0x0a, + 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, + 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, + 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x6b, + 0x65, 0x79, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, + 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, + 0x74, 0x68, 0x32, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, + 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x6b, 0x65, 0x79, + 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, + 0x9a, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, + 0x4b, 0x65, 0x79, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x61, + 0x75, 0x74, 0x68, 0x32, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x9e, 0x01, 0x0a, + 0x10, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x4b, 0x65, + 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, + 0x32, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x12, 0x9d, 0x01, + 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x57, 0x4b, 0x53, 0x12, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x57, 0x4b, 0x53, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x57, 0x4b, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x5a, 0x18, 0x12, 0x16, 0x2f, 0x2e, 0x77, 0x65, + 0x6c, 0x6c, 0x2d, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2f, 0x6a, 0x77, 0x6b, 0x73, 0x2e, 0x6a, 0x73, + 0x6f, 0x6e, 0x12, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x2f, 0x6a, 0x77, 0x6b, 0x73, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x1a, 0x19, 0xca, + 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x83, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x4f, 0x61, 0x75, 0x74, + 0x68, 0x32, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, + 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, + 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescData = file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_oauth2_key_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_redpanda_api_aigateway_v1_oauth2_key_proto_goTypes = []any{ + (OAuth2KeyAlgorithm)(0), // 0: redpanda.api.aigateway.v1.OAuth2KeyAlgorithm + (*OAuth2Key)(nil), // 1: redpanda.api.aigateway.v1.OAuth2Key + (*CreateOAuth2KeyRequest)(nil), // 2: redpanda.api.aigateway.v1.CreateOAuth2KeyRequest + (*CreateOAuth2KeyResponse)(nil), // 3: redpanda.api.aigateway.v1.CreateOAuth2KeyResponse + (*GetOAuth2KeyRequest)(nil), // 4: redpanda.api.aigateway.v1.GetOAuth2KeyRequest + (*GetOAuth2KeyResponse)(nil), // 5: redpanda.api.aigateway.v1.GetOAuth2KeyResponse + (*ListOAuth2KeysRequest)(nil), // 6: redpanda.api.aigateway.v1.ListOAuth2KeysRequest + (*ListOAuth2KeysResponse)(nil), // 7: redpanda.api.aigateway.v1.ListOAuth2KeysResponse + (*DeactivateOAuth2KeyRequest)(nil), // 8: redpanda.api.aigateway.v1.DeactivateOAuth2KeyRequest + (*DeactivateOAuth2KeyResponse)(nil), // 9: redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse + (*DeleteOAuth2KeyRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteOAuth2KeyRequest + (*DeleteOAuth2KeyResponse)(nil), // 11: redpanda.api.aigateway.v1.DeleteOAuth2KeyResponse + (*RotateOAuth2KeysRequest)(nil), // 12: redpanda.api.aigateway.v1.RotateOAuth2KeysRequest + (*RotateOAuth2KeysResponse)(nil), // 13: redpanda.api.aigateway.v1.RotateOAuth2KeysResponse + (*GetJWKSRequest)(nil), // 14: redpanda.api.aigateway.v1.GetJWKSRequest + (*GetJWKSResponse)(nil), // 15: redpanda.api.aigateway.v1.GetJWKSResponse + (*JSONWebKey)(nil), // 16: redpanda.api.aigateway.v1.JSONWebKey + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_oauth2_key_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.OAuth2Key.algorithm:type_name -> redpanda.api.aigateway.v1.OAuth2KeyAlgorithm + 17, // 1: redpanda.api.aigateway.v1.OAuth2Key.expires_at:type_name -> google.protobuf.Timestamp + 17, // 2: redpanda.api.aigateway.v1.OAuth2Key.create_time:type_name -> google.protobuf.Timestamp + 0, // 3: redpanda.api.aigateway.v1.CreateOAuth2KeyRequest.algorithm:type_name -> redpanda.api.aigateway.v1.OAuth2KeyAlgorithm + 17, // 4: redpanda.api.aigateway.v1.CreateOAuth2KeyRequest.expires_at:type_name -> google.protobuf.Timestamp + 1, // 5: redpanda.api.aigateway.v1.CreateOAuth2KeyResponse.key:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 1, // 6: redpanda.api.aigateway.v1.GetOAuth2KeyResponse.key:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 1, // 7: redpanda.api.aigateway.v1.ListOAuth2KeysResponse.keys:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 1, // 8: redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse.key:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 0, // 9: redpanda.api.aigateway.v1.RotateOAuth2KeysRequest.algorithm:type_name -> redpanda.api.aigateway.v1.OAuth2KeyAlgorithm + 1, // 10: redpanda.api.aigateway.v1.RotateOAuth2KeysResponse.new_key:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 1, // 11: redpanda.api.aigateway.v1.RotateOAuth2KeysResponse.deactivated_keys:type_name -> redpanda.api.aigateway.v1.OAuth2Key + 16, // 12: redpanda.api.aigateway.v1.GetJWKSResponse.keys:type_name -> redpanda.api.aigateway.v1.JSONWebKey + 2, // 13: redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key:input_type -> redpanda.api.aigateway.v1.CreateOAuth2KeyRequest + 4, // 14: redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key:input_type -> redpanda.api.aigateway.v1.GetOAuth2KeyRequest + 6, // 15: redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys:input_type -> redpanda.api.aigateway.v1.ListOAuth2KeysRequest + 8, // 16: redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key:input_type -> redpanda.api.aigateway.v1.DeactivateOAuth2KeyRequest + 10, // 17: redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key:input_type -> redpanda.api.aigateway.v1.DeleteOAuth2KeyRequest + 12, // 18: redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys:input_type -> redpanda.api.aigateway.v1.RotateOAuth2KeysRequest + 14, // 19: redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS:input_type -> redpanda.api.aigateway.v1.GetJWKSRequest + 3, // 20: redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key:output_type -> redpanda.api.aigateway.v1.CreateOAuth2KeyResponse + 5, // 21: redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key:output_type -> redpanda.api.aigateway.v1.GetOAuth2KeyResponse + 7, // 22: redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys:output_type -> redpanda.api.aigateway.v1.ListOAuth2KeysResponse + 9, // 23: redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key:output_type -> redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse + 11, // 24: redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key:output_type -> redpanda.api.aigateway.v1.DeleteOAuth2KeyResponse + 13, // 25: redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys:output_type -> redpanda.api.aigateway.v1.RotateOAuth2KeysResponse + 15, // 26: redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS:output_type -> redpanda.api.aigateway.v1.GetJWKSResponse + 20, // [20:27] is the sub-list for method output_type + 13, // [13:20] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_oauth2_key_proto_init() } +func file_redpanda_api_aigateway_v1_oauth2_key_proto_init() { + if File_redpanda_api_aigateway_v1_oauth2_key_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDesc, + NumEnums: 1, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_oauth2_key_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_oauth2_key_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_oauth2_key_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_oauth2_key_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_oauth2_key_proto = out.File + file_redpanda_api_aigateway_v1_oauth2_key_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_oauth2_key_proto_goTypes = nil + file_redpanda_api_aigateway_v1_oauth2_key_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.gw.go new file mode 100644 index 0000000000..2d6f0bc0a5 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key.pb.gw.go @@ -0,0 +1,657 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/oauth2_key.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_OAuth2KeyService_CreateOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOAuth2KeyRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.CreateOAuth2Key(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_CreateOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOAuth2KeyRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateOAuth2Key(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_GetOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetOAuth2Key(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_GetOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetOAuth2Key(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OAuth2KeyService_ListOAuth2Keys_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_OAuth2KeyService_ListOAuth2Keys_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOAuth2KeysRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2KeyService_ListOAuth2Keys_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListOAuth2Keys(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_ListOAuth2Keys_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOAuth2KeysRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuth2KeyService_ListOAuth2Keys_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListOAuth2Keys(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_DeactivateOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeactivateOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeactivateOAuth2Key(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_DeactivateOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeactivateOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeactivateOAuth2Key(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_DeleteOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteOAuth2Key(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_DeleteOAuth2Key_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOAuth2KeyRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteOAuth2Key(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_RotateOAuth2Keys_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotateOAuth2KeysRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.RotateOAuth2Keys(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_RotateOAuth2Keys_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotateOAuth2KeysRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.RotateOAuth2Keys(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_GetJWKS_0(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetJWKSRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetJWKS(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_GetJWKS_0(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetJWKSRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetJWKS(ctx, &protoReq) + return msg, metadata, err +} + +func request_OAuth2KeyService_GetJWKS_1(ctx context.Context, marshaler runtime.Marshaler, client OAuth2KeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetJWKSRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetJWKS(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OAuth2KeyService_GetJWKS_1(ctx context.Context, marshaler runtime.Marshaler, server OAuth2KeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetJWKSRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetJWKS(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterOAuth2KeyServiceHandlerServer registers the http handlers for service OAuth2KeyService to "mux". +// UnaryRPC :call OAuth2KeyServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterOAuth2KeyServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterOAuth2KeyServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server OAuth2KeyServiceServer) error { + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_CreateOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/CreateOAuth2Key", runtime.WithHTTPPathPattern("/v1/oauth2/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_CreateOAuth2Key_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_CreateOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_GetOAuth2Key_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_ListOAuth2Keys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/ListOAuth2Keys", runtime.WithHTTPPathPattern("/v1/oauth2/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_ListOAuth2Keys_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_ListOAuth2Keys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_DeactivateOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/DeactivateOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}:deactivate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_DeactivateOAuth2Key_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_DeactivateOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OAuth2KeyService_DeleteOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/DeleteOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_DeleteOAuth2Key_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_DeleteOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_RotateOAuth2Keys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/RotateOAuth2Keys", runtime.WithHTTPPathPattern("/v1/oauth2/keys:rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_RotateOAuth2Keys_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_RotateOAuth2Keys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetJWKS_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS", runtime.WithHTTPPathPattern("/v1/.well-known/jwks.json")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_GetJWKS_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetJWKS_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetJWKS_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS", runtime.WithHTTPPathPattern("/.well-known/jwks.json")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OAuth2KeyService_GetJWKS_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetJWKS_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterOAuth2KeyServiceHandlerFromEndpoint is same as RegisterOAuth2KeyServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterOAuth2KeyServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterOAuth2KeyServiceHandler(ctx, mux, conn) +} + +// RegisterOAuth2KeyServiceHandler registers the http handlers for service OAuth2KeyService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterOAuth2KeyServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterOAuth2KeyServiceHandlerClient(ctx, mux, NewOAuth2KeyServiceClient(conn)) +} + +// RegisterOAuth2KeyServiceHandlerClient registers the http handlers for service OAuth2KeyService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "OAuth2KeyServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "OAuth2KeyServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "OAuth2KeyServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterOAuth2KeyServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client OAuth2KeyServiceClient) error { + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_CreateOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/CreateOAuth2Key", runtime.WithHTTPPathPattern("/v1/oauth2/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_CreateOAuth2Key_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_CreateOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_GetOAuth2Key_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_ListOAuth2Keys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/ListOAuth2Keys", runtime.WithHTTPPathPattern("/v1/oauth2/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_ListOAuth2Keys_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_ListOAuth2Keys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_DeactivateOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/DeactivateOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}:deactivate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_DeactivateOAuth2Key_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_DeactivateOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OAuth2KeyService_DeleteOAuth2Key_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/DeleteOAuth2Key", runtime.WithHTTPPathPattern("/v1/{name=oauth2/keys/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_DeleteOAuth2Key_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_DeleteOAuth2Key_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_OAuth2KeyService_RotateOAuth2Keys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/RotateOAuth2Keys", runtime.WithHTTPPathPattern("/v1/oauth2/keys:rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_RotateOAuth2Keys_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_RotateOAuth2Keys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetJWKS_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS", runtime.WithHTTPPathPattern("/v1/.well-known/jwks.json")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_GetJWKS_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetJWKS_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OAuth2KeyService_GetJWKS_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS", runtime.WithHTTPPathPattern("/.well-known/jwks.json")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OAuth2KeyService_GetJWKS_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OAuth2KeyService_GetJWKS_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_OAuth2KeyService_CreateOAuth2Key_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "keys"}, "")) + pattern_OAuth2KeyService_GetOAuth2Key_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "keys", "name"}, "")) + pattern_OAuth2KeyService_ListOAuth2Keys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "keys"}, "")) + pattern_OAuth2KeyService_DeactivateOAuth2Key_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "keys", "name"}, "deactivate")) + pattern_OAuth2KeyService_DeleteOAuth2Key_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "oauth2", "keys", "name"}, "")) + pattern_OAuth2KeyService_RotateOAuth2Keys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "oauth2", "keys"}, "rotate")) + pattern_OAuth2KeyService_GetJWKS_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", ".well-known", "jwks.json"}, "")) + pattern_OAuth2KeyService_GetJWKS_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{".well-known", "jwks.json"}, "")) +) + +var ( + forward_OAuth2KeyService_CreateOAuth2Key_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_GetOAuth2Key_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_ListOAuth2Keys_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_DeactivateOAuth2Key_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_DeleteOAuth2Key_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_RotateOAuth2Keys_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_GetJWKS_0 = runtime.ForwardResponseMessage + forward_OAuth2KeyService_GetJWKS_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key_grpc.pb.go new file mode 100644 index 0000000000..763b2ed55d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/oauth2_key_grpc.pb.go @@ -0,0 +1,384 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/oauth2_key.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + OAuth2KeyService_CreateOAuth2Key_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/CreateOAuth2Key" + OAuth2KeyService_GetOAuth2Key_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/GetOAuth2Key" + OAuth2KeyService_ListOAuth2Keys_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/ListOAuth2Keys" + OAuth2KeyService_DeactivateOAuth2Key_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/DeactivateOAuth2Key" + OAuth2KeyService_DeleteOAuth2Key_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/DeleteOAuth2Key" + OAuth2KeyService_RotateOAuth2Keys_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/RotateOAuth2Keys" + OAuth2KeyService_GetJWKS_FullMethodName = "/redpanda.api.aigateway.v1.OAuth2KeyService/GetJWKS" +) + +// OAuth2KeyServiceClient is the client API for OAuth2KeyService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// OAuth2KeyService manages JWKS signing keys for OAuth2 tokens. +// Keys are used to sign and verify JWT access tokens. +// Resource name: oauth2/keys/{key_id} +type OAuth2KeyServiceClient interface { + // Creates a new signing key. + CreateOAuth2Key(ctx context.Context, in *CreateOAuth2KeyRequest, opts ...grpc.CallOption) (*CreateOAuth2KeyResponse, error) + // Gets a signing key by name. + // Note: Private key material is never returned. + GetOAuth2Key(ctx context.Context, in *GetOAuth2KeyRequest, opts ...grpc.CallOption) (*GetOAuth2KeyResponse, error) + // Lists signing keys. + ListOAuth2Keys(ctx context.Context, in *ListOAuth2KeysRequest, opts ...grpc.CallOption) (*ListOAuth2KeysResponse, error) + // Deactivates a signing key. + // The key will no longer be used for signing new tokens. + // Existing tokens signed with this key remain valid until expiry. + DeactivateOAuth2Key(ctx context.Context, in *DeactivateOAuth2KeyRequest, opts ...grpc.CallOption) (*DeactivateOAuth2KeyResponse, error) + // Deletes a signing key. + // WARNING: This will invalidate all tokens signed with this key. + DeleteOAuth2Key(ctx context.Context, in *DeleteOAuth2KeyRequest, opts ...grpc.CallOption) (*DeleteOAuth2KeyResponse, error) + // Rotates signing keys. + // Creates a new active key and optionally deactivates old keys. + RotateOAuth2Keys(ctx context.Context, in *RotateOAuth2KeysRequest, opts ...grpc.CallOption) (*RotateOAuth2KeysResponse, error) + // Gets the JWKS (JSON Web Key Set) for token verification. + // This endpoint is public and returns only public keys. + GetJWKS(ctx context.Context, in *GetJWKSRequest, opts ...grpc.CallOption) (*GetJWKSResponse, error) +} + +type oAuth2KeyServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewOAuth2KeyServiceClient(cc grpc.ClientConnInterface) OAuth2KeyServiceClient { + return &oAuth2KeyServiceClient{cc} +} + +func (c *oAuth2KeyServiceClient) CreateOAuth2Key(ctx context.Context, in *CreateOAuth2KeyRequest, opts ...grpc.CallOption) (*CreateOAuth2KeyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateOAuth2KeyResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_CreateOAuth2Key_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) GetOAuth2Key(ctx context.Context, in *GetOAuth2KeyRequest, opts ...grpc.CallOption) (*GetOAuth2KeyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetOAuth2KeyResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_GetOAuth2Key_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) ListOAuth2Keys(ctx context.Context, in *ListOAuth2KeysRequest, opts ...grpc.CallOption) (*ListOAuth2KeysResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListOAuth2KeysResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_ListOAuth2Keys_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) DeactivateOAuth2Key(ctx context.Context, in *DeactivateOAuth2KeyRequest, opts ...grpc.CallOption) (*DeactivateOAuth2KeyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeactivateOAuth2KeyResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_DeactivateOAuth2Key_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) DeleteOAuth2Key(ctx context.Context, in *DeleteOAuth2KeyRequest, opts ...grpc.CallOption) (*DeleteOAuth2KeyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteOAuth2KeyResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_DeleteOAuth2Key_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) RotateOAuth2Keys(ctx context.Context, in *RotateOAuth2KeysRequest, opts ...grpc.CallOption) (*RotateOAuth2KeysResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RotateOAuth2KeysResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_RotateOAuth2Keys_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oAuth2KeyServiceClient) GetJWKS(ctx context.Context, in *GetJWKSRequest, opts ...grpc.CallOption) (*GetJWKSResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetJWKSResponse) + err := c.cc.Invoke(ctx, OAuth2KeyService_GetJWKS_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OAuth2KeyServiceServer is the server API for OAuth2KeyService service. +// All implementations must embed UnimplementedOAuth2KeyServiceServer +// for forward compatibility. +// +// OAuth2KeyService manages JWKS signing keys for OAuth2 tokens. +// Keys are used to sign and verify JWT access tokens. +// Resource name: oauth2/keys/{key_id} +type OAuth2KeyServiceServer interface { + // Creates a new signing key. + CreateOAuth2Key(context.Context, *CreateOAuth2KeyRequest) (*CreateOAuth2KeyResponse, error) + // Gets a signing key by name. + // Note: Private key material is never returned. + GetOAuth2Key(context.Context, *GetOAuth2KeyRequest) (*GetOAuth2KeyResponse, error) + // Lists signing keys. + ListOAuth2Keys(context.Context, *ListOAuth2KeysRequest) (*ListOAuth2KeysResponse, error) + // Deactivates a signing key. + // The key will no longer be used for signing new tokens. + // Existing tokens signed with this key remain valid until expiry. + DeactivateOAuth2Key(context.Context, *DeactivateOAuth2KeyRequest) (*DeactivateOAuth2KeyResponse, error) + // Deletes a signing key. + // WARNING: This will invalidate all tokens signed with this key. + DeleteOAuth2Key(context.Context, *DeleteOAuth2KeyRequest) (*DeleteOAuth2KeyResponse, error) + // Rotates signing keys. + // Creates a new active key and optionally deactivates old keys. + RotateOAuth2Keys(context.Context, *RotateOAuth2KeysRequest) (*RotateOAuth2KeysResponse, error) + // Gets the JWKS (JSON Web Key Set) for token verification. + // This endpoint is public and returns only public keys. + GetJWKS(context.Context, *GetJWKSRequest) (*GetJWKSResponse, error) + mustEmbedUnimplementedOAuth2KeyServiceServer() +} + +// UnimplementedOAuth2KeyServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedOAuth2KeyServiceServer struct{} + +func (UnimplementedOAuth2KeyServiceServer) CreateOAuth2Key(context.Context, *CreateOAuth2KeyRequest) (*CreateOAuth2KeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateOAuth2Key not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) GetOAuth2Key(context.Context, *GetOAuth2KeyRequest) (*GetOAuth2KeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetOAuth2Key not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) ListOAuth2Keys(context.Context, *ListOAuth2KeysRequest) (*ListOAuth2KeysResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListOAuth2Keys not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) DeactivateOAuth2Key(context.Context, *DeactivateOAuth2KeyRequest) (*DeactivateOAuth2KeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeactivateOAuth2Key not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) DeleteOAuth2Key(context.Context, *DeleteOAuth2KeyRequest) (*DeleteOAuth2KeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteOAuth2Key not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) RotateOAuth2Keys(context.Context, *RotateOAuth2KeysRequest) (*RotateOAuth2KeysResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotateOAuth2Keys not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) GetJWKS(context.Context, *GetJWKSRequest) (*GetJWKSResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetJWKS not implemented") +} +func (UnimplementedOAuth2KeyServiceServer) mustEmbedUnimplementedOAuth2KeyServiceServer() {} +func (UnimplementedOAuth2KeyServiceServer) testEmbeddedByValue() {} + +// UnsafeOAuth2KeyServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OAuth2KeyServiceServer will +// result in compilation errors. +type UnsafeOAuth2KeyServiceServer interface { + mustEmbedUnimplementedOAuth2KeyServiceServer() +} + +func RegisterOAuth2KeyServiceServer(s grpc.ServiceRegistrar, srv OAuth2KeyServiceServer) { + // If the following call pancis, it indicates UnimplementedOAuth2KeyServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&OAuth2KeyService_ServiceDesc, srv) +} + +func _OAuth2KeyService_CreateOAuth2Key_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateOAuth2KeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).CreateOAuth2Key(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_CreateOAuth2Key_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).CreateOAuth2Key(ctx, req.(*CreateOAuth2KeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_GetOAuth2Key_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetOAuth2KeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).GetOAuth2Key(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_GetOAuth2Key_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).GetOAuth2Key(ctx, req.(*GetOAuth2KeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_ListOAuth2Keys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListOAuth2KeysRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).ListOAuth2Keys(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_ListOAuth2Keys_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).ListOAuth2Keys(ctx, req.(*ListOAuth2KeysRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_DeactivateOAuth2Key_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeactivateOAuth2KeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).DeactivateOAuth2Key(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_DeactivateOAuth2Key_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).DeactivateOAuth2Key(ctx, req.(*DeactivateOAuth2KeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_DeleteOAuth2Key_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteOAuth2KeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).DeleteOAuth2Key(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_DeleteOAuth2Key_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).DeleteOAuth2Key(ctx, req.(*DeleteOAuth2KeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_RotateOAuth2Keys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RotateOAuth2KeysRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).RotateOAuth2Keys(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_RotateOAuth2Keys_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).RotateOAuth2Keys(ctx, req.(*RotateOAuth2KeysRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OAuth2KeyService_GetJWKS_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetJWKSRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OAuth2KeyServiceServer).GetJWKS(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OAuth2KeyService_GetJWKS_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OAuth2KeyServiceServer).GetJWKS(ctx, req.(*GetJWKSRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// OAuth2KeyService_ServiceDesc is the grpc.ServiceDesc for OAuth2KeyService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var OAuth2KeyService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.OAuth2KeyService", + HandlerType: (*OAuth2KeyServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateOAuth2Key", + Handler: _OAuth2KeyService_CreateOAuth2Key_Handler, + }, + { + MethodName: "GetOAuth2Key", + Handler: _OAuth2KeyService_GetOAuth2Key_Handler, + }, + { + MethodName: "ListOAuth2Keys", + Handler: _OAuth2KeyService_ListOAuth2Keys_Handler, + }, + { + MethodName: "DeactivateOAuth2Key", + Handler: _OAuth2KeyService_DeactivateOAuth2Key_Handler, + }, + { + MethodName: "DeleteOAuth2Key", + Handler: _OAuth2KeyService_DeleteOAuth2Key_Handler, + }, + { + MethodName: "RotateOAuth2Keys", + Handler: _OAuth2KeyService_RotateOAuth2Keys_Handler, + }, + { + MethodName: "GetJWKS", + Handler: _OAuth2KeyService_GetJWKS_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/oauth2_key.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.go new file mode 100644 index 0000000000..3b75a9c2fd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.go @@ -0,0 +1,984 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/organization.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Organization represents a tenant boundary within an account. +// Organizations contain workspaces, teams, and users. +type Organization struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/organizations/{organization}` + // Organization ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name (must be unique within account) + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Whether this organization is active + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,8,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,9,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Organization) Reset() { + *x = Organization{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Organization) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Organization) ProtoMessage() {} + +func (x *Organization) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Organization.ProtoReflect.Descriptor instead. +func (*Organization) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{0} +} + +func (x *Organization) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Organization) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Organization) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Organization) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Organization) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Organization) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Organization) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Organization) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Organization) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// Request message for CreateOrganization RPC. +type CreateOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Required: The organization resource to create. + Organization *Organization `protobuf:"bytes,3,opt,name=organization,proto3" json:"organization,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOrganizationRequest) Reset() { + *x = CreateOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOrganizationRequest) ProtoMessage() {} + +func (x *CreateOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOrganizationRequest.ProtoReflect.Descriptor instead. +func (*CreateOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateOrganizationRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateOrganizationRequest) GetOrganization() *Organization { + if x != nil { + return x.Organization + } + return nil +} + +// Response message for CreateOrganization RPC. +type CreateOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateOrganizationResponse) Reset() { + *x = CreateOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateOrganizationResponse) ProtoMessage() {} + +func (x *CreateOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateOrganizationResponse.ProtoReflect.Descriptor instead. +func (*CreateOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateOrganizationResponse) GetOrganization() *Organization { + if x != nil { + return x.Organization + } + return nil +} + +// Request message for GetOrganization RPC. +type GetOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the organization. + // Format: `accounts/{account}/organizations/{organization}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOrganizationRequest) Reset() { + *x = GetOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOrganizationRequest) ProtoMessage() {} + +func (x *GetOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOrganizationRequest.ProtoReflect.Descriptor instead. +func (*GetOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{3} +} + +func (x *GetOrganizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetOrganization RPC. +type GetOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetOrganizationResponse) Reset() { + *x = GetOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOrganizationResponse) ProtoMessage() {} + +func (x *GetOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOrganizationResponse.ProtoReflect.Descriptor instead. +func (*GetOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{4} +} + +func (x *GetOrganizationResponse) GetOrganization() *Organization { + if x != nil { + return x.Organization + } + return nil +} + +// Request message for ListOrganizations RPC. +type ListOrganizationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of organizations to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListOrganizations call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOrganizationsRequest) Reset() { + *x = ListOrganizationsRequest{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOrganizationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOrganizationsRequest) ProtoMessage() {} + +func (x *ListOrganizationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOrganizationsRequest.ProtoReflect.Descriptor instead. +func (*ListOrganizationsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{5} +} + +func (x *ListOrganizationsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListOrganizationsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListOrganizationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListOrganizationsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListOrganizationsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListOrganizations RPC. +type ListOrganizationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of organizations + Organizations []*Organization `protobuf:"bytes,1,rep,name=organizations,proto3" json:"organizations,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching organizations + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOrganizationsResponse) Reset() { + *x = ListOrganizationsResponse{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOrganizationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOrganizationsResponse) ProtoMessage() {} + +func (x *ListOrganizationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListOrganizationsResponse.ProtoReflect.Descriptor instead. +func (*ListOrganizationsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{6} +} + +func (x *ListOrganizationsResponse) GetOrganizations() []*Organization { + if x != nil { + return x.Organizations + } + return nil +} + +func (x *ListOrganizationsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListOrganizationsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateOrganization RPC. +type UpdateOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The organization resource to update. + Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + // The fields to update. + // Allowed fields: display_name, description, enabled, metadata + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateOrganizationRequest) Reset() { + *x = UpdateOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateOrganizationRequest) ProtoMessage() {} + +func (x *UpdateOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateOrganizationRequest.ProtoReflect.Descriptor instead. +func (*UpdateOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{7} +} + +func (x *UpdateOrganizationRequest) GetOrganization() *Organization { + if x != nil { + return x.Organization + } + return nil +} + +func (x *UpdateOrganizationRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateOrganization RPC. +type UpdateOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateOrganizationResponse) Reset() { + *x = UpdateOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateOrganizationResponse) ProtoMessage() {} + +func (x *UpdateOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateOrganizationResponse.ProtoReflect.Descriptor instead. +func (*UpdateOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateOrganizationResponse) GetOrganization() *Organization { + if x != nil { + return x.Organization + } + return nil +} + +// Request message for DeleteOrganization RPC. +type DeleteOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the organization to delete. + // Format: `accounts/{account}/organizations/{organization}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all child resources (workspaces, teams, users, etc.) + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOrganizationRequest) Reset() { + *x = DeleteOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOrganizationRequest) ProtoMessage() {} + +func (x *DeleteOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOrganizationRequest.ProtoReflect.Descriptor instead. +func (*DeleteOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{9} +} + +func (x *DeleteOrganizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteOrganizationRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteOrganization RPC. +type DeleteOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOrganizationResponse) Reset() { + *x = DeleteOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteOrganizationResponse) ProtoMessage() {} + +func (x *DeleteOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_organization_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteOrganizationResponse.ProtoReflect.Descriptor instead. +func (*DeleteOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP(), []int{10} +} + +var File_redpanda_api_aigateway_v1_organization_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_organization_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc7, 0x04, 0x0a, + 0x0c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x59, 0xea, 0x41, 0x56, + 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x22, 0xc4, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x69, 0x0a, + 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x59, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, + 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe7, 0x01, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, + 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, + 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xb1, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x19, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x69, 0x0a, 0x1a, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xcc, 0x07, + 0x0a, 0x13, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xbe, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x35, 0x3a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa7, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xad, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x2a, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0xcb, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x0c, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x32, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb0, + 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x2a, 0x25, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, + 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x7d, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x86, 0x02, 0x0a, + 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x11, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, + 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, + 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_organization_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_organization_proto_rawDescData = file_redpanda_api_aigateway_v1_organization_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_organization_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_organization_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_organization_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_organization_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_organization_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_organization_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_organization_proto_goTypes = []any{ + (*Organization)(nil), // 0: redpanda.api.aigateway.v1.Organization + (*CreateOrganizationRequest)(nil), // 1: redpanda.api.aigateway.v1.CreateOrganizationRequest + (*CreateOrganizationResponse)(nil), // 2: redpanda.api.aigateway.v1.CreateOrganizationResponse + (*GetOrganizationRequest)(nil), // 3: redpanda.api.aigateway.v1.GetOrganizationRequest + (*GetOrganizationResponse)(nil), // 4: redpanda.api.aigateway.v1.GetOrganizationResponse + (*ListOrganizationsRequest)(nil), // 5: redpanda.api.aigateway.v1.ListOrganizationsRequest + (*ListOrganizationsResponse)(nil), // 6: redpanda.api.aigateway.v1.ListOrganizationsResponse + (*UpdateOrganizationRequest)(nil), // 7: redpanda.api.aigateway.v1.UpdateOrganizationRequest + (*UpdateOrganizationResponse)(nil), // 8: redpanda.api.aigateway.v1.UpdateOrganizationResponse + (*DeleteOrganizationRequest)(nil), // 9: redpanda.api.aigateway.v1.DeleteOrganizationRequest + (*DeleteOrganizationResponse)(nil), // 10: redpanda.api.aigateway.v1.DeleteOrganizationResponse + nil, // 11: redpanda.api.aigateway.v1.Organization.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_organization_proto_depIdxs = []int32{ + 11, // 0: redpanda.api.aigateway.v1.Organization.metadata:type_name -> redpanda.api.aigateway.v1.Organization.MetadataEntry + 12, // 1: redpanda.api.aigateway.v1.Organization.create_time:type_name -> google.protobuf.Timestamp + 12, // 2: redpanda.api.aigateway.v1.Organization.update_time:type_name -> google.protobuf.Timestamp + 0, // 3: redpanda.api.aigateway.v1.CreateOrganizationRequest.organization:type_name -> redpanda.api.aigateway.v1.Organization + 0, // 4: redpanda.api.aigateway.v1.CreateOrganizationResponse.organization:type_name -> redpanda.api.aigateway.v1.Organization + 0, // 5: redpanda.api.aigateway.v1.GetOrganizationResponse.organization:type_name -> redpanda.api.aigateway.v1.Organization + 0, // 6: redpanda.api.aigateway.v1.ListOrganizationsResponse.organizations:type_name -> redpanda.api.aigateway.v1.Organization + 0, // 7: redpanda.api.aigateway.v1.UpdateOrganizationRequest.organization:type_name -> redpanda.api.aigateway.v1.Organization + 13, // 8: redpanda.api.aigateway.v1.UpdateOrganizationRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 9: redpanda.api.aigateway.v1.UpdateOrganizationResponse.organization:type_name -> redpanda.api.aigateway.v1.Organization + 1, // 10: redpanda.api.aigateway.v1.OrganizationService.CreateOrganization:input_type -> redpanda.api.aigateway.v1.CreateOrganizationRequest + 3, // 11: redpanda.api.aigateway.v1.OrganizationService.GetOrganization:input_type -> redpanda.api.aigateway.v1.GetOrganizationRequest + 5, // 12: redpanda.api.aigateway.v1.OrganizationService.ListOrganizations:input_type -> redpanda.api.aigateway.v1.ListOrganizationsRequest + 7, // 13: redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization:input_type -> redpanda.api.aigateway.v1.UpdateOrganizationRequest + 9, // 14: redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization:input_type -> redpanda.api.aigateway.v1.DeleteOrganizationRequest + 2, // 15: redpanda.api.aigateway.v1.OrganizationService.CreateOrganization:output_type -> redpanda.api.aigateway.v1.CreateOrganizationResponse + 4, // 16: redpanda.api.aigateway.v1.OrganizationService.GetOrganization:output_type -> redpanda.api.aigateway.v1.GetOrganizationResponse + 6, // 17: redpanda.api.aigateway.v1.OrganizationService.ListOrganizations:output_type -> redpanda.api.aigateway.v1.ListOrganizationsResponse + 8, // 18: redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization:output_type -> redpanda.api.aigateway.v1.UpdateOrganizationResponse + 10, // 19: redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization:output_type -> redpanda.api.aigateway.v1.DeleteOrganizationResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_organization_proto_init() } +func file_redpanda_api_aigateway_v1_organization_proto_init() { + if File_redpanda_api_aigateway_v1_organization_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_organization_proto_rawDesc, + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_organization_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_organization_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_organization_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_organization_proto = out.File + file_redpanda_api_aigateway_v1_organization_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_organization_proto_goTypes = nil + file_redpanda_api_aigateway_v1_organization_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.gw.go new file mode 100644 index 0000000000..775f20de2d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization.pb.gw.go @@ -0,0 +1,557 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/organization.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_OrganizationService_CreateOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client OrganizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Organization); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.CreateOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OrganizationService_CreateOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server OrganizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Organization); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.CreateOrganization(ctx, &protoReq) + return msg, metadata, err +} + +func request_OrganizationService_GetOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client OrganizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OrganizationService_GetOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server OrganizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetOrganization(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OrganizationService_ListOrganizations_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_OrganizationService_ListOrganizations_0(ctx context.Context, marshaler runtime.Marshaler, client OrganizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOrganizationsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_ListOrganizations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListOrganizations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OrganizationService_ListOrganizations_0(ctx context.Context, marshaler runtime.Marshaler, server OrganizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListOrganizationsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_ListOrganizations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListOrganizations(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OrganizationService_UpdateOrganization_0 = &utilities.DoubleArray{Encoding: map[string]int{"organization": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_OrganizationService_UpdateOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client OrganizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Organization); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Organization); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["organization.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "organization.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_UpdateOrganization_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OrganizationService_UpdateOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server OrganizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Organization); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Organization); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["organization.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "organization.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_UpdateOrganization_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateOrganization(ctx, &protoReq) + return msg, metadata, err +} + +var filter_OrganizationService_DeleteOrganization_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_OrganizationService_DeleteOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client OrganizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_DeleteOrganization_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_OrganizationService_DeleteOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server OrganizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OrganizationService_DeleteOrganization_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteOrganization(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterOrganizationServiceHandlerServer registers the http handlers for service OrganizationService to "mux". +// UnaryRPC :call OrganizationServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterOrganizationServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterOrganizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server OrganizationServiceServer) error { + mux.Handle(http.MethodPost, pattern_OrganizationService_CreateOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/CreateOrganization", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OrganizationService_CreateOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_CreateOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OrganizationService_GetOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/GetOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OrganizationService_GetOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_GetOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OrganizationService_ListOrganizations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/ListOrganizations", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OrganizationService_ListOrganizations_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_ListOrganizations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_OrganizationService_UpdateOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/UpdateOrganization", runtime.WithHTTPPathPattern("/v1/{organization.name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OrganizationService_UpdateOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_UpdateOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OrganizationService_DeleteOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/DeleteOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OrganizationService_DeleteOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_DeleteOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterOrganizationServiceHandlerFromEndpoint is same as RegisterOrganizationServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterOrganizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterOrganizationServiceHandler(ctx, mux, conn) +} + +// RegisterOrganizationServiceHandler registers the http handlers for service OrganizationService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterOrganizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterOrganizationServiceHandlerClient(ctx, mux, NewOrganizationServiceClient(conn)) +} + +// RegisterOrganizationServiceHandlerClient registers the http handlers for service OrganizationService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "OrganizationServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "OrganizationServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "OrganizationServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterOrganizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client OrganizationServiceClient) error { + mux.Handle(http.MethodPost, pattern_OrganizationService_CreateOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/CreateOrganization", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OrganizationService_CreateOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_CreateOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OrganizationService_GetOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/GetOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OrganizationService_GetOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_GetOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_OrganizationService_ListOrganizations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/ListOrganizations", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OrganizationService_ListOrganizations_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_ListOrganizations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_OrganizationService_UpdateOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/UpdateOrganization", runtime.WithHTTPPathPattern("/v1/{organization.name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OrganizationService_UpdateOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_UpdateOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_OrganizationService_DeleteOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.OrganizationService/DeleteOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OrganizationService_DeleteOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_OrganizationService_DeleteOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_OrganizationService_CreateOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "organizations"}, "")) + pattern_OrganizationService_GetOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "organizations", "name"}, "")) + pattern_OrganizationService_ListOrganizations_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "organizations"}, "")) + pattern_OrganizationService_UpdateOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "organizations", "organization.name"}, "")) + pattern_OrganizationService_DeleteOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "organizations", "name"}, "")) +) + +var ( + forward_OrganizationService_CreateOrganization_0 = runtime.ForwardResponseMessage + forward_OrganizationService_GetOrganization_0 = runtime.ForwardResponseMessage + forward_OrganizationService_ListOrganizations_0 = runtime.ForwardResponseMessage + forward_OrganizationService_UpdateOrganization_0 = runtime.ForwardResponseMessage + forward_OrganizationService_DeleteOrganization_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/organization_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization_grpc.pb.go new file mode 100644 index 0000000000..d5443d6337 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/organization_grpc.pb.go @@ -0,0 +1,292 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/organization.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + OrganizationService_CreateOrganization_FullMethodName = "/redpanda.api.aigateway.v1.OrganizationService/CreateOrganization" + OrganizationService_GetOrganization_FullMethodName = "/redpanda.api.aigateway.v1.OrganizationService/GetOrganization" + OrganizationService_ListOrganizations_FullMethodName = "/redpanda.api.aigateway.v1.OrganizationService/ListOrganizations" + OrganizationService_UpdateOrganization_FullMethodName = "/redpanda.api.aigateway.v1.OrganizationService/UpdateOrganization" + OrganizationService_DeleteOrganization_FullMethodName = "/redpanda.api.aigateway.v1.OrganizationService/DeleteOrganization" +) + +// OrganizationServiceClient is the client API for OrganizationService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// OrganizationService manages organizations within accounts. +// An organization represents a tenant boundary (department, division) within an account. +// Resource name: accounts/{account_id}/organizations/{organization_id} +type OrganizationServiceClient interface { + // Creates a new organization within an account. + CreateOrganization(ctx context.Context, in *CreateOrganizationRequest, opts ...grpc.CallOption) (*CreateOrganizationResponse, error) + // Gets an organization by name. + GetOrganization(ctx context.Context, in *GetOrganizationRequest, opts ...grpc.CallOption) (*GetOrganizationResponse, error) + // Lists organizations within an account. + ListOrganizations(ctx context.Context, in *ListOrganizationsRequest, opts ...grpc.CallOption) (*ListOrganizationsResponse, error) + // Updates an organization. + UpdateOrganization(ctx context.Context, in *UpdateOrganizationRequest, opts ...grpc.CallOption) (*UpdateOrganizationResponse, error) + // Deletes an organization. + DeleteOrganization(ctx context.Context, in *DeleteOrganizationRequest, opts ...grpc.CallOption) (*DeleteOrganizationResponse, error) +} + +type organizationServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewOrganizationServiceClient(cc grpc.ClientConnInterface) OrganizationServiceClient { + return &organizationServiceClient{cc} +} + +func (c *organizationServiceClient) CreateOrganization(ctx context.Context, in *CreateOrganizationRequest, opts ...grpc.CallOption) (*CreateOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateOrganizationResponse) + err := c.cc.Invoke(ctx, OrganizationService_CreateOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *organizationServiceClient) GetOrganization(ctx context.Context, in *GetOrganizationRequest, opts ...grpc.CallOption) (*GetOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetOrganizationResponse) + err := c.cc.Invoke(ctx, OrganizationService_GetOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *organizationServiceClient) ListOrganizations(ctx context.Context, in *ListOrganizationsRequest, opts ...grpc.CallOption) (*ListOrganizationsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListOrganizationsResponse) + err := c.cc.Invoke(ctx, OrganizationService_ListOrganizations_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *organizationServiceClient) UpdateOrganization(ctx context.Context, in *UpdateOrganizationRequest, opts ...grpc.CallOption) (*UpdateOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateOrganizationResponse) + err := c.cc.Invoke(ctx, OrganizationService_UpdateOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *organizationServiceClient) DeleteOrganization(ctx context.Context, in *DeleteOrganizationRequest, opts ...grpc.CallOption) (*DeleteOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteOrganizationResponse) + err := c.cc.Invoke(ctx, OrganizationService_DeleteOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OrganizationServiceServer is the server API for OrganizationService service. +// All implementations must embed UnimplementedOrganizationServiceServer +// for forward compatibility. +// +// OrganizationService manages organizations within accounts. +// An organization represents a tenant boundary (department, division) within an account. +// Resource name: accounts/{account_id}/organizations/{organization_id} +type OrganizationServiceServer interface { + // Creates a new organization within an account. + CreateOrganization(context.Context, *CreateOrganizationRequest) (*CreateOrganizationResponse, error) + // Gets an organization by name. + GetOrganization(context.Context, *GetOrganizationRequest) (*GetOrganizationResponse, error) + // Lists organizations within an account. + ListOrganizations(context.Context, *ListOrganizationsRequest) (*ListOrganizationsResponse, error) + // Updates an organization. + UpdateOrganization(context.Context, *UpdateOrganizationRequest) (*UpdateOrganizationResponse, error) + // Deletes an organization. + DeleteOrganization(context.Context, *DeleteOrganizationRequest) (*DeleteOrganizationResponse, error) + mustEmbedUnimplementedOrganizationServiceServer() +} + +// UnimplementedOrganizationServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedOrganizationServiceServer struct{} + +func (UnimplementedOrganizationServiceServer) CreateOrganization(context.Context, *CreateOrganizationRequest) (*CreateOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateOrganization not implemented") +} +func (UnimplementedOrganizationServiceServer) GetOrganization(context.Context, *GetOrganizationRequest) (*GetOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetOrganization not implemented") +} +func (UnimplementedOrganizationServiceServer) ListOrganizations(context.Context, *ListOrganizationsRequest) (*ListOrganizationsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListOrganizations not implemented") +} +func (UnimplementedOrganizationServiceServer) UpdateOrganization(context.Context, *UpdateOrganizationRequest) (*UpdateOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateOrganization not implemented") +} +func (UnimplementedOrganizationServiceServer) DeleteOrganization(context.Context, *DeleteOrganizationRequest) (*DeleteOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteOrganization not implemented") +} +func (UnimplementedOrganizationServiceServer) mustEmbedUnimplementedOrganizationServiceServer() {} +func (UnimplementedOrganizationServiceServer) testEmbeddedByValue() {} + +// UnsafeOrganizationServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OrganizationServiceServer will +// result in compilation errors. +type UnsafeOrganizationServiceServer interface { + mustEmbedUnimplementedOrganizationServiceServer() +} + +func RegisterOrganizationServiceServer(s grpc.ServiceRegistrar, srv OrganizationServiceServer) { + // If the following call pancis, it indicates UnimplementedOrganizationServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&OrganizationService_ServiceDesc, srv) +} + +func _OrganizationService_CreateOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).CreateOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OrganizationService_CreateOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).CreateOrganization(ctx, req.(*CreateOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OrganizationService_GetOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).GetOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OrganizationService_GetOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).GetOrganization(ctx, req.(*GetOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OrganizationService_ListOrganizations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListOrganizationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).ListOrganizations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OrganizationService_ListOrganizations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).ListOrganizations(ctx, req.(*ListOrganizationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OrganizationService_UpdateOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).UpdateOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OrganizationService_UpdateOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).UpdateOrganization(ctx, req.(*UpdateOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OrganizationService_DeleteOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).DeleteOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OrganizationService_DeleteOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).DeleteOrganization(ctx, req.(*DeleteOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// OrganizationService_ServiceDesc is the grpc.ServiceDesc for OrganizationService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var OrganizationService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.OrganizationService", + HandlerType: (*OrganizationServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateOrganization", + Handler: _OrganizationService_CreateOrganization_Handler, + }, + { + MethodName: "GetOrganization", + Handler: _OrganizationService_GetOrganization_Handler, + }, + { + MethodName: "ListOrganizations", + Handler: _OrganizationService_ListOrganizations_Handler, + }, + { + MethodName: "UpdateOrganization", + Handler: _OrganizationService_UpdateOrganization_Handler, + }, + { + MethodName: "DeleteOrganization", + Handler: _OrganizationService_DeleteOrganization_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/organization.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.go new file mode 100644 index 0000000000..3b4a2efb67 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.go @@ -0,0 +1,2587 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/pricing.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PriceSource int32 + +const ( + PriceSource_PRICE_SOURCE_UNSPECIFIED PriceSource = 0 + PriceSource_PRICE_SOURCE_STANDARD PriceSource = 1 // Standard/public pricing + PriceSource_PRICE_SOURCE_CUSTOM PriceSource = 2 // Customer-specific override + PriceSource_PRICE_SOURCE_DEFAULT PriceSource = 3 // Fallback default when no price found +) + +// Enum value maps for PriceSource. +var ( + PriceSource_name = map[int32]string{ + 0: "PRICE_SOURCE_UNSPECIFIED", + 1: "PRICE_SOURCE_STANDARD", + 2: "PRICE_SOURCE_CUSTOM", + 3: "PRICE_SOURCE_DEFAULT", + } + PriceSource_value = map[string]int32{ + "PRICE_SOURCE_UNSPECIFIED": 0, + "PRICE_SOURCE_STANDARD": 1, + "PRICE_SOURCE_CUSTOM": 2, + "PRICE_SOURCE_DEFAULT": 3, + } +) + +func (x PriceSource) Enum() *PriceSource { + p := new(PriceSource) + *p = x + return p +} + +func (x PriceSource) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PriceSource) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_pricing_proto_enumTypes[0].Descriptor() +} + +func (PriceSource) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_pricing_proto_enumTypes[0] +} + +func (x PriceSource) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PriceSource.Descriptor instead. +func (PriceSource) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{0} +} + +// Response message for CreateStandardPrice RPC. +type CreateStandardPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrice *StandardPrice `protobuf:"bytes,1,opt,name=standard_price,json=standardPrice,proto3" json:"standard_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateStandardPriceResponse) Reset() { + *x = CreateStandardPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateStandardPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateStandardPriceResponse) ProtoMessage() {} + +func (x *CreateStandardPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateStandardPriceResponse.ProtoReflect.Descriptor instead. +func (*CreateStandardPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateStandardPriceResponse) GetStandardPrice() *StandardPrice { + if x != nil { + return x.StandardPrice + } + return nil +} + +// Response message for GetStandardPrice RPC. +type GetStandardPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrice *StandardPrice `protobuf:"bytes,1,opt,name=standard_price,json=standardPrice,proto3" json:"standard_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetStandardPriceResponse) Reset() { + *x = GetStandardPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetStandardPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStandardPriceResponse) ProtoMessage() {} + +func (x *GetStandardPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStandardPriceResponse.ProtoReflect.Descriptor instead. +func (*GetStandardPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{1} +} + +func (x *GetStandardPriceResponse) GetStandardPrice() *StandardPrice { + if x != nil { + return x.StandardPrice + } + return nil +} + +// Response message for UpdateStandardPrice RPC. +type UpdateStandardPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrice *StandardPrice `protobuf:"bytes,1,opt,name=standard_price,json=standardPrice,proto3" json:"standard_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateStandardPriceResponse) Reset() { + *x = UpdateStandardPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateStandardPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateStandardPriceResponse) ProtoMessage() {} + +func (x *UpdateStandardPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateStandardPriceResponse.ProtoReflect.Descriptor instead. +func (*UpdateStandardPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateStandardPriceResponse) GetStandardPrice() *StandardPrice { + if x != nil { + return x.StandardPrice + } + return nil +} + +// Response message for DeleteStandardPrice RPC. +type DeleteStandardPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteStandardPriceResponse) Reset() { + *x = DeleteStandardPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteStandardPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteStandardPriceResponse) ProtoMessage() {} + +func (x *DeleteStandardPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteStandardPriceResponse.ProtoReflect.Descriptor instead. +func (*DeleteStandardPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{3} +} + +// Response message for CreateCustomPrice RPC. +type CreateCustomPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPrice *CustomPrice `protobuf:"bytes,1,opt,name=custom_price,json=customPrice,proto3" json:"custom_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateCustomPriceResponse) Reset() { + *x = CreateCustomPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateCustomPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateCustomPriceResponse) ProtoMessage() {} + +func (x *CreateCustomPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateCustomPriceResponse.ProtoReflect.Descriptor instead. +func (*CreateCustomPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{4} +} + +func (x *CreateCustomPriceResponse) GetCustomPrice() *CustomPrice { + if x != nil { + return x.CustomPrice + } + return nil +} + +// Response message for GetCustomPrice RPC. +type GetCustomPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPrice *CustomPrice `protobuf:"bytes,1,opt,name=custom_price,json=customPrice,proto3" json:"custom_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetCustomPriceResponse) Reset() { + *x = GetCustomPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetCustomPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCustomPriceResponse) ProtoMessage() {} + +func (x *GetCustomPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCustomPriceResponse.ProtoReflect.Descriptor instead. +func (*GetCustomPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{5} +} + +func (x *GetCustomPriceResponse) GetCustomPrice() *CustomPrice { + if x != nil { + return x.CustomPrice + } + return nil +} + +// Response message for UpdateCustomPrice RPC. +type UpdateCustomPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPrice *CustomPrice `protobuf:"bytes,1,opt,name=custom_price,json=customPrice,proto3" json:"custom_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateCustomPriceResponse) Reset() { + *x = UpdateCustomPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateCustomPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateCustomPriceResponse) ProtoMessage() {} + +func (x *UpdateCustomPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateCustomPriceResponse.ProtoReflect.Descriptor instead. +func (*UpdateCustomPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{6} +} + +func (x *UpdateCustomPriceResponse) GetCustomPrice() *CustomPrice { + if x != nil { + return x.CustomPrice + } + return nil +} + +// Response message for DeleteCustomPrice RPC. +type DeleteCustomPriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteCustomPriceResponse) Reset() { + *x = DeleteCustomPriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteCustomPriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteCustomPriceResponse) ProtoMessage() {} + +func (x *DeleteCustomPriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteCustomPriceResponse.ProtoReflect.Descriptor instead. +func (*DeleteCustomPriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{7} +} + +// Response message for GetEffectivePrice RPC. +type GetEffectivePriceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + EffectivePrice *EffectivePrice `protobuf:"bytes,1,opt,name=effective_price,json=effectivePrice,proto3" json:"effective_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetEffectivePriceResponse) Reset() { + *x = GetEffectivePriceResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetEffectivePriceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetEffectivePriceResponse) ProtoMessage() {} + +func (x *GetEffectivePriceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetEffectivePriceResponse.ProtoReflect.Descriptor instead. +func (*GetEffectivePriceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{8} +} + +func (x *GetEffectivePriceResponse) GetEffectivePrice() *EffectivePrice { + if x != nil { + return x.EffectivePrice + } + return nil +} + +// StandardPrice represents public/default pricing for a model. +// Supports multiple pricing dimensions: token-based (chat, embeddings) and unit-based (images, audio). +type StandardPrice struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Model identification + Provider string `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"` // e.g., "openai", "anthropic" + ModelId string `protobuf:"bytes,4,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` // e.g., "gpt-4o", "claude-3-5-haiku-20241022" + // API type - determines which pricing dimensions apply + Modality string `protobuf:"bytes,5,opt,name=modality,proto3" json:"modality,omitempty"` // "chat", "batch", "embedding", "image", "audio" + // TOKEN-BASED PRICING (for chat, batch, embeddings) + // Standard tokens (always present for token-based APIs) + InputTokenPriceCentsPerMillion int64 `protobuf:"varint,6,opt,name=input_token_price_cents_per_million,json=inputTokenPriceCentsPerMillion,proto3" json:"input_token_price_cents_per_million,omitempty"` + OutputTokenPriceCentsPerMillion int64 `protobuf:"varint,7,opt,name=output_token_price_cents_per_million,json=outputTokenPriceCentsPerMillion,proto3" json:"output_token_price_cents_per_million,omitempty"` + // Cached tokens (Anthropic prompt caching) + // - cached_input_read: 90% discount for cache hits + // - cached_input_write: 25% markup for cache creation + CachedInputReadPriceCentsPerMillion int64 `protobuf:"varint,8,opt,name=cached_input_read_price_cents_per_million,json=cachedInputReadPriceCentsPerMillion,proto3" json:"cached_input_read_price_cents_per_million,omitempty"` + CachedInputWritePriceCentsPerMillion int64 `protobuf:"varint,9,opt,name=cached_input_write_price_cents_per_million,json=cachedInputWritePriceCentsPerMillion,proto3" json:"cached_input_write_price_cents_per_million,omitempty"` + // UNIT-BASED PRICING (for images, audio, etc.) + // Used when pricing is not per-token (e.g., flat fee per image) + UnitType string `protobuf:"bytes,10,opt,name=unit_type,json=unitType,proto3" json:"unit_type,omitempty"` // "image", "audio_second", "character", null for tokens + UnitPriceCents int64 `protobuf:"varint,11,opt,name=unit_price_cents,json=unitPriceCents,proto3" json:"unit_price_cents,omitempty"` // Flat fee per unit + // Optional: Context window size for reference + ContextWindow int32 `protobuf:"varint,12,opt,name=context_window,json=contextWindow,proto3" json:"context_window,omitempty"` + // Optional: Model description + Description string `protobuf:"bytes,13,opt,name=description,proto3" json:"description,omitempty"` + // Versioning: Effective date range + EffectiveFrom *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=effective_from,json=effectiveFrom,proto3" json:"effective_from,omitempty"` + EffectiveTo *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=effective_to,json=effectiveTo,proto3" json:"effective_to,omitempty"` // NULL = currently active + // Metadata + Metadata map[string]string `protobuf:"bytes,16,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Audit fields + CreateTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Creator string `protobuf:"bytes,19,opt,name=creator,proto3" json:"creator,omitempty"` + Updater string `protobuf:"bytes,20,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StandardPrice) Reset() { + *x = StandardPrice{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StandardPrice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StandardPrice) ProtoMessage() {} + +func (x *StandardPrice) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StandardPrice.ProtoReflect.Descriptor instead. +func (*StandardPrice) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{9} +} + +func (x *StandardPrice) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *StandardPrice) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *StandardPrice) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *StandardPrice) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *StandardPrice) GetModality() string { + if x != nil { + return x.Modality + } + return "" +} + +func (x *StandardPrice) GetInputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.InputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *StandardPrice) GetOutputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.OutputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *StandardPrice) GetCachedInputReadPriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputReadPriceCentsPerMillion + } + return 0 +} + +func (x *StandardPrice) GetCachedInputWritePriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputWritePriceCentsPerMillion + } + return 0 +} + +func (x *StandardPrice) GetUnitType() string { + if x != nil { + return x.UnitType + } + return "" +} + +func (x *StandardPrice) GetUnitPriceCents() int64 { + if x != nil { + return x.UnitPriceCents + } + return 0 +} + +func (x *StandardPrice) GetContextWindow() int32 { + if x != nil { + return x.ContextWindow + } + return 0 +} + +func (x *StandardPrice) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *StandardPrice) GetEffectiveFrom() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveFrom + } + return nil +} + +func (x *StandardPrice) GetEffectiveTo() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveTo + } + return nil +} + +func (x *StandardPrice) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *StandardPrice) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *StandardPrice) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *StandardPrice) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *StandardPrice) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// CustomPrice represents customer-specific pricing overrides. +// Allows negotiated pricing per organization/tenant with same dimensions as StandardPrice. +type CustomPrice struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Customer identifier (e.g., org_id, tenant_id from OIDC claims) + CustomerId string `protobuf:"bytes,3,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"` + // Model identification + Provider string `protobuf:"bytes,4,opt,name=provider,proto3" json:"provider,omitempty"` + ModelId string `protobuf:"bytes,5,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` + Modality string `protobuf:"bytes,6,opt,name=modality,proto3" json:"modality,omitempty"` + // TOKEN-BASED PRICING + InputTokenPriceCentsPerMillion int64 `protobuf:"varint,7,opt,name=input_token_price_cents_per_million,json=inputTokenPriceCentsPerMillion,proto3" json:"input_token_price_cents_per_million,omitempty"` + OutputTokenPriceCentsPerMillion int64 `protobuf:"varint,8,opt,name=output_token_price_cents_per_million,json=outputTokenPriceCentsPerMillion,proto3" json:"output_token_price_cents_per_million,omitempty"` + CachedInputReadPriceCentsPerMillion int64 `protobuf:"varint,9,opt,name=cached_input_read_price_cents_per_million,json=cachedInputReadPriceCentsPerMillion,proto3" json:"cached_input_read_price_cents_per_million,omitempty"` + CachedInputWritePriceCentsPerMillion int64 `protobuf:"varint,10,opt,name=cached_input_write_price_cents_per_million,json=cachedInputWritePriceCentsPerMillion,proto3" json:"cached_input_write_price_cents_per_million,omitempty"` + // UNIT-BASED PRICING + UnitType string `protobuf:"bytes,11,opt,name=unit_type,json=unitType,proto3" json:"unit_type,omitempty"` + UnitPriceCents int64 `protobuf:"varint,12,opt,name=unit_price_cents,json=unitPriceCents,proto3" json:"unit_price_cents,omitempty"` + // Versioning: Effective date range + EffectiveFrom *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=effective_from,json=effectiveFrom,proto3" json:"effective_from,omitempty"` + EffectiveTo *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=effective_to,json=effectiveTo,proto3" json:"effective_to,omitempty"` + // Optional: Contract/agreement reference + ContractReference string `protobuf:"bytes,15,opt,name=contract_reference,json=contractReference,proto3" json:"contract_reference,omitempty"` + // Metadata + Metadata map[string]string `protobuf:"bytes,16,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Audit fields + CreateTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Creator string `protobuf:"bytes,19,opt,name=creator,proto3" json:"creator,omitempty"` + Updater string `protobuf:"bytes,20,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CustomPrice) Reset() { + *x = CustomPrice{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CustomPrice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CustomPrice) ProtoMessage() {} + +func (x *CustomPrice) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CustomPrice.ProtoReflect.Descriptor instead. +func (*CustomPrice) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{10} +} + +func (x *CustomPrice) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CustomPrice) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *CustomPrice) GetCustomerId() string { + if x != nil { + return x.CustomerId + } + return "" +} + +func (x *CustomPrice) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *CustomPrice) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *CustomPrice) GetModality() string { + if x != nil { + return x.Modality + } + return "" +} + +func (x *CustomPrice) GetInputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.InputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *CustomPrice) GetOutputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.OutputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *CustomPrice) GetCachedInputReadPriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputReadPriceCentsPerMillion + } + return 0 +} + +func (x *CustomPrice) GetCachedInputWritePriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputWritePriceCentsPerMillion + } + return 0 +} + +func (x *CustomPrice) GetUnitType() string { + if x != nil { + return x.UnitType + } + return "" +} + +func (x *CustomPrice) GetUnitPriceCents() int64 { + if x != nil { + return x.UnitPriceCents + } + return 0 +} + +func (x *CustomPrice) GetEffectiveFrom() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveFrom + } + return nil +} + +func (x *CustomPrice) GetEffectiveTo() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveTo + } + return nil +} + +func (x *CustomPrice) GetContractReference() string { + if x != nil { + return x.ContractReference + } + return "" +} + +func (x *CustomPrice) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *CustomPrice) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *CustomPrice) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *CustomPrice) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *CustomPrice) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// EffectivePrice is the resolved price for a specific request. +// Returns the applicable pricing based on priority: Custom > Standard > Default. +type EffectivePrice struct { + state protoimpl.MessageState `protogen:"open.v1"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + ModelId string `protobuf:"bytes,2,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` + Modality string `protobuf:"bytes,3,opt,name=modality,proto3" json:"modality,omitempty"` + // TOKEN-BASED PRICING + InputTokenPriceCentsPerMillion int64 `protobuf:"varint,4,opt,name=input_token_price_cents_per_million,json=inputTokenPriceCentsPerMillion,proto3" json:"input_token_price_cents_per_million,omitempty"` + OutputTokenPriceCentsPerMillion int64 `protobuf:"varint,5,opt,name=output_token_price_cents_per_million,json=outputTokenPriceCentsPerMillion,proto3" json:"output_token_price_cents_per_million,omitempty"` + CachedInputReadPriceCentsPerMillion int64 `protobuf:"varint,6,opt,name=cached_input_read_price_cents_per_million,json=cachedInputReadPriceCentsPerMillion,proto3" json:"cached_input_read_price_cents_per_million,omitempty"` + CachedInputWritePriceCentsPerMillion int64 `protobuf:"varint,7,opt,name=cached_input_write_price_cents_per_million,json=cachedInputWritePriceCentsPerMillion,proto3" json:"cached_input_write_price_cents_per_million,omitempty"` + // UNIT-BASED PRICING + UnitType string `protobuf:"bytes,8,opt,name=unit_type,json=unitType,proto3" json:"unit_type,omitempty"` + UnitPriceCents int64 `protobuf:"varint,9,opt,name=unit_price_cents,json=unitPriceCents,proto3" json:"unit_price_cents,omitempty"` + // Which price was used + Source PriceSource `protobuf:"varint,10,opt,name=source,proto3,enum=redpanda.api.aigateway.v1.PriceSource" json:"source,omitempty"` + // Reference to the pricing record used + PriceRecordName string `protobuf:"bytes,11,opt,name=price_record_name,json=priceRecordName,proto3" json:"price_record_name,omitempty"` + // Timestamp used for price lookup + EffectiveAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=effective_at,json=effectiveAt,proto3" json:"effective_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EffectivePrice) Reset() { + *x = EffectivePrice{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EffectivePrice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EffectivePrice) ProtoMessage() {} + +func (x *EffectivePrice) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EffectivePrice.ProtoReflect.Descriptor instead. +func (*EffectivePrice) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{11} +} + +func (x *EffectivePrice) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *EffectivePrice) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *EffectivePrice) GetModality() string { + if x != nil { + return x.Modality + } + return "" +} + +func (x *EffectivePrice) GetInputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.InputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *EffectivePrice) GetOutputTokenPriceCentsPerMillion() int64 { + if x != nil { + return x.OutputTokenPriceCentsPerMillion + } + return 0 +} + +func (x *EffectivePrice) GetCachedInputReadPriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputReadPriceCentsPerMillion + } + return 0 +} + +func (x *EffectivePrice) GetCachedInputWritePriceCentsPerMillion() int64 { + if x != nil { + return x.CachedInputWritePriceCentsPerMillion + } + return 0 +} + +func (x *EffectivePrice) GetUnitType() string { + if x != nil { + return x.UnitType + } + return "" +} + +func (x *EffectivePrice) GetUnitPriceCents() int64 { + if x != nil { + return x.UnitPriceCents + } + return 0 +} + +func (x *EffectivePrice) GetSource() PriceSource { + if x != nil { + return x.Source + } + return PriceSource_PRICE_SOURCE_UNSPECIFIED +} + +func (x *EffectivePrice) GetPriceRecordName() string { + if x != nil { + return x.PriceRecordName + } + return "" +} + +func (x *EffectivePrice) GetEffectiveAt() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveAt + } + return nil +} + +type CreateStandardPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPriceId string `protobuf:"bytes,1,opt,name=standard_price_id,json=standardPriceId,proto3" json:"standard_price_id,omitempty"` + StandardPrice *StandardPrice `protobuf:"bytes,2,opt,name=standard_price,json=standardPrice,proto3" json:"standard_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateStandardPriceRequest) Reset() { + *x = CreateStandardPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateStandardPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateStandardPriceRequest) ProtoMessage() {} + +func (x *CreateStandardPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateStandardPriceRequest.ProtoReflect.Descriptor instead. +func (*CreateStandardPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{12} +} + +func (x *CreateStandardPriceRequest) GetStandardPriceId() string { + if x != nil { + return x.StandardPriceId + } + return "" +} + +func (x *CreateStandardPriceRequest) GetStandardPrice() *StandardPrice { + if x != nil { + return x.StandardPrice + } + return nil +} + +type GetStandardPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetStandardPriceRequest) Reset() { + *x = GetStandardPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetStandardPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStandardPriceRequest) ProtoMessage() {} + +func (x *GetStandardPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStandardPriceRequest.ProtoReflect.Descriptor instead. +func (*GetStandardPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{13} +} + +func (x *GetStandardPriceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListStandardPricesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by provider, model_id, modality, or effective date + // Examples: + // + // provider = "openai" + // model_id = "gpt-4o" + // modality = "chat" + // effective_from <= timestamp("2025-01-15T00:00:00Z") AND (effective_to > timestamp("2025-01-15T00:00:00Z") OR effective_to = null) + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListStandardPricesRequest) Reset() { + *x = ListStandardPricesRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListStandardPricesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListStandardPricesRequest) ProtoMessage() {} + +func (x *ListStandardPricesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListStandardPricesRequest.ProtoReflect.Descriptor instead. +func (*ListStandardPricesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{14} +} + +func (x *ListStandardPricesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListStandardPricesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListStandardPricesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListStandardPricesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListStandardPricesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrices []*StandardPrice `protobuf:"bytes,1,rep,name=standard_prices,json=standardPrices,proto3" json:"standard_prices,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListStandardPricesResponse) Reset() { + *x = ListStandardPricesResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListStandardPricesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListStandardPricesResponse) ProtoMessage() {} + +func (x *ListStandardPricesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListStandardPricesResponse.ProtoReflect.Descriptor instead. +func (*ListStandardPricesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{15} +} + +func (x *ListStandardPricesResponse) GetStandardPrices() []*StandardPrice { + if x != nil { + return x.StandardPrices + } + return nil +} + +func (x *ListStandardPricesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListStandardPricesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateStandardPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrice *StandardPrice `protobuf:"bytes,1,opt,name=standard_price,json=standardPrice,proto3" json:"standard_price,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateStandardPriceRequest) Reset() { + *x = UpdateStandardPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateStandardPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateStandardPriceRequest) ProtoMessage() {} + +func (x *UpdateStandardPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateStandardPriceRequest.ProtoReflect.Descriptor instead. +func (*UpdateStandardPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{16} +} + +func (x *UpdateStandardPriceRequest) GetStandardPrice() *StandardPrice { + if x != nil { + return x.StandardPrice + } + return nil +} + +func (x *UpdateStandardPriceRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteStandardPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteStandardPriceRequest) Reset() { + *x = DeleteStandardPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteStandardPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteStandardPriceRequest) ProtoMessage() {} + +func (x *DeleteStandardPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteStandardPriceRequest.ProtoReflect.Descriptor instead. +func (*DeleteStandardPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{17} +} + +func (x *DeleteStandardPriceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CreateCustomPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPriceId string `protobuf:"bytes,1,opt,name=custom_price_id,json=customPriceId,proto3" json:"custom_price_id,omitempty"` + CustomPrice *CustomPrice `protobuf:"bytes,2,opt,name=custom_price,json=customPrice,proto3" json:"custom_price,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateCustomPriceRequest) Reset() { + *x = CreateCustomPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateCustomPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateCustomPriceRequest) ProtoMessage() {} + +func (x *CreateCustomPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateCustomPriceRequest.ProtoReflect.Descriptor instead. +func (*CreateCustomPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{18} +} + +func (x *CreateCustomPriceRequest) GetCustomPriceId() string { + if x != nil { + return x.CustomPriceId + } + return "" +} + +func (x *CreateCustomPriceRequest) GetCustomPrice() *CustomPrice { + if x != nil { + return x.CustomPrice + } + return nil +} + +type GetCustomPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetCustomPriceRequest) Reset() { + *x = GetCustomPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetCustomPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCustomPriceRequest) ProtoMessage() {} + +func (x *GetCustomPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCustomPriceRequest.ProtoReflect.Descriptor instead. +func (*GetCustomPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{19} +} + +func (x *GetCustomPriceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListCustomPricesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by customer_id, provider, model_id, modality, or effective date + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCustomPricesRequest) Reset() { + *x = ListCustomPricesRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCustomPricesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCustomPricesRequest) ProtoMessage() {} + +func (x *ListCustomPricesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListCustomPricesRequest.ProtoReflect.Descriptor instead. +func (*ListCustomPricesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{20} +} + +func (x *ListCustomPricesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListCustomPricesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListCustomPricesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListCustomPricesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListCustomPricesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPrices []*CustomPrice `protobuf:"bytes,1,rep,name=custom_prices,json=customPrices,proto3" json:"custom_prices,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCustomPricesResponse) Reset() { + *x = ListCustomPricesResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCustomPricesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCustomPricesResponse) ProtoMessage() {} + +func (x *ListCustomPricesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListCustomPricesResponse.ProtoReflect.Descriptor instead. +func (*ListCustomPricesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{21} +} + +func (x *ListCustomPricesResponse) GetCustomPrices() []*CustomPrice { + if x != nil { + return x.CustomPrices + } + return nil +} + +func (x *ListCustomPricesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListCustomPricesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateCustomPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + CustomPrice *CustomPrice `protobuf:"bytes,1,opt,name=custom_price,json=customPrice,proto3" json:"custom_price,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateCustomPriceRequest) Reset() { + *x = UpdateCustomPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateCustomPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateCustomPriceRequest) ProtoMessage() {} + +func (x *UpdateCustomPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateCustomPriceRequest.ProtoReflect.Descriptor instead. +func (*UpdateCustomPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{22} +} + +func (x *UpdateCustomPriceRequest) GetCustomPrice() *CustomPrice { + if x != nil { + return x.CustomPrice + } + return nil +} + +func (x *UpdateCustomPriceRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteCustomPriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteCustomPriceRequest) Reset() { + *x = DeleteCustomPriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteCustomPriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteCustomPriceRequest) ProtoMessage() {} + +func (x *DeleteCustomPriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteCustomPriceRequest.ProtoReflect.Descriptor instead. +func (*DeleteCustomPriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{23} +} + +func (x *DeleteCustomPriceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetEffectivePriceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + ModelId string `protobuf:"bytes,2,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` + Modality string `protobuf:"bytes,3,opt,name=modality,proto3" json:"modality,omitempty"` // "chat", "batch", "embedding", etc. + // Optional: Customer ID for custom pricing lookup + CustomerId string `protobuf:"bytes,4,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"` + // Optional: Timestamp for historical price lookup (defaults to NOW) + EffectiveAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=effective_at,json=effectiveAt,proto3" json:"effective_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetEffectivePriceRequest) Reset() { + *x = GetEffectivePriceRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetEffectivePriceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetEffectivePriceRequest) ProtoMessage() {} + +func (x *GetEffectivePriceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetEffectivePriceRequest.ProtoReflect.Descriptor instead. +func (*GetEffectivePriceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{24} +} + +func (x *GetEffectivePriceRequest) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *GetEffectivePriceRequest) GetModelId() string { + if x != nil { + return x.ModelId + } + return "" +} + +func (x *GetEffectivePriceRequest) GetModality() string { + if x != nil { + return x.Modality + } + return "" +} + +func (x *GetEffectivePriceRequest) GetCustomerId() string { + if x != nil { + return x.CustomerId + } + return "" +} + +func (x *GetEffectivePriceRequest) GetEffectiveAt() *timestamppb.Timestamp { + if x != nil { + return x.EffectiveAt + } + return nil +} + +type ListPriceHistoryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` // Default: "effective_from desc" + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPriceHistoryRequest) Reset() { + *x = ListPriceHistoryRequest{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPriceHistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPriceHistoryRequest) ProtoMessage() {} + +func (x *ListPriceHistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPriceHistoryRequest.ProtoReflect.Descriptor instead. +func (*ListPriceHistoryRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{25} +} + +func (x *ListPriceHistoryRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListPriceHistoryRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListPriceHistoryRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListPriceHistoryRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListPriceHistoryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + StandardPrices []*StandardPrice `protobuf:"bytes,1,rep,name=standard_prices,json=standardPrices,proto3" json:"standard_prices,omitempty"` + CustomPrices []*CustomPrice `protobuf:"bytes,2,rep,name=custom_prices,json=customPrices,proto3" json:"custom_prices,omitempty"` + NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,4,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPriceHistoryResponse) Reset() { + *x = ListPriceHistoryResponse{} + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPriceHistoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPriceHistoryResponse) ProtoMessage() {} + +func (x *ListPriceHistoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_pricing_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPriceHistoryResponse.ProtoReflect.Descriptor instead. +func (*ListPriceHistoryResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP(), []int{26} +} + +func (x *ListPriceHistoryResponse) GetStandardPrices() []*StandardPrice { + if x != nil { + return x.StandardPrices + } + return nil +} + +func (x *ListPriceHistoryResponse) GetCustomPrices() []*CustomPrice { + if x != nil { + return x.CustomPrices + } + return nil +} + +func (x *ListPriceHistoryResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListPriceHistoryResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +var File_redpanda_api_aigateway_v1_pricing_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_pricing_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, + 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x6e, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4f, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x22, 0x6b, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, + 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x6e, + 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, + 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x1d, + 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x0a, + 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x22, 0xbb, 0x09, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x6d, 0x6f, 0x64, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x23, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x24, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x1f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, + 0x6e, 0x12, 0x56, 0x0a, 0x29, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x23, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x52, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, + 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x2a, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x24, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, 0x69, 0x74, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x3d, 0x0a, 0x0c, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x6f, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, + 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, + 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, + 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x4f, 0xea, + 0x41, 0x4c, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x24, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, + 0x67, 0x2f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x73, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xbd, + 0x09, 0x0a, 0x0b, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x17, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x24, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x6d, + 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x23, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x24, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x1f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x29, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x23, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x52, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, + 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x2a, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x24, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, + 0x69, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x0e, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x3d, 0x0a, 0x0c, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x54, 0x6f, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x3a, 0x49, 0xea, 0x41, 0x46, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2f, 0x7b, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xa3, + 0x05, 0x0a, 0x0e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, + 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x23, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, + 0x6e, 0x12, 0x4d, 0x0a, 0x24, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x1f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, + 0x12, 0x56, 0x0a, 0x29, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x23, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x52, 0x65, 0x61, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, + 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x2a, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x24, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x28, 0x0a, 0x10, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, 0x69, 0x74, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x41, 0x74, 0x22, 0x9e, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x54, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x5b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, + 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, + 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, + 0xb6, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, + 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x5e, 0x0a, 0x1a, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x18, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x4e, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x57, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x22, 0xae, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4e, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, + 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x5a, + 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, + 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xdc, 0x01, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x08, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x0c, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x17, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x81, 0x02, 0x0a, 0x18, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, + 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2a, 0x79, 0x0a, + 0x0b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x18, + 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x52, + 0x49, 0x43, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, + 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x02, 0x12, 0x18, + 0x0a, 0x14, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, + 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x03, 0x32, 0xd3, 0x10, 0x0a, 0x13, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0xb2, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, + 0x0e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x61, 0x72, 0x64, 0x12, 0xa2, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, + 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x73, + 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2f, 0x2a, 0x7d, 0x12, 0x9f, 0x01, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, + 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x12, 0xca, 0x01, 0x0a, + 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x3a, 0x0e, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x32, 0x2c, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2f, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x2a, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x2f, 0x2a, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, + 0x3a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x12, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, + 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2f, 0x2a, 0x7d, 0x12, + 0x97, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x69, + 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0xbe, 0x01, 0x0a, 0x11, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, + 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x38, 0x3a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x32, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, + 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2f, 0x2a, 0x7d, 0x12, 0xa3, 0x01, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, + 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2f, 0x2a, 0x7d, + 0x12, 0xa3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x65, 0x74, 0x45, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0xd5, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x5a, 0x27, 0x12, 0x25, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x69, 0x63, + 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2f, 0x2a, 0x7d, 0x2f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x2f, 0x2a, 0x7d, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x81, + 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x42, 0x0c, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, + 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, + 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, + 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, + 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_pricing_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_pricing_proto_rawDescData = file_redpanda_api_aigateway_v1_pricing_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_pricing_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_pricing_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_pricing_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_pricing_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_pricing_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_pricing_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_pricing_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_redpanda_api_aigateway_v1_pricing_proto_goTypes = []any{ + (PriceSource)(0), // 0: redpanda.api.aigateway.v1.PriceSource + (*CreateStandardPriceResponse)(nil), // 1: redpanda.api.aigateway.v1.CreateStandardPriceResponse + (*GetStandardPriceResponse)(nil), // 2: redpanda.api.aigateway.v1.GetStandardPriceResponse + (*UpdateStandardPriceResponse)(nil), // 3: redpanda.api.aigateway.v1.UpdateStandardPriceResponse + (*DeleteStandardPriceResponse)(nil), // 4: redpanda.api.aigateway.v1.DeleteStandardPriceResponse + (*CreateCustomPriceResponse)(nil), // 5: redpanda.api.aigateway.v1.CreateCustomPriceResponse + (*GetCustomPriceResponse)(nil), // 6: redpanda.api.aigateway.v1.GetCustomPriceResponse + (*UpdateCustomPriceResponse)(nil), // 7: redpanda.api.aigateway.v1.UpdateCustomPriceResponse + (*DeleteCustomPriceResponse)(nil), // 8: redpanda.api.aigateway.v1.DeleteCustomPriceResponse + (*GetEffectivePriceResponse)(nil), // 9: redpanda.api.aigateway.v1.GetEffectivePriceResponse + (*StandardPrice)(nil), // 10: redpanda.api.aigateway.v1.StandardPrice + (*CustomPrice)(nil), // 11: redpanda.api.aigateway.v1.CustomPrice + (*EffectivePrice)(nil), // 12: redpanda.api.aigateway.v1.EffectivePrice + (*CreateStandardPriceRequest)(nil), // 13: redpanda.api.aigateway.v1.CreateStandardPriceRequest + (*GetStandardPriceRequest)(nil), // 14: redpanda.api.aigateway.v1.GetStandardPriceRequest + (*ListStandardPricesRequest)(nil), // 15: redpanda.api.aigateway.v1.ListStandardPricesRequest + (*ListStandardPricesResponse)(nil), // 16: redpanda.api.aigateway.v1.ListStandardPricesResponse + (*UpdateStandardPriceRequest)(nil), // 17: redpanda.api.aigateway.v1.UpdateStandardPriceRequest + (*DeleteStandardPriceRequest)(nil), // 18: redpanda.api.aigateway.v1.DeleteStandardPriceRequest + (*CreateCustomPriceRequest)(nil), // 19: redpanda.api.aigateway.v1.CreateCustomPriceRequest + (*GetCustomPriceRequest)(nil), // 20: redpanda.api.aigateway.v1.GetCustomPriceRequest + (*ListCustomPricesRequest)(nil), // 21: redpanda.api.aigateway.v1.ListCustomPricesRequest + (*ListCustomPricesResponse)(nil), // 22: redpanda.api.aigateway.v1.ListCustomPricesResponse + (*UpdateCustomPriceRequest)(nil), // 23: redpanda.api.aigateway.v1.UpdateCustomPriceRequest + (*DeleteCustomPriceRequest)(nil), // 24: redpanda.api.aigateway.v1.DeleteCustomPriceRequest + (*GetEffectivePriceRequest)(nil), // 25: redpanda.api.aigateway.v1.GetEffectivePriceRequest + (*ListPriceHistoryRequest)(nil), // 26: redpanda.api.aigateway.v1.ListPriceHistoryRequest + (*ListPriceHistoryResponse)(nil), // 27: redpanda.api.aigateway.v1.ListPriceHistoryResponse + nil, // 28: redpanda.api.aigateway.v1.StandardPrice.MetadataEntry + nil, // 29: redpanda.api.aigateway.v1.CustomPrice.MetadataEntry + (*timestamppb.Timestamp)(nil), // 30: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 31: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_pricing_proto_depIdxs = []int32{ + 10, // 0: redpanda.api.aigateway.v1.CreateStandardPriceResponse.standard_price:type_name -> redpanda.api.aigateway.v1.StandardPrice + 10, // 1: redpanda.api.aigateway.v1.GetStandardPriceResponse.standard_price:type_name -> redpanda.api.aigateway.v1.StandardPrice + 10, // 2: redpanda.api.aigateway.v1.UpdateStandardPriceResponse.standard_price:type_name -> redpanda.api.aigateway.v1.StandardPrice + 11, // 3: redpanda.api.aigateway.v1.CreateCustomPriceResponse.custom_price:type_name -> redpanda.api.aigateway.v1.CustomPrice + 11, // 4: redpanda.api.aigateway.v1.GetCustomPriceResponse.custom_price:type_name -> redpanda.api.aigateway.v1.CustomPrice + 11, // 5: redpanda.api.aigateway.v1.UpdateCustomPriceResponse.custom_price:type_name -> redpanda.api.aigateway.v1.CustomPrice + 12, // 6: redpanda.api.aigateway.v1.GetEffectivePriceResponse.effective_price:type_name -> redpanda.api.aigateway.v1.EffectivePrice + 30, // 7: redpanda.api.aigateway.v1.StandardPrice.effective_from:type_name -> google.protobuf.Timestamp + 30, // 8: redpanda.api.aigateway.v1.StandardPrice.effective_to:type_name -> google.protobuf.Timestamp + 28, // 9: redpanda.api.aigateway.v1.StandardPrice.metadata:type_name -> redpanda.api.aigateway.v1.StandardPrice.MetadataEntry + 30, // 10: redpanda.api.aigateway.v1.StandardPrice.create_time:type_name -> google.protobuf.Timestamp + 30, // 11: redpanda.api.aigateway.v1.StandardPrice.update_time:type_name -> google.protobuf.Timestamp + 30, // 12: redpanda.api.aigateway.v1.CustomPrice.effective_from:type_name -> google.protobuf.Timestamp + 30, // 13: redpanda.api.aigateway.v1.CustomPrice.effective_to:type_name -> google.protobuf.Timestamp + 29, // 14: redpanda.api.aigateway.v1.CustomPrice.metadata:type_name -> redpanda.api.aigateway.v1.CustomPrice.MetadataEntry + 30, // 15: redpanda.api.aigateway.v1.CustomPrice.create_time:type_name -> google.protobuf.Timestamp + 30, // 16: redpanda.api.aigateway.v1.CustomPrice.update_time:type_name -> google.protobuf.Timestamp + 0, // 17: redpanda.api.aigateway.v1.EffectivePrice.source:type_name -> redpanda.api.aigateway.v1.PriceSource + 30, // 18: redpanda.api.aigateway.v1.EffectivePrice.effective_at:type_name -> google.protobuf.Timestamp + 10, // 19: redpanda.api.aigateway.v1.CreateStandardPriceRequest.standard_price:type_name -> redpanda.api.aigateway.v1.StandardPrice + 10, // 20: redpanda.api.aigateway.v1.ListStandardPricesResponse.standard_prices:type_name -> redpanda.api.aigateway.v1.StandardPrice + 10, // 21: redpanda.api.aigateway.v1.UpdateStandardPriceRequest.standard_price:type_name -> redpanda.api.aigateway.v1.StandardPrice + 31, // 22: redpanda.api.aigateway.v1.UpdateStandardPriceRequest.update_mask:type_name -> google.protobuf.FieldMask + 11, // 23: redpanda.api.aigateway.v1.CreateCustomPriceRequest.custom_price:type_name -> redpanda.api.aigateway.v1.CustomPrice + 11, // 24: redpanda.api.aigateway.v1.ListCustomPricesResponse.custom_prices:type_name -> redpanda.api.aigateway.v1.CustomPrice + 11, // 25: redpanda.api.aigateway.v1.UpdateCustomPriceRequest.custom_price:type_name -> redpanda.api.aigateway.v1.CustomPrice + 31, // 26: redpanda.api.aigateway.v1.UpdateCustomPriceRequest.update_mask:type_name -> google.protobuf.FieldMask + 30, // 27: redpanda.api.aigateway.v1.GetEffectivePriceRequest.effective_at:type_name -> google.protobuf.Timestamp + 10, // 28: redpanda.api.aigateway.v1.ListPriceHistoryResponse.standard_prices:type_name -> redpanda.api.aigateway.v1.StandardPrice + 11, // 29: redpanda.api.aigateway.v1.ListPriceHistoryResponse.custom_prices:type_name -> redpanda.api.aigateway.v1.CustomPrice + 13, // 30: redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice:input_type -> redpanda.api.aigateway.v1.CreateStandardPriceRequest + 14, // 31: redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice:input_type -> redpanda.api.aigateway.v1.GetStandardPriceRequest + 15, // 32: redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices:input_type -> redpanda.api.aigateway.v1.ListStandardPricesRequest + 17, // 33: redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice:input_type -> redpanda.api.aigateway.v1.UpdateStandardPriceRequest + 18, // 34: redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice:input_type -> redpanda.api.aigateway.v1.DeleteStandardPriceRequest + 19, // 35: redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice:input_type -> redpanda.api.aigateway.v1.CreateCustomPriceRequest + 20, // 36: redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice:input_type -> redpanda.api.aigateway.v1.GetCustomPriceRequest + 21, // 37: redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices:input_type -> redpanda.api.aigateway.v1.ListCustomPricesRequest + 23, // 38: redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice:input_type -> redpanda.api.aigateway.v1.UpdateCustomPriceRequest + 24, // 39: redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice:input_type -> redpanda.api.aigateway.v1.DeleteCustomPriceRequest + 25, // 40: redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice:input_type -> redpanda.api.aigateway.v1.GetEffectivePriceRequest + 26, // 41: redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory:input_type -> redpanda.api.aigateway.v1.ListPriceHistoryRequest + 1, // 42: redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice:output_type -> redpanda.api.aigateway.v1.CreateStandardPriceResponse + 2, // 43: redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice:output_type -> redpanda.api.aigateway.v1.GetStandardPriceResponse + 16, // 44: redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices:output_type -> redpanda.api.aigateway.v1.ListStandardPricesResponse + 3, // 45: redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice:output_type -> redpanda.api.aigateway.v1.UpdateStandardPriceResponse + 4, // 46: redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice:output_type -> redpanda.api.aigateway.v1.DeleteStandardPriceResponse + 5, // 47: redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice:output_type -> redpanda.api.aigateway.v1.CreateCustomPriceResponse + 6, // 48: redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice:output_type -> redpanda.api.aigateway.v1.GetCustomPriceResponse + 22, // 49: redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices:output_type -> redpanda.api.aigateway.v1.ListCustomPricesResponse + 7, // 50: redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice:output_type -> redpanda.api.aigateway.v1.UpdateCustomPriceResponse + 8, // 51: redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice:output_type -> redpanda.api.aigateway.v1.DeleteCustomPriceResponse + 9, // 52: redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice:output_type -> redpanda.api.aigateway.v1.GetEffectivePriceResponse + 27, // 53: redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory:output_type -> redpanda.api.aigateway.v1.ListPriceHistoryResponse + 42, // [42:54] is the sub-list for method output_type + 30, // [30:42] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_pricing_proto_init() } +func file_redpanda_api_aigateway_v1_pricing_proto_init() { + if File_redpanda_api_aigateway_v1_pricing_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_pricing_proto_rawDesc, + NumEnums: 1, + NumMessages: 29, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_pricing_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_pricing_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_pricing_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_pricing_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_pricing_proto = out.File + file_redpanda_api_aigateway_v1_pricing_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_pricing_proto_goTypes = nil + file_redpanda_api_aigateway_v1_pricing_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.gw.go new file mode 100644 index 0000000000..1c8994f29a --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing.pb.gw.go @@ -0,0 +1,1201 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/pricing.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_ModelPricingService_CreateStandardPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"standard_price": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ModelPricingService_CreateStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateStandardPriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.StandardPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_CreateStandardPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateStandardPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_CreateStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateStandardPriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.StandardPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_CreateStandardPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateStandardPrice(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelPricingService_GetStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetStandardPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_GetStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetStandardPrice(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_ListStandardPrices_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ModelPricingService_ListStandardPrices_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListStandardPricesRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListStandardPrices_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListStandardPrices(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_ListStandardPrices_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListStandardPricesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListStandardPrices_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListStandardPrices(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_UpdateStandardPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"standard_price": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_ModelPricingService_UpdateStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.StandardPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.StandardPrice); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["standard_price.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "standard_price.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "standard_price.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "standard_price.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_UpdateStandardPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateStandardPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_UpdateStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.StandardPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.StandardPrice); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["standard_price.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "standard_price.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "standard_price.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "standard_price.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_UpdateStandardPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateStandardPrice(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelPricingService_DeleteStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteStandardPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_DeleteStandardPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteStandardPriceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteStandardPrice(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_CreateCustomPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"custom_price": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ModelPricingService_CreateCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateCustomPriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.CustomPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_CreateCustomPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateCustomPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_CreateCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateCustomPriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.CustomPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_CreateCustomPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateCustomPrice(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelPricingService_GetCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetCustomPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_GetCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetCustomPrice(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_ListCustomPrices_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_ModelPricingService_ListCustomPrices_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListCustomPricesRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListCustomPrices_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListCustomPrices(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_ListCustomPrices_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListCustomPricesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListCustomPrices_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListCustomPrices(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_UpdateCustomPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"custom_price": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_ModelPricingService_UpdateCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.CustomPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.CustomPrice); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["custom_price.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "custom_price.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "custom_price.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "custom_price.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_UpdateCustomPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateCustomPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_UpdateCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.CustomPrice); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.CustomPrice); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["custom_price.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "custom_price.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "custom_price.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "custom_price.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_UpdateCustomPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateCustomPrice(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelPricingService_DeleteCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteCustomPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_DeleteCustomPrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteCustomPriceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteCustomPrice(ctx, &protoReq) + return msg, metadata, err +} + +func request_ModelPricingService_GetEffectivePrice_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetEffectivePriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetEffectivePrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_GetEffectivePrice_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetEffectivePriceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetEffectivePrice(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_ListPriceHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ModelPricingService_ListPriceHistory_0(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPriceHistoryRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListPriceHistory_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListPriceHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_ListPriceHistory_0(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPriceHistoryRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListPriceHistory_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListPriceHistory(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ModelPricingService_ListPriceHistory_1 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ModelPricingService_ListPriceHistory_1(ctx context.Context, marshaler runtime.Marshaler, client ModelPricingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPriceHistoryRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListPriceHistory_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListPriceHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ModelPricingService_ListPriceHistory_1(ctx context.Context, marshaler runtime.Marshaler, server ModelPricingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListPriceHistoryRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ModelPricingService_ListPriceHistory_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListPriceHistory(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterModelPricingServiceHandlerServer registers the http handlers for service ModelPricingService to "mux". +// UnaryRPC :call ModelPricingServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterModelPricingServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterModelPricingServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ModelPricingServiceServer) error { + mux.Handle(http.MethodPost, pattern_ModelPricingService_CreateStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/CreateStandardPrice", runtime.WithHTTPPathPattern("/v1/pricing/standard")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_CreateStandardPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_CreateStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_GetStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetStandardPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_GetStandardPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListStandardPrices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListStandardPrices", runtime.WithHTTPPathPattern("/v1/pricing/standard")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_ListStandardPrices_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListStandardPrices_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelPricingService_UpdateStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/UpdateStandardPrice", runtime.WithHTTPPathPattern("/v1/{standard_price.name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_UpdateStandardPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_UpdateStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelPricingService_DeleteStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/DeleteStandardPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_DeleteStandardPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_DeleteStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelPricingService_CreateCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/CreateCustomPrice", runtime.WithHTTPPathPattern("/v1/pricing/custom")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_CreateCustomPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_CreateCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_GetCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetCustomPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_GetCustomPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListCustomPrices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListCustomPrices", runtime.WithHTTPPathPattern("/v1/pricing/custom")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_ListCustomPrices_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListCustomPrices_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelPricingService_UpdateCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/UpdateCustomPrice", runtime.WithHTTPPathPattern("/v1/{custom_price.name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_UpdateCustomPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_UpdateCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelPricingService_DeleteCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/DeleteCustomPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_DeleteCustomPrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_DeleteCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelPricingService_GetEffectivePrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetEffectivePrice", runtime.WithHTTPPathPattern("/v1/pricing:getEffective")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_GetEffectivePrice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetEffectivePrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListPriceHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory", runtime.WithHTTPPathPattern("/v1/{parent=pricing/standard/*}/history")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_ListPriceHistory_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListPriceHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListPriceHistory_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory", runtime.WithHTTPPathPattern("/v1/{parent=pricing/custom/*}/history")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ModelPricingService_ListPriceHistory_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListPriceHistory_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterModelPricingServiceHandlerFromEndpoint is same as RegisterModelPricingServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterModelPricingServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterModelPricingServiceHandler(ctx, mux, conn) +} + +// RegisterModelPricingServiceHandler registers the http handlers for service ModelPricingService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterModelPricingServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterModelPricingServiceHandlerClient(ctx, mux, NewModelPricingServiceClient(conn)) +} + +// RegisterModelPricingServiceHandlerClient registers the http handlers for service ModelPricingService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ModelPricingServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ModelPricingServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ModelPricingServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterModelPricingServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ModelPricingServiceClient) error { + mux.Handle(http.MethodPost, pattern_ModelPricingService_CreateStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/CreateStandardPrice", runtime.WithHTTPPathPattern("/v1/pricing/standard")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_CreateStandardPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_CreateStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_GetStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetStandardPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_GetStandardPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListStandardPrices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListStandardPrices", runtime.WithHTTPPathPattern("/v1/pricing/standard")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_ListStandardPrices_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListStandardPrices_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelPricingService_UpdateStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/UpdateStandardPrice", runtime.WithHTTPPathPattern("/v1/{standard_price.name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_UpdateStandardPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_UpdateStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelPricingService_DeleteStandardPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/DeleteStandardPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/standard/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_DeleteStandardPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_DeleteStandardPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelPricingService_CreateCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/CreateCustomPrice", runtime.WithHTTPPathPattern("/v1/pricing/custom")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_CreateCustomPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_CreateCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_GetCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetCustomPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_GetCustomPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListCustomPrices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListCustomPrices", runtime.WithHTTPPathPattern("/v1/pricing/custom")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_ListCustomPrices_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListCustomPrices_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ModelPricingService_UpdateCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/UpdateCustomPrice", runtime.WithHTTPPathPattern("/v1/{custom_price.name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_UpdateCustomPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_UpdateCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ModelPricingService_DeleteCustomPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/DeleteCustomPrice", runtime.WithHTTPPathPattern("/v1/{name=pricing/custom/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_DeleteCustomPrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_DeleteCustomPrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ModelPricingService_GetEffectivePrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/GetEffectivePrice", runtime.WithHTTPPathPattern("/v1/pricing:getEffective")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_GetEffectivePrice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_GetEffectivePrice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListPriceHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory", runtime.WithHTTPPathPattern("/v1/{parent=pricing/standard/*}/history")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_ListPriceHistory_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListPriceHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ModelPricingService_ListPriceHistory_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory", runtime.WithHTTPPathPattern("/v1/{parent=pricing/custom/*}/history")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ModelPricingService_ListPriceHistory_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ModelPricingService_ListPriceHistory_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ModelPricingService_CreateStandardPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pricing", "standard"}, "")) + pattern_ModelPricingService_GetStandardPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "standard", "name"}, "")) + pattern_ModelPricingService_ListStandardPrices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pricing", "standard"}, "")) + pattern_ModelPricingService_UpdateStandardPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "standard", "standard_price.name"}, "")) + pattern_ModelPricingService_DeleteStandardPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "standard", "name"}, "")) + pattern_ModelPricingService_CreateCustomPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pricing", "custom"}, "")) + pattern_ModelPricingService_GetCustomPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "custom", "name"}, "")) + pattern_ModelPricingService_ListCustomPrices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pricing", "custom"}, "")) + pattern_ModelPricingService_UpdateCustomPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "custom", "custom_price.name"}, "")) + pattern_ModelPricingService_DeleteCustomPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3}, []string{"v1", "pricing", "custom", "name"}, "")) + pattern_ModelPricingService_GetEffectivePrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "pricing"}, "getEffective")) + pattern_ModelPricingService_ListPriceHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3, 2, 4}, []string{"v1", "pricing", "standard", "parent", "history"}, "")) + pattern_ModelPricingService_ListPriceHistory_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 3, 5, 3, 2, 4}, []string{"v1", "pricing", "custom", "parent", "history"}, "")) +) + +var ( + forward_ModelPricingService_CreateStandardPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_GetStandardPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_ListStandardPrices_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_UpdateStandardPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_DeleteStandardPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_CreateCustomPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_GetCustomPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_ListCustomPrices_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_UpdateCustomPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_DeleteCustomPrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_GetEffectivePrice_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_ListPriceHistory_0 = runtime.ForwardResponseMessage + forward_ModelPricingService_ListPriceHistory_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing_grpc.pb.go new file mode 100644 index 0000000000..083d5bcca3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/pricing_grpc.pb.go @@ -0,0 +1,540 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/pricing.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ModelPricingService_CreateStandardPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/CreateStandardPrice" + ModelPricingService_GetStandardPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/GetStandardPrice" + ModelPricingService_ListStandardPrices_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/ListStandardPrices" + ModelPricingService_UpdateStandardPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/UpdateStandardPrice" + ModelPricingService_DeleteStandardPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/DeleteStandardPrice" + ModelPricingService_CreateCustomPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/CreateCustomPrice" + ModelPricingService_GetCustomPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/GetCustomPrice" + ModelPricingService_ListCustomPrices_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/ListCustomPrices" + ModelPricingService_UpdateCustomPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/UpdateCustomPrice" + ModelPricingService_DeleteCustomPrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/DeleteCustomPrice" + ModelPricingService_GetEffectivePrice_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/GetEffectivePrice" + ModelPricingService_ListPriceHistory_FullMethodName = "/redpanda.api.aigateway.v1.ModelPricingService/ListPriceHistory" +) + +// ModelPricingServiceClient is the client API for ModelPricingService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ModelPricingServiceClient interface { + CreateStandardPrice(ctx context.Context, in *CreateStandardPriceRequest, opts ...grpc.CallOption) (*CreateStandardPriceResponse, error) + GetStandardPrice(ctx context.Context, in *GetStandardPriceRequest, opts ...grpc.CallOption) (*GetStandardPriceResponse, error) + ListStandardPrices(ctx context.Context, in *ListStandardPricesRequest, opts ...grpc.CallOption) (*ListStandardPricesResponse, error) + UpdateStandardPrice(ctx context.Context, in *UpdateStandardPriceRequest, opts ...grpc.CallOption) (*UpdateStandardPriceResponse, error) + DeleteStandardPrice(ctx context.Context, in *DeleteStandardPriceRequest, opts ...grpc.CallOption) (*DeleteStandardPriceResponse, error) + CreateCustomPrice(ctx context.Context, in *CreateCustomPriceRequest, opts ...grpc.CallOption) (*CreateCustomPriceResponse, error) + GetCustomPrice(ctx context.Context, in *GetCustomPriceRequest, opts ...grpc.CallOption) (*GetCustomPriceResponse, error) + ListCustomPrices(ctx context.Context, in *ListCustomPricesRequest, opts ...grpc.CallOption) (*ListCustomPricesResponse, error) + UpdateCustomPrice(ctx context.Context, in *UpdateCustomPriceRequest, opts ...grpc.CallOption) (*UpdateCustomPriceResponse, error) + DeleteCustomPrice(ctx context.Context, in *DeleteCustomPriceRequest, opts ...grpc.CallOption) (*DeleteCustomPriceResponse, error) + GetEffectivePrice(ctx context.Context, in *GetEffectivePriceRequest, opts ...grpc.CallOption) (*GetEffectivePriceResponse, error) + ListPriceHistory(ctx context.Context, in *ListPriceHistoryRequest, opts ...grpc.CallOption) (*ListPriceHistoryResponse, error) +} + +type modelPricingServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewModelPricingServiceClient(cc grpc.ClientConnInterface) ModelPricingServiceClient { + return &modelPricingServiceClient{cc} +} + +func (c *modelPricingServiceClient) CreateStandardPrice(ctx context.Context, in *CreateStandardPriceRequest, opts ...grpc.CallOption) (*CreateStandardPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateStandardPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_CreateStandardPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) GetStandardPrice(ctx context.Context, in *GetStandardPriceRequest, opts ...grpc.CallOption) (*GetStandardPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetStandardPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_GetStandardPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) ListStandardPrices(ctx context.Context, in *ListStandardPricesRequest, opts ...grpc.CallOption) (*ListStandardPricesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListStandardPricesResponse) + err := c.cc.Invoke(ctx, ModelPricingService_ListStandardPrices_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) UpdateStandardPrice(ctx context.Context, in *UpdateStandardPriceRequest, opts ...grpc.CallOption) (*UpdateStandardPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateStandardPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_UpdateStandardPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) DeleteStandardPrice(ctx context.Context, in *DeleteStandardPriceRequest, opts ...grpc.CallOption) (*DeleteStandardPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteStandardPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_DeleteStandardPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) CreateCustomPrice(ctx context.Context, in *CreateCustomPriceRequest, opts ...grpc.CallOption) (*CreateCustomPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateCustomPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_CreateCustomPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) GetCustomPrice(ctx context.Context, in *GetCustomPriceRequest, opts ...grpc.CallOption) (*GetCustomPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetCustomPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_GetCustomPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) ListCustomPrices(ctx context.Context, in *ListCustomPricesRequest, opts ...grpc.CallOption) (*ListCustomPricesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListCustomPricesResponse) + err := c.cc.Invoke(ctx, ModelPricingService_ListCustomPrices_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) UpdateCustomPrice(ctx context.Context, in *UpdateCustomPriceRequest, opts ...grpc.CallOption) (*UpdateCustomPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateCustomPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_UpdateCustomPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) DeleteCustomPrice(ctx context.Context, in *DeleteCustomPriceRequest, opts ...grpc.CallOption) (*DeleteCustomPriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteCustomPriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_DeleteCustomPrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) GetEffectivePrice(ctx context.Context, in *GetEffectivePriceRequest, opts ...grpc.CallOption) (*GetEffectivePriceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetEffectivePriceResponse) + err := c.cc.Invoke(ctx, ModelPricingService_GetEffectivePrice_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *modelPricingServiceClient) ListPriceHistory(ctx context.Context, in *ListPriceHistoryRequest, opts ...grpc.CallOption) (*ListPriceHistoryResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListPriceHistoryResponse) + err := c.cc.Invoke(ctx, ModelPricingService_ListPriceHistory_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ModelPricingServiceServer is the server API for ModelPricingService service. +// All implementations must embed UnimplementedModelPricingServiceServer +// for forward compatibility. +type ModelPricingServiceServer interface { + CreateStandardPrice(context.Context, *CreateStandardPriceRequest) (*CreateStandardPriceResponse, error) + GetStandardPrice(context.Context, *GetStandardPriceRequest) (*GetStandardPriceResponse, error) + ListStandardPrices(context.Context, *ListStandardPricesRequest) (*ListStandardPricesResponse, error) + UpdateStandardPrice(context.Context, *UpdateStandardPriceRequest) (*UpdateStandardPriceResponse, error) + DeleteStandardPrice(context.Context, *DeleteStandardPriceRequest) (*DeleteStandardPriceResponse, error) + CreateCustomPrice(context.Context, *CreateCustomPriceRequest) (*CreateCustomPriceResponse, error) + GetCustomPrice(context.Context, *GetCustomPriceRequest) (*GetCustomPriceResponse, error) + ListCustomPrices(context.Context, *ListCustomPricesRequest) (*ListCustomPricesResponse, error) + UpdateCustomPrice(context.Context, *UpdateCustomPriceRequest) (*UpdateCustomPriceResponse, error) + DeleteCustomPrice(context.Context, *DeleteCustomPriceRequest) (*DeleteCustomPriceResponse, error) + GetEffectivePrice(context.Context, *GetEffectivePriceRequest) (*GetEffectivePriceResponse, error) + ListPriceHistory(context.Context, *ListPriceHistoryRequest) (*ListPriceHistoryResponse, error) + mustEmbedUnimplementedModelPricingServiceServer() +} + +// UnimplementedModelPricingServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedModelPricingServiceServer struct{} + +func (UnimplementedModelPricingServiceServer) CreateStandardPrice(context.Context, *CreateStandardPriceRequest) (*CreateStandardPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateStandardPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) GetStandardPrice(context.Context, *GetStandardPriceRequest) (*GetStandardPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetStandardPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) ListStandardPrices(context.Context, *ListStandardPricesRequest) (*ListStandardPricesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListStandardPrices not implemented") +} +func (UnimplementedModelPricingServiceServer) UpdateStandardPrice(context.Context, *UpdateStandardPriceRequest) (*UpdateStandardPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateStandardPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) DeleteStandardPrice(context.Context, *DeleteStandardPriceRequest) (*DeleteStandardPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteStandardPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) CreateCustomPrice(context.Context, *CreateCustomPriceRequest) (*CreateCustomPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateCustomPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) GetCustomPrice(context.Context, *GetCustomPriceRequest) (*GetCustomPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCustomPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) ListCustomPrices(context.Context, *ListCustomPricesRequest) (*ListCustomPricesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListCustomPrices not implemented") +} +func (UnimplementedModelPricingServiceServer) UpdateCustomPrice(context.Context, *UpdateCustomPriceRequest) (*UpdateCustomPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateCustomPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) DeleteCustomPrice(context.Context, *DeleteCustomPriceRequest) (*DeleteCustomPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteCustomPrice not implemented") +} +func (UnimplementedModelPricingServiceServer) GetEffectivePrice(context.Context, *GetEffectivePriceRequest) (*GetEffectivePriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEffectivePrice not implemented") +} +func (UnimplementedModelPricingServiceServer) ListPriceHistory(context.Context, *ListPriceHistoryRequest) (*ListPriceHistoryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPriceHistory not implemented") +} +func (UnimplementedModelPricingServiceServer) mustEmbedUnimplementedModelPricingServiceServer() {} +func (UnimplementedModelPricingServiceServer) testEmbeddedByValue() {} + +// UnsafeModelPricingServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ModelPricingServiceServer will +// result in compilation errors. +type UnsafeModelPricingServiceServer interface { + mustEmbedUnimplementedModelPricingServiceServer() +} + +func RegisterModelPricingServiceServer(s grpc.ServiceRegistrar, srv ModelPricingServiceServer) { + // If the following call pancis, it indicates UnimplementedModelPricingServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ModelPricingService_ServiceDesc, srv) +} + +func _ModelPricingService_CreateStandardPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateStandardPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).CreateStandardPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_CreateStandardPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).CreateStandardPrice(ctx, req.(*CreateStandardPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_GetStandardPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStandardPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).GetStandardPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_GetStandardPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).GetStandardPrice(ctx, req.(*GetStandardPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_ListStandardPrices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListStandardPricesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).ListStandardPrices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_ListStandardPrices_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).ListStandardPrices(ctx, req.(*ListStandardPricesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_UpdateStandardPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateStandardPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).UpdateStandardPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_UpdateStandardPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).UpdateStandardPrice(ctx, req.(*UpdateStandardPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_DeleteStandardPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteStandardPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).DeleteStandardPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_DeleteStandardPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).DeleteStandardPrice(ctx, req.(*DeleteStandardPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_CreateCustomPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateCustomPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).CreateCustomPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_CreateCustomPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).CreateCustomPrice(ctx, req.(*CreateCustomPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_GetCustomPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCustomPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).GetCustomPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_GetCustomPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).GetCustomPrice(ctx, req.(*GetCustomPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_ListCustomPrices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListCustomPricesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).ListCustomPrices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_ListCustomPrices_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).ListCustomPrices(ctx, req.(*ListCustomPricesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_UpdateCustomPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateCustomPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).UpdateCustomPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_UpdateCustomPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).UpdateCustomPrice(ctx, req.(*UpdateCustomPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_DeleteCustomPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteCustomPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).DeleteCustomPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_DeleteCustomPrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).DeleteCustomPrice(ctx, req.(*DeleteCustomPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_GetEffectivePrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEffectivePriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).GetEffectivePrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_GetEffectivePrice_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).GetEffectivePrice(ctx, req.(*GetEffectivePriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ModelPricingService_ListPriceHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPriceHistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ModelPricingServiceServer).ListPriceHistory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ModelPricingService_ListPriceHistory_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ModelPricingServiceServer).ListPriceHistory(ctx, req.(*ListPriceHistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ModelPricingService_ServiceDesc is the grpc.ServiceDesc for ModelPricingService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ModelPricingService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.ModelPricingService", + HandlerType: (*ModelPricingServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateStandardPrice", + Handler: _ModelPricingService_CreateStandardPrice_Handler, + }, + { + MethodName: "GetStandardPrice", + Handler: _ModelPricingService_GetStandardPrice_Handler, + }, + { + MethodName: "ListStandardPrices", + Handler: _ModelPricingService_ListStandardPrices_Handler, + }, + { + MethodName: "UpdateStandardPrice", + Handler: _ModelPricingService_UpdateStandardPrice_Handler, + }, + { + MethodName: "DeleteStandardPrice", + Handler: _ModelPricingService_DeleteStandardPrice_Handler, + }, + { + MethodName: "CreateCustomPrice", + Handler: _ModelPricingService_CreateCustomPrice_Handler, + }, + { + MethodName: "GetCustomPrice", + Handler: _ModelPricingService_GetCustomPrice_Handler, + }, + { + MethodName: "ListCustomPrices", + Handler: _ModelPricingService_ListCustomPrices_Handler, + }, + { + MethodName: "UpdateCustomPrice", + Handler: _ModelPricingService_UpdateCustomPrice_Handler, + }, + { + MethodName: "DeleteCustomPrice", + Handler: _ModelPricingService_DeleteCustomPrice_Handler, + }, + { + MethodName: "GetEffectivePrice", + Handler: _ModelPricingService_GetEffectivePrice_Handler, + }, + { + MethodName: "ListPriceHistory", + Handler: _ModelPricingService_ListPriceHistory_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/pricing.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.go new file mode 100644 index 0000000000..6bbb5057f9 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.go @@ -0,0 +1,1746 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/provider_config.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// ProviderConfigType defines the type of provider configuration. +type ProviderConfigType int32 + +const ( + ProviderConfigType_PROVIDER_CONFIG_TYPE_UNSPECIFIED ProviderConfigType = 0 + // Standard API key authentication (OpenAI, Anthropic, Mistral, Cohere, etc.) + ProviderConfigType_PROVIDER_CONFIG_TYPE_API_KEY ProviderConfigType = 1 + // AWS credentials (access key + secret key) + ProviderConfigType_PROVIDER_CONFIG_TYPE_AWS_CREDENTIALS ProviderConfigType = 2 + // AWS IAM role (for EC2/ECS/Lambda environments) + ProviderConfigType_PROVIDER_CONFIG_TYPE_AWS_IAM_ROLE ProviderConfigType = 3 + // GCP service account JSON + ProviderConfigType_PROVIDER_CONFIG_TYPE_GCP_SERVICE_ACCOUNT ProviderConfigType = 4 + // Azure OpenAI credentials + ProviderConfigType_PROVIDER_CONFIG_TYPE_AZURE_CREDENTIALS ProviderConfigType = 5 +) + +// Enum value maps for ProviderConfigType. +var ( + ProviderConfigType_name = map[int32]string{ + 0: "PROVIDER_CONFIG_TYPE_UNSPECIFIED", + 1: "PROVIDER_CONFIG_TYPE_API_KEY", + 2: "PROVIDER_CONFIG_TYPE_AWS_CREDENTIALS", + 3: "PROVIDER_CONFIG_TYPE_AWS_IAM_ROLE", + 4: "PROVIDER_CONFIG_TYPE_GCP_SERVICE_ACCOUNT", + 5: "PROVIDER_CONFIG_TYPE_AZURE_CREDENTIALS", + } + ProviderConfigType_value = map[string]int32{ + "PROVIDER_CONFIG_TYPE_UNSPECIFIED": 0, + "PROVIDER_CONFIG_TYPE_API_KEY": 1, + "PROVIDER_CONFIG_TYPE_AWS_CREDENTIALS": 2, + "PROVIDER_CONFIG_TYPE_AWS_IAM_ROLE": 3, + "PROVIDER_CONFIG_TYPE_GCP_SERVICE_ACCOUNT": 4, + "PROVIDER_CONFIG_TYPE_AZURE_CREDENTIALS": 5, + } +) + +func (x ProviderConfigType) Enum() *ProviderConfigType { + p := new(ProviderConfigType) + *p = x + return p +} + +func (x ProviderConfigType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProviderConfigType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_provider_config_proto_enumTypes[0].Descriptor() +} + +func (ProviderConfigType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_provider_config_proto_enumTypes[0] +} + +func (x ProviderConfigType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ProviderConfigType.Descriptor instead. +func (ProviderConfigType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{0} +} + +// ProviderConfig represents a configuration for authenticating with a model provider. +type ProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `providers/{provider_id}/configs/{config_id}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable label for this configuration (e.g., "Production", "Team A") + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + // Configuration type + ConfigType ProviderConfigType `protobuf:"varint,3,opt,name=config_type,json=configType,proto3,enum=redpanda.api.aigateway.v1.ProviderConfigType" json:"config_type,omitempty"` + // Provider-specific configuration (exactly one must be set based on config_type) + // + // Types that are valid to be assigned to Config: + // + // *ProviderConfig_ApiKeyConfig + // *ProviderConfig_AwsCredentialsConfig + // *ProviderConfig_AwsIamRoleConfig + // *ProviderConfig_GcpServiceAccountConfig + // *ProviderConfig_AzureCredentialsConfig + Config isProviderConfig_Config `protobuf_oneof:"config"` + // Whether this configuration is enabled + Enabled bool `protobuf:"varint,9,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Priority for load balancing (higher = preferred) + Priority int32 `protobuf:"varint,10,opt,name=priority,proto3" json:"priority,omitempty"` + // Output only. Last time this configuration was used + LastUsedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=last_used_at,json=lastUsedAt,proto3" json:"last_used_at,omitempty"` + // Output only. Number of times this configuration has been used + UseCount int64 `protobuf:"varint,12,opt,name=use_count,json=useCount,proto3" json:"use_count,omitempty"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator + Creator string `protobuf:"bytes,15,opt,name=creator,proto3" json:"creator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ProviderConfig) Reset() { + *x = ProviderConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProviderConfig) ProtoMessage() {} + +func (x *ProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProviderConfig.ProtoReflect.Descriptor instead. +func (*ProviderConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{0} +} + +func (x *ProviderConfig) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ProviderConfig) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *ProviderConfig) GetConfigType() ProviderConfigType { + if x != nil { + return x.ConfigType + } + return ProviderConfigType_PROVIDER_CONFIG_TYPE_UNSPECIFIED +} + +func (x *ProviderConfig) GetConfig() isProviderConfig_Config { + if x != nil { + return x.Config + } + return nil +} + +func (x *ProviderConfig) GetApiKeyConfig() *ApiKeyConfig { + if x != nil { + if x, ok := x.Config.(*ProviderConfig_ApiKeyConfig); ok { + return x.ApiKeyConfig + } + } + return nil +} + +func (x *ProviderConfig) GetAwsCredentialsConfig() *AwsCredentialsConfig { + if x != nil { + if x, ok := x.Config.(*ProviderConfig_AwsCredentialsConfig); ok { + return x.AwsCredentialsConfig + } + } + return nil +} + +func (x *ProviderConfig) GetAwsIamRoleConfig() *AwsIamRoleConfig { + if x != nil { + if x, ok := x.Config.(*ProviderConfig_AwsIamRoleConfig); ok { + return x.AwsIamRoleConfig + } + } + return nil +} + +func (x *ProviderConfig) GetGcpServiceAccountConfig() *GcpServiceAccountConfig { + if x != nil { + if x, ok := x.Config.(*ProviderConfig_GcpServiceAccountConfig); ok { + return x.GcpServiceAccountConfig + } + } + return nil +} + +func (x *ProviderConfig) GetAzureCredentialsConfig() *AzureCredentialsConfig { + if x != nil { + if x, ok := x.Config.(*ProviderConfig_AzureCredentialsConfig); ok { + return x.AzureCredentialsConfig + } + } + return nil +} + +func (x *ProviderConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ProviderConfig) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *ProviderConfig) GetLastUsedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastUsedAt + } + return nil +} + +func (x *ProviderConfig) GetUseCount() int64 { + if x != nil { + return x.UseCount + } + return 0 +} + +func (x *ProviderConfig) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *ProviderConfig) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *ProviderConfig) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +type isProviderConfig_Config interface { + isProviderConfig_Config() +} + +type ProviderConfig_ApiKeyConfig struct { + // API key configuration (for OpenAI, Anthropic, etc.) + ApiKeyConfig *ApiKeyConfig `protobuf:"bytes,4,opt,name=api_key_config,json=apiKeyConfig,proto3,oneof"` +} + +type ProviderConfig_AwsCredentialsConfig struct { + // AWS credentials configuration + AwsCredentialsConfig *AwsCredentialsConfig `protobuf:"bytes,5,opt,name=aws_credentials_config,json=awsCredentialsConfig,proto3,oneof"` +} + +type ProviderConfig_AwsIamRoleConfig struct { + // AWS IAM role configuration + AwsIamRoleConfig *AwsIamRoleConfig `protobuf:"bytes,6,opt,name=aws_iam_role_config,json=awsIamRoleConfig,proto3,oneof"` +} + +type ProviderConfig_GcpServiceAccountConfig struct { + // GCP service account configuration + GcpServiceAccountConfig *GcpServiceAccountConfig `protobuf:"bytes,7,opt,name=gcp_service_account_config,json=gcpServiceAccountConfig,proto3,oneof"` +} + +type ProviderConfig_AzureCredentialsConfig struct { + // Azure OpenAI credentials configuration + AzureCredentialsConfig *AzureCredentialsConfig `protobuf:"bytes,8,opt,name=azure_credentials_config,json=azureCredentialsConfig,proto3,oneof"` +} + +func (*ProviderConfig_ApiKeyConfig) isProviderConfig_Config() {} + +func (*ProviderConfig_AwsCredentialsConfig) isProviderConfig_Config() {} + +func (*ProviderConfig_AwsIamRoleConfig) isProviderConfig_Config() {} + +func (*ProviderConfig_GcpServiceAccountConfig) isProviderConfig_Config() {} + +func (*ProviderConfig_AzureCredentialsConfig) isProviderConfig_Config() {} + +// ApiKeyConfig for providers using API key authentication. +type ApiKeyConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The API key (input only - masked in responses) + ApiKey string `protobuf:"bytes,1,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + // Output only. Masked version of the API key (e.g., "sk-...xyz") + ApiKeyMasked string `protobuf:"bytes,2,opt,name=api_key_masked,json=apiKeyMasked,proto3" json:"api_key_masked,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ApiKeyConfig) Reset() { + *x = ApiKeyConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ApiKeyConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApiKeyConfig) ProtoMessage() {} + +func (x *ApiKeyConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApiKeyConfig.ProtoReflect.Descriptor instead. +func (*ApiKeyConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{1} +} + +func (x *ApiKeyConfig) GetApiKey() string { + if x != nil { + return x.ApiKey + } + return "" +} + +func (x *ApiKeyConfig) GetApiKeyMasked() string { + if x != nil { + return x.ApiKeyMasked + } + return "" +} + +// AwsCredentialsConfig for AWS Bedrock using access key/secret key. +type AwsCredentialsConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // AWS access key ID (input only - masked in responses) + AccessKeyId string `protobuf:"bytes,1,opt,name=access_key_id,json=accessKeyId,proto3" json:"access_key_id,omitempty"` + // AWS secret access key (input only - never returned) + SecretAccessKey string `protobuf:"bytes,2,opt,name=secret_access_key,json=secretAccessKey,proto3" json:"secret_access_key,omitempty"` + // AWS region (e.g., "us-east-1") + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + // Output only. Masked access key ID + AccessKeyIdMasked string `protobuf:"bytes,4,opt,name=access_key_id_masked,json=accessKeyIdMasked,proto3" json:"access_key_id_masked,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AwsCredentialsConfig) Reset() { + *x = AwsCredentialsConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AwsCredentialsConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AwsCredentialsConfig) ProtoMessage() {} + +func (x *AwsCredentialsConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AwsCredentialsConfig.ProtoReflect.Descriptor instead. +func (*AwsCredentialsConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{2} +} + +func (x *AwsCredentialsConfig) GetAccessKeyId() string { + if x != nil { + return x.AccessKeyId + } + return "" +} + +func (x *AwsCredentialsConfig) GetSecretAccessKey() string { + if x != nil { + return x.SecretAccessKey + } + return "" +} + +func (x *AwsCredentialsConfig) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *AwsCredentialsConfig) GetAccessKeyIdMasked() string { + if x != nil { + return x.AccessKeyIdMasked + } + return "" +} + +// AwsIamRoleConfig for AWS Bedrock using IAM role assumption. +type AwsIamRoleConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // IAM role ARN to assume + RoleArn string `protobuf:"bytes,1,opt,name=role_arn,json=roleArn,proto3" json:"role_arn,omitempty"` + // AWS region (e.g., "us-east-1") + Region string `protobuf:"bytes,2,opt,name=region,proto3" json:"region,omitempty"` + // Optional external ID for cross-account access + ExternalId string `protobuf:"bytes,3,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AwsIamRoleConfig) Reset() { + *x = AwsIamRoleConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AwsIamRoleConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AwsIamRoleConfig) ProtoMessage() {} + +func (x *AwsIamRoleConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AwsIamRoleConfig.ProtoReflect.Descriptor instead. +func (*AwsIamRoleConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{3} +} + +func (x *AwsIamRoleConfig) GetRoleArn() string { + if x != nil { + return x.RoleArn + } + return "" +} + +func (x *AwsIamRoleConfig) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *AwsIamRoleConfig) GetExternalId() string { + if x != nil { + return x.ExternalId + } + return "" +} + +// GcpServiceAccountConfig for Google Vertex AI. +type GcpServiceAccountConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Service account JSON key (input only - never returned) + ServiceAccountJson string `protobuf:"bytes,1,opt,name=service_account_json,json=serviceAccountJson,proto3" json:"service_account_json,omitempty"` + // GCP project ID + ProjectId string `protobuf:"bytes,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + // GCP region (e.g., "us-central1") + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + // Output only. Service account email (extracted from JSON) + ServiceAccountEmail string `protobuf:"bytes,4,opt,name=service_account_email,json=serviceAccountEmail,proto3" json:"service_account_email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GcpServiceAccountConfig) Reset() { + *x = GcpServiceAccountConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GcpServiceAccountConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GcpServiceAccountConfig) ProtoMessage() {} + +func (x *GcpServiceAccountConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GcpServiceAccountConfig.ProtoReflect.Descriptor instead. +func (*GcpServiceAccountConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{4} +} + +func (x *GcpServiceAccountConfig) GetServiceAccountJson() string { + if x != nil { + return x.ServiceAccountJson + } + return "" +} + +func (x *GcpServiceAccountConfig) GetProjectId() string { + if x != nil { + return x.ProjectId + } + return "" +} + +func (x *GcpServiceAccountConfig) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *GcpServiceAccountConfig) GetServiceAccountEmail() string { + if x != nil { + return x.ServiceAccountEmail + } + return "" +} + +// AzureCredentialsConfig for Azure OpenAI Service. +type AzureCredentialsConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Azure OpenAI API key (input only - masked in responses) + ApiKey string `protobuf:"bytes,1,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + // Azure resource name + ResourceName string `protobuf:"bytes,2,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + // Azure deployment name (optional, can be specified per-request) + DeploymentName string `protobuf:"bytes,3,opt,name=deployment_name,json=deploymentName,proto3" json:"deployment_name,omitempty"` + // API version (e.g., "2024-02-01") + ApiVersion string `protobuf:"bytes,4,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` + // Output only. Masked API key + ApiKeyMasked string `protobuf:"bytes,5,opt,name=api_key_masked,json=apiKeyMasked,proto3" json:"api_key_masked,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AzureCredentialsConfig) Reset() { + *x = AzureCredentialsConfig{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureCredentialsConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureCredentialsConfig) ProtoMessage() {} + +func (x *AzureCredentialsConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureCredentialsConfig.ProtoReflect.Descriptor instead. +func (*AzureCredentialsConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{5} +} + +func (x *AzureCredentialsConfig) GetApiKey() string { + if x != nil { + return x.ApiKey + } + return "" +} + +func (x *AzureCredentialsConfig) GetResourceName() string { + if x != nil { + return x.ResourceName + } + return "" +} + +func (x *AzureCredentialsConfig) GetDeploymentName() string { + if x != nil { + return x.DeploymentName + } + return "" +} + +func (x *AzureCredentialsConfig) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +func (x *AzureCredentialsConfig) GetApiKeyMasked() string { + if x != nil { + return x.ApiKeyMasked + } + return "" +} + +// Request message for CreateProviderConfig RPC. +type CreateProviderConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Parent resource name. Format: `providers/{provider_id}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The configuration to create. + Config *ProviderConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + // Optional config ID. If empty, server generates one. + ConfigId string `protobuf:"bytes,3,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateProviderConfigRequest) Reset() { + *x = CreateProviderConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateProviderConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateProviderConfigRequest) ProtoMessage() {} + +func (x *CreateProviderConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateProviderConfigRequest.ProtoReflect.Descriptor instead. +func (*CreateProviderConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{6} +} + +func (x *CreateProviderConfigRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateProviderConfigRequest) GetConfig() *ProviderConfig { + if x != nil { + return x.Config + } + return nil +} + +func (x *CreateProviderConfigRequest) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +// Response message for CreateProviderConfig RPC. +type CreateProviderConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Config *ProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateProviderConfigResponse) Reset() { + *x = CreateProviderConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateProviderConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateProviderConfigResponse) ProtoMessage() {} + +func (x *CreateProviderConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateProviderConfigResponse.ProtoReflect.Descriptor instead. +func (*CreateProviderConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{7} +} + +func (x *CreateProviderConfigResponse) GetConfig() *ProviderConfig { + if x != nil { + return x.Config + } + return nil +} + +// Request message for GetProviderConfig RPC. +type GetProviderConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the configuration. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProviderConfigRequest) Reset() { + *x = GetProviderConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProviderConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProviderConfigRequest) ProtoMessage() {} + +func (x *GetProviderConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProviderConfigRequest.ProtoReflect.Descriptor instead. +func (*GetProviderConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{8} +} + +func (x *GetProviderConfigRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetProviderConfig RPC. +type GetProviderConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Config *ProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProviderConfigResponse) Reset() { + *x = GetProviderConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProviderConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProviderConfigResponse) ProtoMessage() {} + +func (x *GetProviderConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProviderConfigResponse.ProtoReflect.Descriptor instead. +func (*GetProviderConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{9} +} + +func (x *GetProviderConfigResponse) GetConfig() *ProviderConfig { + if x != nil { + return x.Config + } + return nil +} + +// Request message for ListProviderConfigs RPC. +type ListProviderConfigsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Parent resource name. Format: `providers/{provider_id}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of configs to return (max 100) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by enabled status + FilterEnabled bool `protobuf:"varint,4,opt,name=filter_enabled,json=filterEnabled,proto3" json:"filter_enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListProviderConfigsRequest) Reset() { + *x = ListProviderConfigsRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListProviderConfigsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListProviderConfigsRequest) ProtoMessage() {} + +func (x *ListProviderConfigsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListProviderConfigsRequest.ProtoReflect.Descriptor instead. +func (*ListProviderConfigsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{10} +} + +func (x *ListProviderConfigsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListProviderConfigsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListProviderConfigsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListProviderConfigsRequest) GetFilterEnabled() bool { + if x != nil { + return x.FilterEnabled + } + return false +} + +// Response message for ListProviderConfigs RPC. +type ListProviderConfigsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of configurations (sensitive fields masked) + Configs []*ProviderConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListProviderConfigsResponse) Reset() { + *x = ListProviderConfigsResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListProviderConfigsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListProviderConfigsResponse) ProtoMessage() {} + +func (x *ListProviderConfigsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListProviderConfigsResponse.ProtoReflect.Descriptor instead. +func (*ListProviderConfigsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{11} +} + +func (x *ListProviderConfigsResponse) GetConfigs() []*ProviderConfig { + if x != nil { + return x.Configs + } + return nil +} + +func (x *ListProviderConfigsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListProviderConfigsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateProviderConfig RPC. +type UpdateProviderConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The configuration to update. + Config *ProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + // The fields to update. + // Allowed fields: label, enabled, priority, and config-specific fields + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateProviderConfigRequest) Reset() { + *x = UpdateProviderConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateProviderConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateProviderConfigRequest) ProtoMessage() {} + +func (x *UpdateProviderConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateProviderConfigRequest.ProtoReflect.Descriptor instead. +func (*UpdateProviderConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateProviderConfigRequest) GetConfig() *ProviderConfig { + if x != nil { + return x.Config + } + return nil +} + +func (x *UpdateProviderConfigRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateProviderConfig RPC. +type UpdateProviderConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Config *ProviderConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateProviderConfigResponse) Reset() { + *x = UpdateProviderConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateProviderConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateProviderConfigResponse) ProtoMessage() {} + +func (x *UpdateProviderConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateProviderConfigResponse.ProtoReflect.Descriptor instead. +func (*UpdateProviderConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{13} +} + +func (x *UpdateProviderConfigResponse) GetConfig() *ProviderConfig { + if x != nil { + return x.Config + } + return nil +} + +// Request message for DeleteProviderConfig RPC. +type DeleteProviderConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the configuration to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteProviderConfigRequest) Reset() { + *x = DeleteProviderConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteProviderConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteProviderConfigRequest) ProtoMessage() {} + +func (x *DeleteProviderConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteProviderConfigRequest.ProtoReflect.Descriptor instead. +func (*DeleteProviderConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{14} +} + +func (x *DeleteProviderConfigRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for DeleteProviderConfig RPC. +type DeleteProviderConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteProviderConfigResponse) Reset() { + *x = DeleteProviderConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteProviderConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteProviderConfigResponse) ProtoMessage() {} + +func (x *DeleteProviderConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteProviderConfigResponse.ProtoReflect.Descriptor instead. +func (*DeleteProviderConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{15} +} + +// Request message for TestProviderConfig RPC. +type TestProviderConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the configuration to test. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestProviderConfigRequest) Reset() { + *x = TestProviderConfigRequest{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestProviderConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestProviderConfigRequest) ProtoMessage() {} + +func (x *TestProviderConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestProviderConfigRequest.ProtoReflect.Descriptor instead. +func (*TestProviderConfigRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{16} +} + +func (x *TestProviderConfigRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for TestProviderConfig RPC. +type TestProviderConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether the test was successful + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + // Error message if the test failed + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + // Response time in milliseconds + ResponseTimeMs int64 `protobuf:"varint,3,opt,name=response_time_ms,json=responseTimeMs,proto3" json:"response_time_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestProviderConfigResponse) Reset() { + *x = TestProviderConfigResponse{} + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestProviderConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestProviderConfigResponse) ProtoMessage() {} + +func (x *TestProviderConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestProviderConfigResponse.ProtoReflect.Descriptor instead. +func (*TestProviderConfigResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP(), []int{17} +} + +func (x *TestProviderConfigResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *TestProviderConfigResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +func (x *TestProviderConfigResponse) GetResponseTimeMs() int64 { + if x != nil { + return x.ResponseTimeMs + } + return 0 +} + +var File_redpanda_api_aigateway_v1_provider_config_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_provider_config_proto_rawDesc = []byte{ + 0x0a, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, + 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xb8, 0x08, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x53, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x67, 0x0a, 0x16, 0x61, 0x77, 0x73, 0x5f, 0x63, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x77, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x14, 0x61, 0x77, 0x73, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x5c, 0x0a, 0x13, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x77, 0x73, 0x49, 0x61, 0x6d, 0x52, + 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x61, 0x77, 0x73, + 0x49, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x71, 0x0a, + 0x1a, 0x67, 0x63, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x63, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x17, 0x67, 0x63, 0x70, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x6d, 0x0a, 0x18, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x16, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x6c, 0x61, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x51, 0xea, + 0x41, 0x4e, 0x0a, 0x25, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7d, + 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x57, 0x0a, 0x0c, 0x41, 0x70, + 0x69, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x70, + 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, + 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x0e, 0x61, 0x70, 0x69, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x73, + 0x6b, 0x65, 0x64, 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x41, 0x77, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0d, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, + 0x79, 0x49, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x22, 0x75, 0x0a, 0x10, 0x41, 0x77, 0x73, + 0x49, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x72, 0x6e, 0x12, 0x1b, 0x0a, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, + 0x22, 0xca, 0x01, 0x0a, 0x17, 0x47, 0x63, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x14, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, + 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4a, + 0x73, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xdf, 0x01, + 0x0a, 0x16, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x06, + 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, + 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x0e, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x6d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x22, + 0xcd, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x44, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x22, + 0x61, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x41, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x5d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x5e, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0xdd, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x44, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x01, 0xba, 0x48, + 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x43, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01, + 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x61, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x60, 0x0a, 0x1b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, + 0x25, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1e, 0x0a, 0x1c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x19, + 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, + 0x25, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x85, 0x01, 0x0a, + 0x1a, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x73, 0x2a, 0x87, 0x02, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, + 0x59, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, + 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x02, 0x12, 0x25, 0x0a, + 0x21, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x49, 0x41, 0x4d, 0x5f, 0x52, 0x4f, + 0x4c, 0x45, 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, + 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, + 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x10, 0x04, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, + 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x05, 0x32, 0xf7, + 0x08, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, + 0xae, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x12, 0xc0, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x31, 0x3a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x27, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x2f, 0x2a, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb3, 0x01, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x19, 0xca, + 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x88, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, + 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, + 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, + 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_provider_config_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_provider_config_proto_rawDescData = file_redpanda_api_aigateway_v1_provider_config_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_provider_config_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_provider_config_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_provider_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_provider_config_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_provider_config_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_provider_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_redpanda_api_aigateway_v1_provider_config_proto_goTypes = []any{ + (ProviderConfigType)(0), // 0: redpanda.api.aigateway.v1.ProviderConfigType + (*ProviderConfig)(nil), // 1: redpanda.api.aigateway.v1.ProviderConfig + (*ApiKeyConfig)(nil), // 2: redpanda.api.aigateway.v1.ApiKeyConfig + (*AwsCredentialsConfig)(nil), // 3: redpanda.api.aigateway.v1.AwsCredentialsConfig + (*AwsIamRoleConfig)(nil), // 4: redpanda.api.aigateway.v1.AwsIamRoleConfig + (*GcpServiceAccountConfig)(nil), // 5: redpanda.api.aigateway.v1.GcpServiceAccountConfig + (*AzureCredentialsConfig)(nil), // 6: redpanda.api.aigateway.v1.AzureCredentialsConfig + (*CreateProviderConfigRequest)(nil), // 7: redpanda.api.aigateway.v1.CreateProviderConfigRequest + (*CreateProviderConfigResponse)(nil), // 8: redpanda.api.aigateway.v1.CreateProviderConfigResponse + (*GetProviderConfigRequest)(nil), // 9: redpanda.api.aigateway.v1.GetProviderConfigRequest + (*GetProviderConfigResponse)(nil), // 10: redpanda.api.aigateway.v1.GetProviderConfigResponse + (*ListProviderConfigsRequest)(nil), // 11: redpanda.api.aigateway.v1.ListProviderConfigsRequest + (*ListProviderConfigsResponse)(nil), // 12: redpanda.api.aigateway.v1.ListProviderConfigsResponse + (*UpdateProviderConfigRequest)(nil), // 13: redpanda.api.aigateway.v1.UpdateProviderConfigRequest + (*UpdateProviderConfigResponse)(nil), // 14: redpanda.api.aigateway.v1.UpdateProviderConfigResponse + (*DeleteProviderConfigRequest)(nil), // 15: redpanda.api.aigateway.v1.DeleteProviderConfigRequest + (*DeleteProviderConfigResponse)(nil), // 16: redpanda.api.aigateway.v1.DeleteProviderConfigResponse + (*TestProviderConfigRequest)(nil), // 17: redpanda.api.aigateway.v1.TestProviderConfigRequest + (*TestProviderConfigResponse)(nil), // 18: redpanda.api.aigateway.v1.TestProviderConfigResponse + (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 20: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_provider_config_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.ProviderConfig.config_type:type_name -> redpanda.api.aigateway.v1.ProviderConfigType + 2, // 1: redpanda.api.aigateway.v1.ProviderConfig.api_key_config:type_name -> redpanda.api.aigateway.v1.ApiKeyConfig + 3, // 2: redpanda.api.aigateway.v1.ProviderConfig.aws_credentials_config:type_name -> redpanda.api.aigateway.v1.AwsCredentialsConfig + 4, // 3: redpanda.api.aigateway.v1.ProviderConfig.aws_iam_role_config:type_name -> redpanda.api.aigateway.v1.AwsIamRoleConfig + 5, // 4: redpanda.api.aigateway.v1.ProviderConfig.gcp_service_account_config:type_name -> redpanda.api.aigateway.v1.GcpServiceAccountConfig + 6, // 5: redpanda.api.aigateway.v1.ProviderConfig.azure_credentials_config:type_name -> redpanda.api.aigateway.v1.AzureCredentialsConfig + 19, // 6: redpanda.api.aigateway.v1.ProviderConfig.last_used_at:type_name -> google.protobuf.Timestamp + 19, // 7: redpanda.api.aigateway.v1.ProviderConfig.create_time:type_name -> google.protobuf.Timestamp + 19, // 8: redpanda.api.aigateway.v1.ProviderConfig.update_time:type_name -> google.protobuf.Timestamp + 1, // 9: redpanda.api.aigateway.v1.CreateProviderConfigRequest.config:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 1, // 10: redpanda.api.aigateway.v1.CreateProviderConfigResponse.config:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 1, // 11: redpanda.api.aigateway.v1.GetProviderConfigResponse.config:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 1, // 12: redpanda.api.aigateway.v1.ListProviderConfigsResponse.configs:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 1, // 13: redpanda.api.aigateway.v1.UpdateProviderConfigRequest.config:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 20, // 14: redpanda.api.aigateway.v1.UpdateProviderConfigRequest.update_mask:type_name -> google.protobuf.FieldMask + 1, // 15: redpanda.api.aigateway.v1.UpdateProviderConfigResponse.config:type_name -> redpanda.api.aigateway.v1.ProviderConfig + 7, // 16: redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig:input_type -> redpanda.api.aigateway.v1.CreateProviderConfigRequest + 9, // 17: redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig:input_type -> redpanda.api.aigateway.v1.GetProviderConfigRequest + 11, // 18: redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs:input_type -> redpanda.api.aigateway.v1.ListProviderConfigsRequest + 13, // 19: redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig:input_type -> redpanda.api.aigateway.v1.UpdateProviderConfigRequest + 15, // 20: redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig:input_type -> redpanda.api.aigateway.v1.DeleteProviderConfigRequest + 17, // 21: redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig:input_type -> redpanda.api.aigateway.v1.TestProviderConfigRequest + 8, // 22: redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig:output_type -> redpanda.api.aigateway.v1.CreateProviderConfigResponse + 10, // 23: redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig:output_type -> redpanda.api.aigateway.v1.GetProviderConfigResponse + 12, // 24: redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs:output_type -> redpanda.api.aigateway.v1.ListProviderConfigsResponse + 14, // 25: redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig:output_type -> redpanda.api.aigateway.v1.UpdateProviderConfigResponse + 16, // 26: redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig:output_type -> redpanda.api.aigateway.v1.DeleteProviderConfigResponse + 18, // 27: redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig:output_type -> redpanda.api.aigateway.v1.TestProviderConfigResponse + 22, // [22:28] is the sub-list for method output_type + 16, // [16:22] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_provider_config_proto_init() } +func file_redpanda_api_aigateway_v1_provider_config_proto_init() { + if File_redpanda_api_aigateway_v1_provider_config_proto != nil { + return + } + file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes[0].OneofWrappers = []any{ + (*ProviderConfig_ApiKeyConfig)(nil), + (*ProviderConfig_AwsCredentialsConfig)(nil), + (*ProviderConfig_AwsIamRoleConfig)(nil), + (*ProviderConfig_GcpServiceAccountConfig)(nil), + (*ProviderConfig_AzureCredentialsConfig)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_provider_config_proto_rawDesc, + NumEnums: 1, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_provider_config_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_provider_config_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_provider_config_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_provider_config_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_provider_config_proto = out.File + file_redpanda_api_aigateway_v1_provider_config_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_provider_config_proto_goTypes = nil + file_redpanda_api_aigateway_v1_provider_config_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.gw.go new file mode 100644 index 0000000000..8c95127a9e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config.pb.gw.go @@ -0,0 +1,641 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/provider_config.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_ProviderConfigService_CreateProviderConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"config": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_ProviderConfigService_CreateProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Config); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_CreateProviderConfig_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateProviderConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_CreateProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Config); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_CreateProviderConfig_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateProviderConfig(ctx, &protoReq) + return msg, metadata, err +} + +func request_ProviderConfigService_GetProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetProviderConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_GetProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetProviderConfig(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ProviderConfigService_ListProviderConfigs_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_ProviderConfigService_ListProviderConfigs_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListProviderConfigsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_ListProviderConfigs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListProviderConfigs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_ListProviderConfigs_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListProviderConfigsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_ListProviderConfigs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListProviderConfigs(ctx, &protoReq) + return msg, metadata, err +} + +var filter_ProviderConfigService_UpdateProviderConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"config": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_ProviderConfigService_UpdateProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Config); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Config); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["config.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "config.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "config.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "config.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_UpdateProviderConfig_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateProviderConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_UpdateProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Config); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Config); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["config.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "config.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "config.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "config.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProviderConfigService_UpdateProviderConfig_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateProviderConfig(ctx, &protoReq) + return msg, metadata, err +} + +func request_ProviderConfigService_DeleteProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteProviderConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_DeleteProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteProviderConfig(ctx, &protoReq) + return msg, metadata, err +} + +func request_ProviderConfigService_TestProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ProviderConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq TestProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.TestProviderConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ProviderConfigService_TestProviderConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ProviderConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq TestProviderConfigRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.TestProviderConfig(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterProviderConfigServiceHandlerServer registers the http handlers for service ProviderConfigService to "mux". +// UnaryRPC :call ProviderConfigServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterProviderConfigServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterProviderConfigServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ProviderConfigServiceServer) error { + mux.Handle(http.MethodPost, pattern_ProviderConfigService_CreateProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/CreateProviderConfig", runtime.WithHTTPPathPattern("/v1/{parent=providers/*}/configs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_CreateProviderConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_CreateProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProviderConfigService_GetProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/GetProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_GetProviderConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_GetProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProviderConfigService_ListProviderConfigs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/ListProviderConfigs", runtime.WithHTTPPathPattern("/v1/{parent=providers/*}/configs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_ListProviderConfigs_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_ListProviderConfigs_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ProviderConfigService_UpdateProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/UpdateProviderConfig", runtime.WithHTTPPathPattern("/v1/{config.name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_UpdateProviderConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_UpdateProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ProviderConfigService_DeleteProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/DeleteProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_DeleteProviderConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_DeleteProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ProviderConfigService_TestProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/TestProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}:test")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProviderConfigService_TestProviderConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_TestProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterProviderConfigServiceHandlerFromEndpoint is same as RegisterProviderConfigServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterProviderConfigServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterProviderConfigServiceHandler(ctx, mux, conn) +} + +// RegisterProviderConfigServiceHandler registers the http handlers for service ProviderConfigService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterProviderConfigServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterProviderConfigServiceHandlerClient(ctx, mux, NewProviderConfigServiceClient(conn)) +} + +// RegisterProviderConfigServiceHandlerClient registers the http handlers for service ProviderConfigService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ProviderConfigServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ProviderConfigServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ProviderConfigServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterProviderConfigServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ProviderConfigServiceClient) error { + mux.Handle(http.MethodPost, pattern_ProviderConfigService_CreateProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/CreateProviderConfig", runtime.WithHTTPPathPattern("/v1/{parent=providers/*}/configs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_CreateProviderConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_CreateProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProviderConfigService_GetProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/GetProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_GetProviderConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_GetProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProviderConfigService_ListProviderConfigs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/ListProviderConfigs", runtime.WithHTTPPathPattern("/v1/{parent=providers/*}/configs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_ListProviderConfigs_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_ListProviderConfigs_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ProviderConfigService_UpdateProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/UpdateProviderConfig", runtime.WithHTTPPathPattern("/v1/{config.name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_UpdateProviderConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_UpdateProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ProviderConfigService_DeleteProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/DeleteProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_DeleteProviderConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_DeleteProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_ProviderConfigService_TestProviderConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.ProviderConfigService/TestProviderConfig", runtime.WithHTTPPathPattern("/v1/{name=providers/*/configs/*}:test")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProviderConfigService_TestProviderConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProviderConfigService_TestProviderConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ProviderConfigService_CreateProviderConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "providers", "parent", "configs"}, "")) + pattern_ProviderConfigService_GetProviderConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "providers", "configs", "name"}, "")) + pattern_ProviderConfigService_ListProviderConfigs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "providers", "parent", "configs"}, "")) + pattern_ProviderConfigService_UpdateProviderConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "providers", "configs", "config.name"}, "")) + pattern_ProviderConfigService_DeleteProviderConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "providers", "configs", "name"}, "")) + pattern_ProviderConfigService_TestProviderConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "providers", "configs", "name"}, "test")) +) + +var ( + forward_ProviderConfigService_CreateProviderConfig_0 = runtime.ForwardResponseMessage + forward_ProviderConfigService_GetProviderConfig_0 = runtime.ForwardResponseMessage + forward_ProviderConfigService_ListProviderConfigs_0 = runtime.ForwardResponseMessage + forward_ProviderConfigService_UpdateProviderConfig_0 = runtime.ForwardResponseMessage + forward_ProviderConfigService_DeleteProviderConfig_0 = runtime.ForwardResponseMessage + forward_ProviderConfigService_TestProviderConfig_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config_grpc.pb.go new file mode 100644 index 0000000000..3657ae267e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/provider_config_grpc.pb.go @@ -0,0 +1,336 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/provider_config.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ProviderConfigService_CreateProviderConfig_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/CreateProviderConfig" + ProviderConfigService_GetProviderConfig_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/GetProviderConfig" + ProviderConfigService_ListProviderConfigs_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/ListProviderConfigs" + ProviderConfigService_UpdateProviderConfig_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/UpdateProviderConfig" + ProviderConfigService_DeleteProviderConfig_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/DeleteProviderConfig" + ProviderConfigService_TestProviderConfig_FullMethodName = "/redpanda.api.aigateway.v1.ProviderConfigService/TestProviderConfig" +) + +// ProviderConfigServiceClient is the client API for ProviderConfigService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ProviderConfigService manages encrypted configurations for model providers. +// Supports different auth types: API keys, AWS credentials, GCP service accounts, etc. +// Resource name: providers/{provider_id}/configs/{config_id} +type ProviderConfigServiceClient interface { + // Creates a new provider configuration. + // The configuration is encrypted at rest using the control plane encryption key. + CreateProviderConfig(ctx context.Context, in *CreateProviderConfigRequest, opts ...grpc.CallOption) (*CreateProviderConfigResponse, error) + // Gets a provider configuration by name. + // Note: Sensitive fields are masked in the response. + GetProviderConfig(ctx context.Context, in *GetProviderConfigRequest, opts ...grpc.CallOption) (*GetProviderConfigResponse, error) + // Lists provider configurations. + ListProviderConfigs(ctx context.Context, in *ListProviderConfigsRequest, opts ...grpc.CallOption) (*ListProviderConfigsResponse, error) + // Updates a provider configuration. + UpdateProviderConfig(ctx context.Context, in *UpdateProviderConfigRequest, opts ...grpc.CallOption) (*UpdateProviderConfigResponse, error) + // Deletes a provider configuration. + DeleteProviderConfig(ctx context.Context, in *DeleteProviderConfigRequest, opts ...grpc.CallOption) (*DeleteProviderConfigResponse, error) + // Tests a provider configuration by attempting to authenticate with the provider. + TestProviderConfig(ctx context.Context, in *TestProviderConfigRequest, opts ...grpc.CallOption) (*TestProviderConfigResponse, error) +} + +type providerConfigServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewProviderConfigServiceClient(cc grpc.ClientConnInterface) ProviderConfigServiceClient { + return &providerConfigServiceClient{cc} +} + +func (c *providerConfigServiceClient) CreateProviderConfig(ctx context.Context, in *CreateProviderConfigRequest, opts ...grpc.CallOption) (*CreateProviderConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateProviderConfigResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_CreateProviderConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *providerConfigServiceClient) GetProviderConfig(ctx context.Context, in *GetProviderConfigRequest, opts ...grpc.CallOption) (*GetProviderConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetProviderConfigResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_GetProviderConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *providerConfigServiceClient) ListProviderConfigs(ctx context.Context, in *ListProviderConfigsRequest, opts ...grpc.CallOption) (*ListProviderConfigsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListProviderConfigsResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_ListProviderConfigs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *providerConfigServiceClient) UpdateProviderConfig(ctx context.Context, in *UpdateProviderConfigRequest, opts ...grpc.CallOption) (*UpdateProviderConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateProviderConfigResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_UpdateProviderConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *providerConfigServiceClient) DeleteProviderConfig(ctx context.Context, in *DeleteProviderConfigRequest, opts ...grpc.CallOption) (*DeleteProviderConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteProviderConfigResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_DeleteProviderConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *providerConfigServiceClient) TestProviderConfig(ctx context.Context, in *TestProviderConfigRequest, opts ...grpc.CallOption) (*TestProviderConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(TestProviderConfigResponse) + err := c.cc.Invoke(ctx, ProviderConfigService_TestProviderConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ProviderConfigServiceServer is the server API for ProviderConfigService service. +// All implementations must embed UnimplementedProviderConfigServiceServer +// for forward compatibility. +// +// ProviderConfigService manages encrypted configurations for model providers. +// Supports different auth types: API keys, AWS credentials, GCP service accounts, etc. +// Resource name: providers/{provider_id}/configs/{config_id} +type ProviderConfigServiceServer interface { + // Creates a new provider configuration. + // The configuration is encrypted at rest using the control plane encryption key. + CreateProviderConfig(context.Context, *CreateProviderConfigRequest) (*CreateProviderConfigResponse, error) + // Gets a provider configuration by name. + // Note: Sensitive fields are masked in the response. + GetProviderConfig(context.Context, *GetProviderConfigRequest) (*GetProviderConfigResponse, error) + // Lists provider configurations. + ListProviderConfigs(context.Context, *ListProviderConfigsRequest) (*ListProviderConfigsResponse, error) + // Updates a provider configuration. + UpdateProviderConfig(context.Context, *UpdateProviderConfigRequest) (*UpdateProviderConfigResponse, error) + // Deletes a provider configuration. + DeleteProviderConfig(context.Context, *DeleteProviderConfigRequest) (*DeleteProviderConfigResponse, error) + // Tests a provider configuration by attempting to authenticate with the provider. + TestProviderConfig(context.Context, *TestProviderConfigRequest) (*TestProviderConfigResponse, error) + mustEmbedUnimplementedProviderConfigServiceServer() +} + +// UnimplementedProviderConfigServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedProviderConfigServiceServer struct{} + +func (UnimplementedProviderConfigServiceServer) CreateProviderConfig(context.Context, *CreateProviderConfigRequest) (*CreateProviderConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateProviderConfig not implemented") +} +func (UnimplementedProviderConfigServiceServer) GetProviderConfig(context.Context, *GetProviderConfigRequest) (*GetProviderConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetProviderConfig not implemented") +} +func (UnimplementedProviderConfigServiceServer) ListProviderConfigs(context.Context, *ListProviderConfigsRequest) (*ListProviderConfigsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListProviderConfigs not implemented") +} +func (UnimplementedProviderConfigServiceServer) UpdateProviderConfig(context.Context, *UpdateProviderConfigRequest) (*UpdateProviderConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateProviderConfig not implemented") +} +func (UnimplementedProviderConfigServiceServer) DeleteProviderConfig(context.Context, *DeleteProviderConfigRequest) (*DeleteProviderConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteProviderConfig not implemented") +} +func (UnimplementedProviderConfigServiceServer) TestProviderConfig(context.Context, *TestProviderConfigRequest) (*TestProviderConfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TestProviderConfig not implemented") +} +func (UnimplementedProviderConfigServiceServer) mustEmbedUnimplementedProviderConfigServiceServer() {} +func (UnimplementedProviderConfigServiceServer) testEmbeddedByValue() {} + +// UnsafeProviderConfigServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ProviderConfigServiceServer will +// result in compilation errors. +type UnsafeProviderConfigServiceServer interface { + mustEmbedUnimplementedProviderConfigServiceServer() +} + +func RegisterProviderConfigServiceServer(s grpc.ServiceRegistrar, srv ProviderConfigServiceServer) { + // If the following call pancis, it indicates UnimplementedProviderConfigServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ProviderConfigService_ServiceDesc, srv) +} + +func _ProviderConfigService_CreateProviderConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateProviderConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).CreateProviderConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_CreateProviderConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).CreateProviderConfig(ctx, req.(*CreateProviderConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProviderConfigService_GetProviderConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetProviderConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).GetProviderConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_GetProviderConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).GetProviderConfig(ctx, req.(*GetProviderConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProviderConfigService_ListProviderConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListProviderConfigsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).ListProviderConfigs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_ListProviderConfigs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).ListProviderConfigs(ctx, req.(*ListProviderConfigsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProviderConfigService_UpdateProviderConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateProviderConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).UpdateProviderConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_UpdateProviderConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).UpdateProviderConfig(ctx, req.(*UpdateProviderConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProviderConfigService_DeleteProviderConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteProviderConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).DeleteProviderConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_DeleteProviderConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).DeleteProviderConfig(ctx, req.(*DeleteProviderConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ProviderConfigService_TestProviderConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TestProviderConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProviderConfigServiceServer).TestProviderConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProviderConfigService_TestProviderConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProviderConfigServiceServer).TestProviderConfig(ctx, req.(*TestProviderConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ProviderConfigService_ServiceDesc is the grpc.ServiceDesc for ProviderConfigService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ProviderConfigService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.ProviderConfigService", + HandlerType: (*ProviderConfigServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateProviderConfig", + Handler: _ProviderConfigService_CreateProviderConfig_Handler, + }, + { + MethodName: "GetProviderConfig", + Handler: _ProviderConfigService_GetProviderConfig_Handler, + }, + { + MethodName: "ListProviderConfigs", + Handler: _ProviderConfigService_ListProviderConfigs_Handler, + }, + { + MethodName: "UpdateProviderConfig", + Handler: _ProviderConfigService_UpdateProviderConfig_Handler, + }, + { + MethodName: "DeleteProviderConfig", + Handler: _ProviderConfigService_DeleteProviderConfig_Handler, + }, + { + MethodName: "TestProviderConfig", + Handler: _ProviderConfigService_TestProviderConfig_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/provider_config.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.go new file mode 100644 index 0000000000..bd42bed4ba --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.go @@ -0,0 +1,984 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/ratelimit.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Response message for CreateRateLimit RPC. +type CreateRateLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RateLimit *RateLimit `protobuf:"bytes,1,opt,name=rate_limit,json=rateLimit,proto3" json:"rate_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRateLimitResponse) Reset() { + *x = CreateRateLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRateLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRateLimitResponse) ProtoMessage() {} + +func (x *CreateRateLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRateLimitResponse.ProtoReflect.Descriptor instead. +func (*CreateRateLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateRateLimitResponse) GetRateLimit() *RateLimit { + if x != nil { + return x.RateLimit + } + return nil +} + +// Response message for GetRateLimit RPC. +type GetRateLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RateLimit *RateLimit `protobuf:"bytes,1,opt,name=rate_limit,json=rateLimit,proto3" json:"rate_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRateLimitResponse) Reset() { + *x = GetRateLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRateLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRateLimitResponse) ProtoMessage() {} + +func (x *GetRateLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRateLimitResponse.ProtoReflect.Descriptor instead. +func (*GetRateLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{1} +} + +func (x *GetRateLimitResponse) GetRateLimit() *RateLimit { + if x != nil { + return x.RateLimit + } + return nil +} + +// Response message for UpdateRateLimit RPC. +type UpdateRateLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RateLimit *RateLimit `protobuf:"bytes,1,opt,name=rate_limit,json=rateLimit,proto3" json:"rate_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRateLimitResponse) Reset() { + *x = UpdateRateLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRateLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRateLimitResponse) ProtoMessage() {} + +func (x *UpdateRateLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRateLimitResponse.ProtoReflect.Descriptor instead. +func (*UpdateRateLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateRateLimitResponse) GetRateLimit() *RateLimit { + if x != nil { + return x.RateLimit + } + return nil +} + +// Response message for DeleteRateLimit RPC. +type DeleteRateLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRateLimitResponse) Reset() { + *x = DeleteRateLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRateLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRateLimitResponse) ProtoMessage() {} + +func (x *DeleteRateLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRateLimitResponse.ProtoReflect.Descriptor instead. +func (*DeleteRateLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{3} +} + +type RateLimit struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // CEL expression for rule matching (e.g., "request.headers['X-Tier'][0] == 'free'") + Expression string `protobuf:"bytes,4,opt,name=expression,proto3" json:"expression,omitempty"` + // CEL expression to extract rate limit key (e.g., "request.headers['X-User-ID'][0]") + // If not provided, a global rate limit is applied + KeyExtractor string `protobuf:"bytes,5,opt,name=key_extractor,json=keyExtractor,proto3" json:"key_extractor,omitempty"` + // Request-based limits (pre-request enforcement) + // At least one limit should be non-zero + // For token/cost-based limiting, use SpendLimitService instead (aligns with CUE schema) + RequestsPerSecond int64 `protobuf:"varint,6,opt,name=requests_per_second,json=requestsPerSecond,proto3" json:"requests_per_second,omitempty"` // 0 = unlimited + RequestsPerMinute int64 `protobuf:"varint,7,opt,name=requests_per_minute,json=requestsPerMinute,proto3" json:"requests_per_minute,omitempty"` // 0 = unlimited + RequestsPerDay int64 `protobuf:"varint,8,opt,name=requests_per_day,json=requestsPerDay,proto3" json:"requests_per_day,omitempty"` // 0 = unlimited + Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` + Metadata map[string]string `protobuf:"bytes,12,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RateLimit) Reset() { + *x = RateLimit{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RateLimit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RateLimit) ProtoMessage() {} + +func (x *RateLimit) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RateLimit.ProtoReflect.Descriptor instead. +func (*RateLimit) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{4} +} + +func (x *RateLimit) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RateLimit) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *RateLimit) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *RateLimit) GetExpression() string { + if x != nil { + return x.Expression + } + return "" +} + +func (x *RateLimit) GetKeyExtractor() string { + if x != nil { + return x.KeyExtractor + } + return "" +} + +func (x *RateLimit) GetRequestsPerSecond() int64 { + if x != nil { + return x.RequestsPerSecond + } + return 0 +} + +func (x *RateLimit) GetRequestsPerMinute() int64 { + if x != nil { + return x.RequestsPerMinute + } + return 0 +} + +func (x *RateLimit) GetRequestsPerDay() int64 { + if x != nil { + return x.RequestsPerDay + } + return 0 +} + +func (x *RateLimit) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *RateLimit) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *RateLimit) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *RateLimit) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +type CreateRateLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + RateLimit *RateLimit `protobuf:"bytes,3,opt,name=rate_limit,json=rateLimit,proto3" json:"rate_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRateLimitRequest) Reset() { + *x = CreateRateLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRateLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRateLimitRequest) ProtoMessage() {} + +func (x *CreateRateLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRateLimitRequest.ProtoReflect.Descriptor instead. +func (*CreateRateLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateRateLimitRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateRateLimitRequest) GetRateLimit() *RateLimit { + if x != nil { + return x.RateLimit + } + return nil +} + +type GetRateLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRateLimitRequest) Reset() { + *x = GetRateLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRateLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRateLimitRequest) ProtoMessage() {} + +func (x *GetRateLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRateLimitRequest.ProtoReflect.Descriptor instead. +func (*GetRateLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{6} +} + +func (x *GetRateLimitRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListRateLimitsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRateLimitsRequest) Reset() { + *x = ListRateLimitsRequest{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRateLimitsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRateLimitsRequest) ProtoMessage() {} + +func (x *ListRateLimitsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRateLimitsRequest.ProtoReflect.Descriptor instead. +func (*ListRateLimitsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{7} +} + +func (x *ListRateLimitsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListRateLimitsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRateLimitsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListRateLimitsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListRateLimitsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListRateLimitsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RateLimits []*RateLimit `protobuf:"bytes,1,rep,name=rate_limits,json=rateLimits,proto3" json:"rate_limits,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRateLimitsResponse) Reset() { + *x = ListRateLimitsResponse{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRateLimitsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRateLimitsResponse) ProtoMessage() {} + +func (x *ListRateLimitsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRateLimitsResponse.ProtoReflect.Descriptor instead. +func (*ListRateLimitsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{8} +} + +func (x *ListRateLimitsResponse) GetRateLimits() []*RateLimit { + if x != nil { + return x.RateLimits + } + return nil +} + +func (x *ListRateLimitsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListRateLimitsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateRateLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RateLimit *RateLimit `protobuf:"bytes,1,opt,name=rate_limit,json=rateLimit,proto3" json:"rate_limit,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRateLimitRequest) Reset() { + *x = UpdateRateLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRateLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRateLimitRequest) ProtoMessage() {} + +func (x *UpdateRateLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRateLimitRequest.ProtoReflect.Descriptor instead. +func (*UpdateRateLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateRateLimitRequest) GetRateLimit() *RateLimit { + if x != nil { + return x.RateLimit + } + return nil +} + +func (x *UpdateRateLimitRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteRateLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRateLimitRequest) Reset() { + *x = DeleteRateLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRateLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRateLimitRequest) ProtoMessage() {} + +func (x *DeleteRateLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRateLimitRequest.ProtoReflect.Descriptor instead. +func (*DeleteRateLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteRateLimitRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_redpanda_api_aigateway_v1_ratelimit_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_ratelimit_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x61, 0x74, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x5e, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0x5b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5e, 0x0a, + 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x19, 0x0a, + 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf5, 0x07, 0x0a, 0x09, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x37, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, + 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x37, 0x0a, 0x13, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x00, + 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6e, + 0x75, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, + 0x48, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x50, 0x65, 0x72, 0x44, 0x61, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x4e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x3a, 0xdc, 0x02, 0xea, 0x41, 0x69, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, 0x2f, 0x72, 0x61, + 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x7d, 0x12, 0x18, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x7d, + 0xba, 0x48, 0xec, 0x01, 0x1a, 0xe9, 0x01, 0x0a, 0x1c, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x2e, 0x61, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x6e, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, 0x29, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x30, 0x1a, 0x59, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x3e, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x20, + 0x3e, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, 0x20, 0x3e, 0x20, 0x30, + 0x22, 0x95, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0d, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x53, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, + 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x01, + 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xa6, + 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, + 0x56, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, + 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x8e, 0x08, 0x0a, 0x10, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xd0, 0x01, 0x0a, + 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x3a, + 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5a, 0x1d, 0x3a, 0x0a, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, + 0xb8, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x5a, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x61, 0x74, 0x65, + 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb5, 0x01, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x30, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x5a, 0x11, 0x12, 0x0f, 0x2f, 0x76, + 0x31, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x23, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x12, 0xef, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x6f, 0x3a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5a, 0x31, 0x3a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x32, + 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x2f, 0x2a, 0x7d, 0x32, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x5a, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x2f, 0x2a, 0x7d, 0x2a, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x42, 0x83, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x52, 0x61, 0x74, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, + 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, + 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescData = file_redpanda_api_aigateway_v1_ratelimit_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_ratelimit_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_ratelimit_proto_goTypes = []any{ + (*CreateRateLimitResponse)(nil), // 0: redpanda.api.aigateway.v1.CreateRateLimitResponse + (*GetRateLimitResponse)(nil), // 1: redpanda.api.aigateway.v1.GetRateLimitResponse + (*UpdateRateLimitResponse)(nil), // 2: redpanda.api.aigateway.v1.UpdateRateLimitResponse + (*DeleteRateLimitResponse)(nil), // 3: redpanda.api.aigateway.v1.DeleteRateLimitResponse + (*RateLimit)(nil), // 4: redpanda.api.aigateway.v1.RateLimit + (*CreateRateLimitRequest)(nil), // 5: redpanda.api.aigateway.v1.CreateRateLimitRequest + (*GetRateLimitRequest)(nil), // 6: redpanda.api.aigateway.v1.GetRateLimitRequest + (*ListRateLimitsRequest)(nil), // 7: redpanda.api.aigateway.v1.ListRateLimitsRequest + (*ListRateLimitsResponse)(nil), // 8: redpanda.api.aigateway.v1.ListRateLimitsResponse + (*UpdateRateLimitRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateRateLimitRequest + (*DeleteRateLimitRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteRateLimitRequest + nil, // 11: redpanda.api.aigateway.v1.RateLimit.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_ratelimit_proto_depIdxs = []int32{ + 4, // 0: redpanda.api.aigateway.v1.CreateRateLimitResponse.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 4, // 1: redpanda.api.aigateway.v1.GetRateLimitResponse.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 4, // 2: redpanda.api.aigateway.v1.UpdateRateLimitResponse.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 11, // 3: redpanda.api.aigateway.v1.RateLimit.metadata:type_name -> redpanda.api.aigateway.v1.RateLimit.MetadataEntry + 12, // 4: redpanda.api.aigateway.v1.RateLimit.create_time:type_name -> google.protobuf.Timestamp + 12, // 5: redpanda.api.aigateway.v1.RateLimit.update_time:type_name -> google.protobuf.Timestamp + 4, // 6: redpanda.api.aigateway.v1.CreateRateLimitRequest.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 4, // 7: redpanda.api.aigateway.v1.ListRateLimitsResponse.rate_limits:type_name -> redpanda.api.aigateway.v1.RateLimit + 4, // 8: redpanda.api.aigateway.v1.UpdateRateLimitRequest.rate_limit:type_name -> redpanda.api.aigateway.v1.RateLimit + 13, // 9: redpanda.api.aigateway.v1.UpdateRateLimitRequest.update_mask:type_name -> google.protobuf.FieldMask + 5, // 10: redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit:input_type -> redpanda.api.aigateway.v1.CreateRateLimitRequest + 6, // 11: redpanda.api.aigateway.v1.RateLimitService.GetRateLimit:input_type -> redpanda.api.aigateway.v1.GetRateLimitRequest + 7, // 12: redpanda.api.aigateway.v1.RateLimitService.ListRateLimits:input_type -> redpanda.api.aigateway.v1.ListRateLimitsRequest + 9, // 13: redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit:input_type -> redpanda.api.aigateway.v1.UpdateRateLimitRequest + 10, // 14: redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit:input_type -> redpanda.api.aigateway.v1.DeleteRateLimitRequest + 0, // 15: redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit:output_type -> redpanda.api.aigateway.v1.CreateRateLimitResponse + 1, // 16: redpanda.api.aigateway.v1.RateLimitService.GetRateLimit:output_type -> redpanda.api.aigateway.v1.GetRateLimitResponse + 8, // 17: redpanda.api.aigateway.v1.RateLimitService.ListRateLimits:output_type -> redpanda.api.aigateway.v1.ListRateLimitsResponse + 2, // 18: redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit:output_type -> redpanda.api.aigateway.v1.UpdateRateLimitResponse + 3, // 19: redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit:output_type -> redpanda.api.aigateway.v1.DeleteRateLimitResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_ratelimit_proto_init() } +func file_redpanda_api_aigateway_v1_ratelimit_proto_init() { + if File_redpanda_api_aigateway_v1_ratelimit_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_ratelimit_proto_rawDesc, + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_ratelimit_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_ratelimit_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_ratelimit_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_ratelimit_proto = out.File + file_redpanda_api_aigateway_v1_ratelimit_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_ratelimit_proto_goTypes = nil + file_redpanda_api_aigateway_v1_ratelimit_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.gw.go new file mode 100644 index 0000000000..b6e33db0b3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit.pb.gw.go @@ -0,0 +1,973 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/ratelimit.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_RateLimitService_CreateRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.CreateRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_CreateRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.CreateRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RateLimitService_CreateRateLimit_1 = &utilities.DoubleArray{Encoding: map[string]int{"rate_limit": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RateLimitService_CreateRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRateLimitRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_CreateRateLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_CreateRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRateLimitRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_CreateRateLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_RateLimitService_GetRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_GetRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_RateLimitService_GetRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_GetRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RateLimitService_ListRateLimits_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RateLimitService_ListRateLimits_0(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRateLimitsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_ListRateLimits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRateLimits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_ListRateLimits_0(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRateLimitsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_ListRateLimits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRateLimits(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RateLimitService_ListRateLimits_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_RateLimitService_ListRateLimits_1(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRateLimitsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_ListRateLimits_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRateLimits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_ListRateLimits_1(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRateLimitsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_ListRateLimits_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRateLimits(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RateLimitService_UpdateRateLimit_0 = &utilities.DoubleArray{Encoding: map[string]int{"rate_limit": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_RateLimitService_UpdateRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RateLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["rate_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "rate_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "rate_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "rate_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_UpdateRateLimit_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_UpdateRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RateLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["rate_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "rate_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "rate_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "rate_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_UpdateRateLimit_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RateLimitService_UpdateRateLimit_1 = &utilities.DoubleArray{Encoding: map[string]int{"rate_limit": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_RateLimitService_UpdateRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RateLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["rate_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "rate_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "rate_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "rate_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_UpdateRateLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_UpdateRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RateLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RateLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["rate_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "rate_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "rate_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "rate_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RateLimitService_UpdateRateLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_RateLimitService_DeleteRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_DeleteRateLimit_0(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_RateLimitService_DeleteRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, client RateLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteRateLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RateLimitService_DeleteRateLimit_1(ctx context.Context, marshaler runtime.Marshaler, server RateLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRateLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteRateLimit(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterRateLimitServiceHandlerServer registers the http handlers for service RateLimitService to "mux". +// UnaryRPC :call RateLimitServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRateLimitServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterRateLimitServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RateLimitServiceServer) error { + mux.Handle(http.MethodPost, pattern_RateLimitService_CreateRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_CreateRateLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_CreateRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RateLimitService_CreateRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit", runtime.WithHTTPPathPattern("/v1/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_CreateRateLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_CreateRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_GetRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_GetRateLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_GetRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_GetRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit", runtime.WithHTTPPathPattern("/v1/{name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_GetRateLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_GetRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_ListRateLimits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_ListRateLimits_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_ListRateLimits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_ListRateLimits_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits", runtime.WithHTTPPathPattern("/v1/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_ListRateLimits_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_ListRateLimits_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RateLimitService_UpdateRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit", runtime.WithHTTPPathPattern("/v1/{rate_limit.name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_UpdateRateLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_UpdateRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RateLimitService_UpdateRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit", runtime.WithHTTPPathPattern("/v1/{rate_limit.name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_UpdateRateLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_UpdateRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RateLimitService_DeleteRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_DeleteRateLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_DeleteRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RateLimitService_DeleteRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit", runtime.WithHTTPPathPattern("/v1/{name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RateLimitService_DeleteRateLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_DeleteRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterRateLimitServiceHandlerFromEndpoint is same as RegisterRateLimitServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterRateLimitServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterRateLimitServiceHandler(ctx, mux, conn) +} + +// RegisterRateLimitServiceHandler registers the http handlers for service RateLimitService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterRateLimitServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRateLimitServiceHandlerClient(ctx, mux, NewRateLimitServiceClient(conn)) +} + +// RegisterRateLimitServiceHandlerClient registers the http handlers for service RateLimitService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RateLimitServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RateLimitServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "RateLimitServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterRateLimitServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RateLimitServiceClient) error { + mux.Handle(http.MethodPost, pattern_RateLimitService_CreateRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_CreateRateLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_CreateRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RateLimitService_CreateRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit", runtime.WithHTTPPathPattern("/v1/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_CreateRateLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_CreateRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_GetRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_GetRateLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_GetRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_GetRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit", runtime.WithHTTPPathPattern("/v1/{name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_GetRateLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_GetRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_ListRateLimits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_ListRateLimits_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_ListRateLimits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RateLimitService_ListRateLimits_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits", runtime.WithHTTPPathPattern("/v1/rate-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_ListRateLimits_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_ListRateLimits_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RateLimitService_UpdateRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit", runtime.WithHTTPPathPattern("/v1/{rate_limit.name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_UpdateRateLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_UpdateRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RateLimitService_UpdateRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit", runtime.WithHTTPPathPattern("/v1/{rate_limit.name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_UpdateRateLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_UpdateRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RateLimitService_DeleteRateLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_DeleteRateLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_DeleteRateLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RateLimitService_DeleteRateLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit", runtime.WithHTTPPathPattern("/v1/{name=rate-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RateLimitService_DeleteRateLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RateLimitService_DeleteRateLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_RateLimitService_CreateRateLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "rate-limits"}, "")) + pattern_RateLimitService_CreateRateLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "rate-limits"}, "")) + pattern_RateLimitService_GetRateLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "rate-limits", "name"}, "")) + pattern_RateLimitService_GetRateLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "rate-limits", "name"}, "")) + pattern_RateLimitService_ListRateLimits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "rate-limits"}, "")) + pattern_RateLimitService_ListRateLimits_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "rate-limits"}, "")) + pattern_RateLimitService_UpdateRateLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "rate-limits", "rate_limit.name"}, "")) + pattern_RateLimitService_UpdateRateLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "rate-limits", "rate_limit.name"}, "")) + pattern_RateLimitService_DeleteRateLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "rate-limits", "name"}, "")) + pattern_RateLimitService_DeleteRateLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "rate-limits", "name"}, "")) +) + +var ( + forward_RateLimitService_CreateRateLimit_0 = runtime.ForwardResponseMessage + forward_RateLimitService_CreateRateLimit_1 = runtime.ForwardResponseMessage + forward_RateLimitService_GetRateLimit_0 = runtime.ForwardResponseMessage + forward_RateLimitService_GetRateLimit_1 = runtime.ForwardResponseMessage + forward_RateLimitService_ListRateLimits_0 = runtime.ForwardResponseMessage + forward_RateLimitService_ListRateLimits_1 = runtime.ForwardResponseMessage + forward_RateLimitService_UpdateRateLimit_0 = runtime.ForwardResponseMessage + forward_RateLimitService_UpdateRateLimit_1 = runtime.ForwardResponseMessage + forward_RateLimitService_DeleteRateLimit_0 = runtime.ForwardResponseMessage + forward_RateLimitService_DeleteRateLimit_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit_grpc.pb.go new file mode 100644 index 0000000000..c63093b153 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/ratelimit_grpc.pb.go @@ -0,0 +1,274 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/ratelimit.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + RateLimitService_CreateRateLimit_FullMethodName = "/redpanda.api.aigateway.v1.RateLimitService/CreateRateLimit" + RateLimitService_GetRateLimit_FullMethodName = "/redpanda.api.aigateway.v1.RateLimitService/GetRateLimit" + RateLimitService_ListRateLimits_FullMethodName = "/redpanda.api.aigateway.v1.RateLimitService/ListRateLimits" + RateLimitService_UpdateRateLimit_FullMethodName = "/redpanda.api.aigateway.v1.RateLimitService/UpdateRateLimit" + RateLimitService_DeleteRateLimit_FullMethodName = "/redpanda.api.aigateway.v1.RateLimitService/DeleteRateLimit" +) + +// RateLimitServiceClient is the client API for RateLimitService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RateLimitServiceClient interface { + CreateRateLimit(ctx context.Context, in *CreateRateLimitRequest, opts ...grpc.CallOption) (*CreateRateLimitResponse, error) + GetRateLimit(ctx context.Context, in *GetRateLimitRequest, opts ...grpc.CallOption) (*GetRateLimitResponse, error) + ListRateLimits(ctx context.Context, in *ListRateLimitsRequest, opts ...grpc.CallOption) (*ListRateLimitsResponse, error) + UpdateRateLimit(ctx context.Context, in *UpdateRateLimitRequest, opts ...grpc.CallOption) (*UpdateRateLimitResponse, error) + DeleteRateLimit(ctx context.Context, in *DeleteRateLimitRequest, opts ...grpc.CallOption) (*DeleteRateLimitResponse, error) +} + +type rateLimitServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewRateLimitServiceClient(cc grpc.ClientConnInterface) RateLimitServiceClient { + return &rateLimitServiceClient{cc} +} + +func (c *rateLimitServiceClient) CreateRateLimit(ctx context.Context, in *CreateRateLimitRequest, opts ...grpc.CallOption) (*CreateRateLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateRateLimitResponse) + err := c.cc.Invoke(ctx, RateLimitService_CreateRateLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *rateLimitServiceClient) GetRateLimit(ctx context.Context, in *GetRateLimitRequest, opts ...grpc.CallOption) (*GetRateLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetRateLimitResponse) + err := c.cc.Invoke(ctx, RateLimitService_GetRateLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *rateLimitServiceClient) ListRateLimits(ctx context.Context, in *ListRateLimitsRequest, opts ...grpc.CallOption) (*ListRateLimitsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRateLimitsResponse) + err := c.cc.Invoke(ctx, RateLimitService_ListRateLimits_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *rateLimitServiceClient) UpdateRateLimit(ctx context.Context, in *UpdateRateLimitRequest, opts ...grpc.CallOption) (*UpdateRateLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateRateLimitResponse) + err := c.cc.Invoke(ctx, RateLimitService_UpdateRateLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *rateLimitServiceClient) DeleteRateLimit(ctx context.Context, in *DeleteRateLimitRequest, opts ...grpc.CallOption) (*DeleteRateLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteRateLimitResponse) + err := c.cc.Invoke(ctx, RateLimitService_DeleteRateLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RateLimitServiceServer is the server API for RateLimitService service. +// All implementations must embed UnimplementedRateLimitServiceServer +// for forward compatibility. +type RateLimitServiceServer interface { + CreateRateLimit(context.Context, *CreateRateLimitRequest) (*CreateRateLimitResponse, error) + GetRateLimit(context.Context, *GetRateLimitRequest) (*GetRateLimitResponse, error) + ListRateLimits(context.Context, *ListRateLimitsRequest) (*ListRateLimitsResponse, error) + UpdateRateLimit(context.Context, *UpdateRateLimitRequest) (*UpdateRateLimitResponse, error) + DeleteRateLimit(context.Context, *DeleteRateLimitRequest) (*DeleteRateLimitResponse, error) + mustEmbedUnimplementedRateLimitServiceServer() +} + +// UnimplementedRateLimitServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedRateLimitServiceServer struct{} + +func (UnimplementedRateLimitServiceServer) CreateRateLimit(context.Context, *CreateRateLimitRequest) (*CreateRateLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateRateLimit not implemented") +} +func (UnimplementedRateLimitServiceServer) GetRateLimit(context.Context, *GetRateLimitRequest) (*GetRateLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRateLimit not implemented") +} +func (UnimplementedRateLimitServiceServer) ListRateLimits(context.Context, *ListRateLimitsRequest) (*ListRateLimitsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRateLimits not implemented") +} +func (UnimplementedRateLimitServiceServer) UpdateRateLimit(context.Context, *UpdateRateLimitRequest) (*UpdateRateLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateRateLimit not implemented") +} +func (UnimplementedRateLimitServiceServer) DeleteRateLimit(context.Context, *DeleteRateLimitRequest) (*DeleteRateLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteRateLimit not implemented") +} +func (UnimplementedRateLimitServiceServer) mustEmbedUnimplementedRateLimitServiceServer() {} +func (UnimplementedRateLimitServiceServer) testEmbeddedByValue() {} + +// UnsafeRateLimitServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RateLimitServiceServer will +// result in compilation errors. +type UnsafeRateLimitServiceServer interface { + mustEmbedUnimplementedRateLimitServiceServer() +} + +func RegisterRateLimitServiceServer(s grpc.ServiceRegistrar, srv RateLimitServiceServer) { + // If the following call pancis, it indicates UnimplementedRateLimitServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&RateLimitService_ServiceDesc, srv) +} + +func _RateLimitService_CreateRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRateLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RateLimitServiceServer).CreateRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RateLimitService_CreateRateLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RateLimitServiceServer).CreateRateLimit(ctx, req.(*CreateRateLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RateLimitService_GetRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRateLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RateLimitServiceServer).GetRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RateLimitService_GetRateLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RateLimitServiceServer).GetRateLimit(ctx, req.(*GetRateLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RateLimitService_ListRateLimits_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRateLimitsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RateLimitServiceServer).ListRateLimits(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RateLimitService_ListRateLimits_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RateLimitServiceServer).ListRateLimits(ctx, req.(*ListRateLimitsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RateLimitService_UpdateRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRateLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RateLimitServiceServer).UpdateRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RateLimitService_UpdateRateLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RateLimitServiceServer).UpdateRateLimit(ctx, req.(*UpdateRateLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RateLimitService_DeleteRateLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRateLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RateLimitServiceServer).DeleteRateLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RateLimitService_DeleteRateLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RateLimitServiceServer).DeleteRateLimit(ctx, req.(*DeleteRateLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// RateLimitService_ServiceDesc is the grpc.ServiceDesc for RateLimitService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RateLimitService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.RateLimitService", + HandlerType: (*RateLimitServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateRateLimit", + Handler: _RateLimitService_CreateRateLimit_Handler, + }, + { + MethodName: "GetRateLimit", + Handler: _RateLimitService_GetRateLimit_Handler, + }, + { + MethodName: "ListRateLimits", + Handler: _RateLimitService_ListRateLimits_Handler, + }, + { + MethodName: "UpdateRateLimit", + Handler: _RateLimitService_UpdateRateLimit_Handler, + }, + { + MethodName: "DeleteRateLimit", + Handler: _RateLimitService_DeleteRateLimit_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/ratelimit.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.go new file mode 100644 index 0000000000..02585ff3fa --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.go @@ -0,0 +1,1639 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/role.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Role represents a named Cedar entity within an organization. +// Roles can be assigned to teams. Permissions are defined via Cedar policies. +// Cedar entity type: AIGateway::Role +type Role struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/organizations/{organization}/roles/{role}` + // Role ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name (must be unique within organization) + // This is used in Cedar policies: AIGateway::Role::"Admin" + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,7,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,8,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Role) Reset() { + *x = Role{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Role) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Role) ProtoMessage() {} + +func (x *Role) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Role.ProtoReflect.Descriptor instead. +func (*Role) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{0} +} + +func (x *Role) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Role) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Role) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Role) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Role) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Role) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Role) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Role) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// TeamRoleAssignment represents the assignment of a role to a team. +type TeamRoleAssignment struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Reference to the team. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Team string `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + // Reference to the role. + // Format: `accounts/{account}/organizations/{organization}/roles/{role}` + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` + // Output only. When the assignment was created + AssignedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=assigned_at,json=assignedAt,proto3" json:"assigned_at,omitempty"` + // Output only. Who created the assignment + AssignedBy string `protobuf:"bytes,4,opt,name=assigned_by,json=assignedBy,proto3" json:"assigned_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TeamRoleAssignment) Reset() { + *x = TeamRoleAssignment{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TeamRoleAssignment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamRoleAssignment) ProtoMessage() {} + +func (x *TeamRoleAssignment) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamRoleAssignment.ProtoReflect.Descriptor instead. +func (*TeamRoleAssignment) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{1} +} + +func (x *TeamRoleAssignment) GetTeam() string { + if x != nil { + return x.Team + } + return "" +} + +func (x *TeamRoleAssignment) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *TeamRoleAssignment) GetAssignedAt() *timestamppb.Timestamp { + if x != nil { + return x.AssignedAt + } + return nil +} + +func (x *TeamRoleAssignment) GetAssignedBy() string { + if x != nil { + return x.AssignedBy + } + return "" +} + +// Request message for CreateRole RPC. +type CreateRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + // Format: `accounts/{account}/organizations/{organization}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The role ID to use. If empty, server generates one. + RoleId string `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"` + // Required: The role resource to create. + Role *Role `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoleRequest) Reset() { + *x = CreateRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoleRequest) ProtoMessage() {} + +func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoleRequest.ProtoReflect.Descriptor instead. +func (*CreateRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateRoleRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateRoleRequest) GetRoleId() string { + if x != nil { + return x.RoleId + } + return "" +} + +func (x *CreateRoleRequest) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// Response message for CreateRole RPC. +type CreateRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoleResponse) Reset() { + *x = CreateRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoleResponse) ProtoMessage() {} + +func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoleResponse.ProtoReflect.Descriptor instead. +func (*CreateRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateRoleResponse) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// Request message for GetRole RPC. +type GetRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the role. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoleRequest) Reset() { + *x = GetRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoleRequest) ProtoMessage() {} + +func (x *GetRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoleRequest.ProtoReflect.Descriptor instead. +func (*GetRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{4} +} + +func (x *GetRoleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetRole RPC. +type GetRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoleResponse) Reset() { + *x = GetRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoleResponse) ProtoMessage() {} + +func (x *GetRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoleResponse.ProtoReflect.Descriptor instead. +func (*GetRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{5} +} + +func (x *GetRoleResponse) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// Request message for ListRoles RPC. +type ListRolesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of roles to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListRoles call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRolesRequest) Reset() { + *x = ListRolesRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRolesRequest) ProtoMessage() {} + +func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead. +func (*ListRolesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{6} +} + +func (x *ListRolesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListRolesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRolesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListRolesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListRolesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListRoles RPC. +type ListRolesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of roles + Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching roles + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRolesResponse) Reset() { + *x = ListRolesResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRolesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRolesResponse) ProtoMessage() {} + +func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead. +func (*ListRolesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{7} +} + +func (x *ListRolesResponse) GetRoles() []*Role { + if x != nil { + return x.Roles + } + return nil +} + +func (x *ListRolesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListRolesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateRole RPC. +type UpdateRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The role resource to update. + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // The fields to update. + // Allowed fields: display_name, description, metadata + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoleRequest) Reset() { + *x = UpdateRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoleRequest) ProtoMessage() {} + +func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoleRequest.ProtoReflect.Descriptor instead. +func (*UpdateRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateRoleRequest) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +func (x *UpdateRoleRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateRole RPC. +type UpdateRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoleResponse) Reset() { + *x = UpdateRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoleResponse) ProtoMessage() {} + +func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoleResponse.ProtoReflect.Descriptor instead. +func (*UpdateRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateRoleResponse) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// Request message for DeleteRole RPC. +type DeleteRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the role to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, unassign all teams from this role before deleting + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoleRequest) Reset() { + *x = DeleteRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoleRequest) ProtoMessage() {} + +func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoleRequest.ProtoReflect.Descriptor instead. +func (*DeleteRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteRoleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteRoleRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteRole RPC. +type DeleteRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoleResponse) Reset() { + *x = DeleteRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoleResponse) ProtoMessage() {} + +func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoleResponse.ProtoReflect.Descriptor instead. +func (*DeleteRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{11} +} + +// Request message for AssignTeamRole RPC. +type AssignTeamRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Role to assign. + // Format: `accounts/{account}/organizations/{organization}/roles/{role}` + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // Required: Team to assign the role to. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Team string `protobuf:"bytes,2,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AssignTeamRoleRequest) Reset() { + *x = AssignTeamRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AssignTeamRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignTeamRoleRequest) ProtoMessage() {} + +func (x *AssignTeamRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssignTeamRoleRequest.ProtoReflect.Descriptor instead. +func (*AssignTeamRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{12} +} + +func (x *AssignTeamRoleRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *AssignTeamRoleRequest) GetTeam() string { + if x != nil { + return x.Team + } + return "" +} + +// Response message for AssignTeamRole RPC. +type AssignTeamRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Assignment *TeamRoleAssignment `protobuf:"bytes,1,opt,name=assignment,proto3" json:"assignment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AssignTeamRoleResponse) Reset() { + *x = AssignTeamRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AssignTeamRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignTeamRoleResponse) ProtoMessage() {} + +func (x *AssignTeamRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssignTeamRoleResponse.ProtoReflect.Descriptor instead. +func (*AssignTeamRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{13} +} + +func (x *AssignTeamRoleResponse) GetAssignment() *TeamRoleAssignment { + if x != nil { + return x.Assignment + } + return nil +} + +// Request message for UnassignTeamRole RPC. +type UnassignTeamRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Role to unassign. + // Format: `accounts/{account}/organizations/{organization}/roles/{role}` + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // Required: Team to unassign the role from. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Team string `protobuf:"bytes,2,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UnassignTeamRoleRequest) Reset() { + *x = UnassignTeamRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UnassignTeamRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnassignTeamRoleRequest) ProtoMessage() {} + +func (x *UnassignTeamRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnassignTeamRoleRequest.ProtoReflect.Descriptor instead. +func (*UnassignTeamRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{14} +} + +func (x *UnassignTeamRoleRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *UnassignTeamRoleRequest) GetTeam() string { + if x != nil { + return x.Team + } + return "" +} + +// Response message for UnassignTeamRole RPC. +type UnassignTeamRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UnassignTeamRoleResponse) Reset() { + *x = UnassignTeamRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UnassignTeamRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnassignTeamRoleResponse) ProtoMessage() {} + +func (x *UnassignTeamRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnassignTeamRoleResponse.ProtoReflect.Descriptor instead. +func (*UnassignTeamRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{15} +} + +// Request message for ListRoleTeams RPC. +type ListRoleTeamsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Role to list teams for. + // Format: `accounts/{account}/organizations/{organization}/roles/{role}` + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // Maximum number of assignments to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoleTeamsRequest) Reset() { + *x = ListRoleTeamsRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoleTeamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleTeamsRequest) ProtoMessage() {} + +func (x *ListRoleTeamsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleTeamsRequest.ProtoReflect.Descriptor instead. +func (*ListRoleTeamsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{16} +} + +func (x *ListRoleTeamsRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *ListRoleTeamsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRoleTeamsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListRoleTeams RPC. +type ListRoleTeamsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of team role assignments + Assignments []*TeamRoleAssignment `protobuf:"bytes,1,rep,name=assignments,proto3" json:"assignments,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoleTeamsResponse) Reset() { + *x = ListRoleTeamsResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoleTeamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleTeamsResponse) ProtoMessage() {} + +func (x *ListRoleTeamsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleTeamsResponse.ProtoReflect.Descriptor instead. +func (*ListRoleTeamsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{17} +} + +func (x *ListRoleTeamsResponse) GetAssignments() []*TeamRoleAssignment { + if x != nil { + return x.Assignments + } + return nil +} + +func (x *ListRoleTeamsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListRoleTeamsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for ListTeamRoles RPC. +type ListTeamRolesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Team to list roles for. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Team string `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + // Maximum number of assignments to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamRolesRequest) Reset() { + *x = ListTeamRolesRequest{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamRolesRequest) ProtoMessage() {} + +func (x *ListTeamRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamRolesRequest.ProtoReflect.Descriptor instead. +func (*ListTeamRolesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{18} +} + +func (x *ListTeamRolesRequest) GetTeam() string { + if x != nil { + return x.Team + } + return "" +} + +func (x *ListTeamRolesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListTeamRolesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListTeamRoles RPC. +type ListTeamRolesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of team role assignments + Assignments []*TeamRoleAssignment `protobuf:"bytes,1,rep,name=assignments,proto3" json:"assignments,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamRolesResponse) Reset() { + *x = ListTeamRolesResponse{} + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamRolesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamRolesResponse) ProtoMessage() {} + +func (x *ListTeamRolesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_role_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamRolesResponse.ProtoReflect.Descriptor instead. +func (*ListTeamRolesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP(), []int{19} +} + +func (x *ListTeamRolesResponse) GetAssignments() []*TeamRoleAssignment { + if x != nil { + return x.Assignments + } + return nil +} + +func (x *ListTeamRolesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListTeamRolesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +var File_redpanda_api_aigateway_v1_role_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_role_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x04, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x5e, 0xea, 0x41, 0x5b, 0x0a, 0x1b, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x3c, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x7d, 0x22, 0xee, 0x01, 0x0a, 0x12, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x37, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, + 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, + 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x22, 0xb0, 0x01, 0x0a, 0x11, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x43, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x72, 0x6f, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x49, 0x0a, + 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, + 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xe4, 0x01, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x43, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, + 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x42, 0x79, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x49, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x14, 0x0a, 0x12, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x67, + 0x0a, 0x16, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, + 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x55, 0x6e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, + 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, + 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, + 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, + 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, + 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x32, 0xc2, 0x0c, 0x0a, 0x0b, 0x52, 0x6f, + 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x0a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x9d, 0x01, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0xab, 0x01, 0x0a, + 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, + 0x3a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x32, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, + 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa0, 0x01, 0x0a, 0x0a, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x2a, 0x2d, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xba, 0x01, + 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, + 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, + 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, 0xc2, 0x01, 0x0a, 0x10, 0x55, + 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x12, + 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, + 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, + 0x2a, 0x7d, 0x3a, 0x75, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0xaf, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x65, 0x61, 0x6d, + 0x73, 0x12, 0xaf, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x74, 0x65, 0x61, 0x6d, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0xfe, + 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x42, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, + 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, + 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_role_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_role_proto_rawDescData = file_redpanda_api_aigateway_v1_role_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_role_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_role_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_role_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_role_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_role_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_role_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_redpanda_api_aigateway_v1_role_proto_goTypes = []any{ + (*Role)(nil), // 0: redpanda.api.aigateway.v1.Role + (*TeamRoleAssignment)(nil), // 1: redpanda.api.aigateway.v1.TeamRoleAssignment + (*CreateRoleRequest)(nil), // 2: redpanda.api.aigateway.v1.CreateRoleRequest + (*CreateRoleResponse)(nil), // 3: redpanda.api.aigateway.v1.CreateRoleResponse + (*GetRoleRequest)(nil), // 4: redpanda.api.aigateway.v1.GetRoleRequest + (*GetRoleResponse)(nil), // 5: redpanda.api.aigateway.v1.GetRoleResponse + (*ListRolesRequest)(nil), // 6: redpanda.api.aigateway.v1.ListRolesRequest + (*ListRolesResponse)(nil), // 7: redpanda.api.aigateway.v1.ListRolesResponse + (*UpdateRoleRequest)(nil), // 8: redpanda.api.aigateway.v1.UpdateRoleRequest + (*UpdateRoleResponse)(nil), // 9: redpanda.api.aigateway.v1.UpdateRoleResponse + (*DeleteRoleRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteRoleRequest + (*DeleteRoleResponse)(nil), // 11: redpanda.api.aigateway.v1.DeleteRoleResponse + (*AssignTeamRoleRequest)(nil), // 12: redpanda.api.aigateway.v1.AssignTeamRoleRequest + (*AssignTeamRoleResponse)(nil), // 13: redpanda.api.aigateway.v1.AssignTeamRoleResponse + (*UnassignTeamRoleRequest)(nil), // 14: redpanda.api.aigateway.v1.UnassignTeamRoleRequest + (*UnassignTeamRoleResponse)(nil), // 15: redpanda.api.aigateway.v1.UnassignTeamRoleResponse + (*ListRoleTeamsRequest)(nil), // 16: redpanda.api.aigateway.v1.ListRoleTeamsRequest + (*ListRoleTeamsResponse)(nil), // 17: redpanda.api.aigateway.v1.ListRoleTeamsResponse + (*ListTeamRolesRequest)(nil), // 18: redpanda.api.aigateway.v1.ListTeamRolesRequest + (*ListTeamRolesResponse)(nil), // 19: redpanda.api.aigateway.v1.ListTeamRolesResponse + nil, // 20: redpanda.api.aigateway.v1.Role.MetadataEntry + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 22: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_role_proto_depIdxs = []int32{ + 20, // 0: redpanda.api.aigateway.v1.Role.metadata:type_name -> redpanda.api.aigateway.v1.Role.MetadataEntry + 21, // 1: redpanda.api.aigateway.v1.Role.create_time:type_name -> google.protobuf.Timestamp + 21, // 2: redpanda.api.aigateway.v1.Role.update_time:type_name -> google.protobuf.Timestamp + 21, // 3: redpanda.api.aigateway.v1.TeamRoleAssignment.assigned_at:type_name -> google.protobuf.Timestamp + 0, // 4: redpanda.api.aigateway.v1.CreateRoleRequest.role:type_name -> redpanda.api.aigateway.v1.Role + 0, // 5: redpanda.api.aigateway.v1.CreateRoleResponse.role:type_name -> redpanda.api.aigateway.v1.Role + 0, // 6: redpanda.api.aigateway.v1.GetRoleResponse.role:type_name -> redpanda.api.aigateway.v1.Role + 0, // 7: redpanda.api.aigateway.v1.ListRolesResponse.roles:type_name -> redpanda.api.aigateway.v1.Role + 0, // 8: redpanda.api.aigateway.v1.UpdateRoleRequest.role:type_name -> redpanda.api.aigateway.v1.Role + 22, // 9: redpanda.api.aigateway.v1.UpdateRoleRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 10: redpanda.api.aigateway.v1.UpdateRoleResponse.role:type_name -> redpanda.api.aigateway.v1.Role + 1, // 11: redpanda.api.aigateway.v1.AssignTeamRoleResponse.assignment:type_name -> redpanda.api.aigateway.v1.TeamRoleAssignment + 1, // 12: redpanda.api.aigateway.v1.ListRoleTeamsResponse.assignments:type_name -> redpanda.api.aigateway.v1.TeamRoleAssignment + 1, // 13: redpanda.api.aigateway.v1.ListTeamRolesResponse.assignments:type_name -> redpanda.api.aigateway.v1.TeamRoleAssignment + 2, // 14: redpanda.api.aigateway.v1.RoleService.CreateRole:input_type -> redpanda.api.aigateway.v1.CreateRoleRequest + 4, // 15: redpanda.api.aigateway.v1.RoleService.GetRole:input_type -> redpanda.api.aigateway.v1.GetRoleRequest + 6, // 16: redpanda.api.aigateway.v1.RoleService.ListRoles:input_type -> redpanda.api.aigateway.v1.ListRolesRequest + 8, // 17: redpanda.api.aigateway.v1.RoleService.UpdateRole:input_type -> redpanda.api.aigateway.v1.UpdateRoleRequest + 10, // 18: redpanda.api.aigateway.v1.RoleService.DeleteRole:input_type -> redpanda.api.aigateway.v1.DeleteRoleRequest + 12, // 19: redpanda.api.aigateway.v1.RoleService.AssignTeamRole:input_type -> redpanda.api.aigateway.v1.AssignTeamRoleRequest + 14, // 20: redpanda.api.aigateway.v1.RoleService.UnassignTeamRole:input_type -> redpanda.api.aigateway.v1.UnassignTeamRoleRequest + 16, // 21: redpanda.api.aigateway.v1.RoleService.ListRoleTeams:input_type -> redpanda.api.aigateway.v1.ListRoleTeamsRequest + 18, // 22: redpanda.api.aigateway.v1.RoleService.ListTeamRoles:input_type -> redpanda.api.aigateway.v1.ListTeamRolesRequest + 3, // 23: redpanda.api.aigateway.v1.RoleService.CreateRole:output_type -> redpanda.api.aigateway.v1.CreateRoleResponse + 5, // 24: redpanda.api.aigateway.v1.RoleService.GetRole:output_type -> redpanda.api.aigateway.v1.GetRoleResponse + 7, // 25: redpanda.api.aigateway.v1.RoleService.ListRoles:output_type -> redpanda.api.aigateway.v1.ListRolesResponse + 9, // 26: redpanda.api.aigateway.v1.RoleService.UpdateRole:output_type -> redpanda.api.aigateway.v1.UpdateRoleResponse + 11, // 27: redpanda.api.aigateway.v1.RoleService.DeleteRole:output_type -> redpanda.api.aigateway.v1.DeleteRoleResponse + 13, // 28: redpanda.api.aigateway.v1.RoleService.AssignTeamRole:output_type -> redpanda.api.aigateway.v1.AssignTeamRoleResponse + 15, // 29: redpanda.api.aigateway.v1.RoleService.UnassignTeamRole:output_type -> redpanda.api.aigateway.v1.UnassignTeamRoleResponse + 17, // 30: redpanda.api.aigateway.v1.RoleService.ListRoleTeams:output_type -> redpanda.api.aigateway.v1.ListRoleTeamsResponse + 19, // 31: redpanda.api.aigateway.v1.RoleService.ListTeamRoles:output_type -> redpanda.api.aigateway.v1.ListTeamRolesResponse + 23, // [23:32] is the sub-list for method output_type + 14, // [14:23] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_role_proto_init() } +func file_redpanda_api_aigateway_v1_role_proto_init() { + if File_redpanda_api_aigateway_v1_role_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_role_proto_rawDesc, + NumEnums: 0, + NumMessages: 21, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_role_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_role_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_role_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_role_proto = out.File + file_redpanda_api_aigateway_v1_role_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_role_proto_goTypes = nil + file_redpanda_api_aigateway_v1_role_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.gw.go new file mode 100644 index 0000000000..f3da0695fd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/role.pb.gw.go @@ -0,0 +1,923 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/role.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_RoleService_CreateRole_0 = &utilities.DoubleArray{Encoding: map[string]int{"role": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_RoleService_CreateRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Role); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_CreateRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_CreateRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Role); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_CreateRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateRole(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoleService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetRole(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoleService_ListRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoleService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRolesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRolesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRoles(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoleService_UpdateRole_0 = &utilities.DoubleArray{Encoding: map[string]int{"role": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_RoleService_UpdateRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Role); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Role); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["role.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "role.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_UpdateRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_UpdateRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Role); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Role); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["role.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "role.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_UpdateRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateRole(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoleService_DeleteRole_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoleService_DeleteRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeleteRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_DeleteRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeleteRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteRole(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoleService_AssignTeamRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AssignTeamRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + msg, err := client.AssignTeamRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_AssignTeamRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AssignTeamRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + msg, err := server.AssignTeamRole(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoleService_UnassignTeamRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UnassignTeamRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + msg, err := client.UnassignTeamRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_UnassignTeamRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UnassignTeamRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + msg, err := server.UnassignTeamRole(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoleService_ListRoleTeams_0 = &utilities.DoubleArray{Encoding: map[string]int{"role": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoleService_ListRoleTeams_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoleTeamsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListRoleTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRoleTeams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_ListRoleTeams_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoleTeamsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["role"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role") + } + protoReq.Role, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListRoleTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRoleTeams(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoleService_ListTeamRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{"team": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoleService_ListTeamRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamRolesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["team"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "team") + } + protoReq.Team, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "team", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListTeamRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListTeamRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoleService_ListTeamRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamRolesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["team"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "team") + } + protoReq.Team, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "team", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_ListTeamRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListTeamRoles(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterRoleServiceHandlerServer registers the http handlers for service RoleService to "mux". +// UnaryRPC :call RoleServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRoleServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoleServiceServer) error { + mux.Handle(http.MethodPost, pattern_RoleService_CreateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/CreateRole", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_CreateRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_CreateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/GetRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_GetRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListRoles", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_ListRoles_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoleService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/UpdateRole", runtime.WithHTTPPathPattern("/v1/{role.name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_UpdateRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_UpdateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoleService_DeleteRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/DeleteRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_DeleteRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_DeleteRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoleService_AssignTeamRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/AssignTeamRole", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}:assignTeam")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_AssignTeamRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_AssignTeamRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoleService_UnassignTeamRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/UnassignTeamRole", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}:unassignTeam")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_UnassignTeamRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_UnassignTeamRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListRoleTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListRoleTeams", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_ListRoleTeams_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListRoleTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListTeamRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListTeamRoles", runtime.WithHTTPPathPattern("/v1/{team=accounts/*/organizations/*/teams/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoleService_ListTeamRoles_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListTeamRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterRoleServiceHandlerFromEndpoint is same as RegisterRoleServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterRoleServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterRoleServiceHandler(ctx, mux, conn) +} + +// RegisterRoleServiceHandler registers the http handlers for service RoleService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterRoleServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRoleServiceHandlerClient(ctx, mux, NewRoleServiceClient(conn)) +} + +// RegisterRoleServiceHandlerClient registers the http handlers for service RoleService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoleServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoleServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "RoleServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoleServiceClient) error { + mux.Handle(http.MethodPost, pattern_RoleService_CreateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/CreateRole", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_CreateRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_CreateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/GetRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_GetRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListRoles", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_ListRoles_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoleService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/UpdateRole", runtime.WithHTTPPathPattern("/v1/{role.name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_UpdateRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_UpdateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoleService_DeleteRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/DeleteRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/roles/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_DeleteRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_DeleteRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoleService_AssignTeamRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/AssignTeamRole", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}:assignTeam")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_AssignTeamRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_AssignTeamRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoleService_UnassignTeamRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/UnassignTeamRole", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}:unassignTeam")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_UnassignTeamRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_UnassignTeamRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListRoleTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListRoleTeams", runtime.WithHTTPPathPattern("/v1/{role=accounts/*/organizations/*/roles/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_ListRoleTeams_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListRoleTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoleService_ListTeamRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoleService/ListTeamRoles", runtime.WithHTTPPathPattern("/v1/{team=accounts/*/organizations/*/teams/*}/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoleService_ListTeamRoles_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoleService_ListTeamRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_RoleService_CreateRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "roles"}, "")) + pattern_RoleService_GetRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "roles", "name"}, "")) + pattern_RoleService_ListRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "roles"}, "")) + pattern_RoleService_UpdateRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "roles", "role.name"}, "")) + pattern_RoleService_DeleteRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "roles", "name"}, "")) + pattern_RoleService_AssignTeamRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "roles", "role"}, "assignTeam")) + pattern_RoleService_UnassignTeamRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "roles", "role"}, "unassignTeam")) + pattern_RoleService_ListRoleTeams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "accounts", "organizations", "roles", "role", "teams"}, "")) + pattern_RoleService_ListTeamRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "accounts", "organizations", "teams", "team", "roles"}, "")) +) + +var ( + forward_RoleService_CreateRole_0 = runtime.ForwardResponseMessage + forward_RoleService_GetRole_0 = runtime.ForwardResponseMessage + forward_RoleService_ListRoles_0 = runtime.ForwardResponseMessage + forward_RoleService_UpdateRole_0 = runtime.ForwardResponseMessage + forward_RoleService_DeleteRole_0 = runtime.ForwardResponseMessage + forward_RoleService_AssignTeamRole_0 = runtime.ForwardResponseMessage + forward_RoleService_UnassignTeamRole_0 = runtime.ForwardResponseMessage + forward_RoleService_ListRoleTeams_0 = runtime.ForwardResponseMessage + forward_RoleService_ListTeamRoles_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/role_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/role_grpc.pb.go new file mode 100644 index 0000000000..127989ff98 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/role_grpc.pb.go @@ -0,0 +1,456 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/role.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + RoleService_CreateRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/CreateRole" + RoleService_GetRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/GetRole" + RoleService_ListRoles_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/ListRoles" + RoleService_UpdateRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/UpdateRole" + RoleService_DeleteRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/DeleteRole" + RoleService_AssignTeamRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/AssignTeamRole" + RoleService_UnassignTeamRole_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/UnassignTeamRole" + RoleService_ListRoleTeams_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/ListRoleTeams" + RoleService_ListTeamRoles_FullMethodName = "/redpanda.api.aigateway.v1.RoleService/ListTeamRoles" +) + +// RoleServiceClient is the client API for RoleService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// RoleService manages roles within organizations. +// Roles are Cedar entities that teams can be assigned to. +// Permissions for roles are defined via Cedar policies, not stored in the role itself. +// Resource name: accounts/{account_id}/organizations/{organization_id}/roles/{role_id} +type RoleServiceClient interface { + // Creates a new role within an organization. + CreateRole(ctx context.Context, in *CreateRoleRequest, opts ...grpc.CallOption) (*CreateRoleResponse, error) + // Gets a role by name. + GetRole(ctx context.Context, in *GetRoleRequest, opts ...grpc.CallOption) (*GetRoleResponse, error) + // Lists roles within an organization. + ListRoles(ctx context.Context, in *ListRolesRequest, opts ...grpc.CallOption) (*ListRolesResponse, error) + // Updates a role. + UpdateRole(ctx context.Context, in *UpdateRoleRequest, opts ...grpc.CallOption) (*UpdateRoleResponse, error) + // Deletes a role. + DeleteRole(ctx context.Context, in *DeleteRoleRequest, opts ...grpc.CallOption) (*DeleteRoleResponse, error) + // Assigns a role to a team. + // Implements Cedar pattern: Team in Role + AssignTeamRole(ctx context.Context, in *AssignTeamRoleRequest, opts ...grpc.CallOption) (*AssignTeamRoleResponse, error) + // Unassigns a role from a team. + UnassignTeamRole(ctx context.Context, in *UnassignTeamRoleRequest, opts ...grpc.CallOption) (*UnassignTeamRoleResponse, error) + // Lists teams assigned to a role. + ListRoleTeams(ctx context.Context, in *ListRoleTeamsRequest, opts ...grpc.CallOption) (*ListRoleTeamsResponse, error) + // Lists roles assigned to a team. + ListTeamRoles(ctx context.Context, in *ListTeamRolesRequest, opts ...grpc.CallOption) (*ListTeamRolesResponse, error) +} + +type roleServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewRoleServiceClient(cc grpc.ClientConnInterface) RoleServiceClient { + return &roleServiceClient{cc} +} + +func (c *roleServiceClient) CreateRole(ctx context.Context, in *CreateRoleRequest, opts ...grpc.CallOption) (*CreateRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateRoleResponse) + err := c.cc.Invoke(ctx, RoleService_CreateRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) GetRole(ctx context.Context, in *GetRoleRequest, opts ...grpc.CallOption) (*GetRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetRoleResponse) + err := c.cc.Invoke(ctx, RoleService_GetRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) ListRoles(ctx context.Context, in *ListRolesRequest, opts ...grpc.CallOption) (*ListRolesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRolesResponse) + err := c.cc.Invoke(ctx, RoleService_ListRoles_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) UpdateRole(ctx context.Context, in *UpdateRoleRequest, opts ...grpc.CallOption) (*UpdateRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateRoleResponse) + err := c.cc.Invoke(ctx, RoleService_UpdateRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) DeleteRole(ctx context.Context, in *DeleteRoleRequest, opts ...grpc.CallOption) (*DeleteRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteRoleResponse) + err := c.cc.Invoke(ctx, RoleService_DeleteRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) AssignTeamRole(ctx context.Context, in *AssignTeamRoleRequest, opts ...grpc.CallOption) (*AssignTeamRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AssignTeamRoleResponse) + err := c.cc.Invoke(ctx, RoleService_AssignTeamRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) UnassignTeamRole(ctx context.Context, in *UnassignTeamRoleRequest, opts ...grpc.CallOption) (*UnassignTeamRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UnassignTeamRoleResponse) + err := c.cc.Invoke(ctx, RoleService_UnassignTeamRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) ListRoleTeams(ctx context.Context, in *ListRoleTeamsRequest, opts ...grpc.CallOption) (*ListRoleTeamsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRoleTeamsResponse) + err := c.cc.Invoke(ctx, RoleService_ListRoleTeams_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleServiceClient) ListTeamRoles(ctx context.Context, in *ListTeamRolesRequest, opts ...grpc.CallOption) (*ListTeamRolesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListTeamRolesResponse) + err := c.cc.Invoke(ctx, RoleService_ListTeamRoles_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RoleServiceServer is the server API for RoleService service. +// All implementations must embed UnimplementedRoleServiceServer +// for forward compatibility. +// +// RoleService manages roles within organizations. +// Roles are Cedar entities that teams can be assigned to. +// Permissions for roles are defined via Cedar policies, not stored in the role itself. +// Resource name: accounts/{account_id}/organizations/{organization_id}/roles/{role_id} +type RoleServiceServer interface { + // Creates a new role within an organization. + CreateRole(context.Context, *CreateRoleRequest) (*CreateRoleResponse, error) + // Gets a role by name. + GetRole(context.Context, *GetRoleRequest) (*GetRoleResponse, error) + // Lists roles within an organization. + ListRoles(context.Context, *ListRolesRequest) (*ListRolesResponse, error) + // Updates a role. + UpdateRole(context.Context, *UpdateRoleRequest) (*UpdateRoleResponse, error) + // Deletes a role. + DeleteRole(context.Context, *DeleteRoleRequest) (*DeleteRoleResponse, error) + // Assigns a role to a team. + // Implements Cedar pattern: Team in Role + AssignTeamRole(context.Context, *AssignTeamRoleRequest) (*AssignTeamRoleResponse, error) + // Unassigns a role from a team. + UnassignTeamRole(context.Context, *UnassignTeamRoleRequest) (*UnassignTeamRoleResponse, error) + // Lists teams assigned to a role. + ListRoleTeams(context.Context, *ListRoleTeamsRequest) (*ListRoleTeamsResponse, error) + // Lists roles assigned to a team. + ListTeamRoles(context.Context, *ListTeamRolesRequest) (*ListTeamRolesResponse, error) + mustEmbedUnimplementedRoleServiceServer() +} + +// UnimplementedRoleServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedRoleServiceServer struct{} + +func (UnimplementedRoleServiceServer) CreateRole(context.Context, *CreateRoleRequest) (*CreateRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateRole not implemented") +} +func (UnimplementedRoleServiceServer) GetRole(context.Context, *GetRoleRequest) (*GetRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRole not implemented") +} +func (UnimplementedRoleServiceServer) ListRoles(context.Context, *ListRolesRequest) (*ListRolesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRoles not implemented") +} +func (UnimplementedRoleServiceServer) UpdateRole(context.Context, *UpdateRoleRequest) (*UpdateRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateRole not implemented") +} +func (UnimplementedRoleServiceServer) DeleteRole(context.Context, *DeleteRoleRequest) (*DeleteRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteRole not implemented") +} +func (UnimplementedRoleServiceServer) AssignTeamRole(context.Context, *AssignTeamRoleRequest) (*AssignTeamRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AssignTeamRole not implemented") +} +func (UnimplementedRoleServiceServer) UnassignTeamRole(context.Context, *UnassignTeamRoleRequest) (*UnassignTeamRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnassignTeamRole not implemented") +} +func (UnimplementedRoleServiceServer) ListRoleTeams(context.Context, *ListRoleTeamsRequest) (*ListRoleTeamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRoleTeams not implemented") +} +func (UnimplementedRoleServiceServer) ListTeamRoles(context.Context, *ListTeamRolesRequest) (*ListTeamRolesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTeamRoles not implemented") +} +func (UnimplementedRoleServiceServer) mustEmbedUnimplementedRoleServiceServer() {} +func (UnimplementedRoleServiceServer) testEmbeddedByValue() {} + +// UnsafeRoleServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RoleServiceServer will +// result in compilation errors. +type UnsafeRoleServiceServer interface { + mustEmbedUnimplementedRoleServiceServer() +} + +func RegisterRoleServiceServer(s grpc.ServiceRegistrar, srv RoleServiceServer) { + // If the following call pancis, it indicates UnimplementedRoleServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&RoleService_ServiceDesc, srv) +} + +func _RoleService_CreateRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).CreateRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_CreateRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).CreateRole(ctx, req.(*CreateRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_GetRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).GetRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_GetRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).GetRole(ctx, req.(*GetRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_ListRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRolesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).ListRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_ListRoles_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).ListRoles(ctx, req.(*ListRolesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_UpdateRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).UpdateRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_UpdateRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).UpdateRole(ctx, req.(*UpdateRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_DeleteRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).DeleteRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_DeleteRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).DeleteRole(ctx, req.(*DeleteRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_AssignTeamRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AssignTeamRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).AssignTeamRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_AssignTeamRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).AssignTeamRole(ctx, req.(*AssignTeamRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_UnassignTeamRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnassignTeamRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).UnassignTeamRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_UnassignTeamRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).UnassignTeamRole(ctx, req.(*UnassignTeamRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_ListRoleTeams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRoleTeamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).ListRoleTeams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_ListRoleTeams_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).ListRoleTeams(ctx, req.(*ListRoleTeamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoleService_ListTeamRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListTeamRolesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoleServiceServer).ListTeamRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoleService_ListTeamRoles_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoleServiceServer).ListTeamRoles(ctx, req.(*ListTeamRolesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// RoleService_ServiceDesc is the grpc.ServiceDesc for RoleService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RoleService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.RoleService", + HandlerType: (*RoleServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateRole", + Handler: _RoleService_CreateRole_Handler, + }, + { + MethodName: "GetRole", + Handler: _RoleService_GetRole_Handler, + }, + { + MethodName: "ListRoles", + Handler: _RoleService_ListRoles_Handler, + }, + { + MethodName: "UpdateRole", + Handler: _RoleService_UpdateRole_Handler, + }, + { + MethodName: "DeleteRole", + Handler: _RoleService_DeleteRole_Handler, + }, + { + MethodName: "AssignTeamRole", + Handler: _RoleService_AssignTeamRole_Handler, + }, + { + MethodName: "UnassignTeamRole", + Handler: _RoleService_UnassignTeamRole_Handler, + }, + { + MethodName: "ListRoleTeams", + Handler: _RoleService_ListRoleTeams_Handler, + }, + { + MethodName: "ListTeamRoles", + Handler: _RoleService_ListTeamRoles_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/role.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.go new file mode 100644 index 0000000000..8d30982861 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.go @@ -0,0 +1,965 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/routing.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Response message for CreateRoutingRule RPC. +type CreateRoutingRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoutingRule *RoutingRule `protobuf:"bytes,1,opt,name=routing_rule,json=routingRule,proto3" json:"routing_rule,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoutingRuleResponse) Reset() { + *x = CreateRoutingRuleResponse{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoutingRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoutingRuleResponse) ProtoMessage() {} + +func (x *CreateRoutingRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoutingRuleResponse.ProtoReflect.Descriptor instead. +func (*CreateRoutingRuleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateRoutingRuleResponse) GetRoutingRule() *RoutingRule { + if x != nil { + return x.RoutingRule + } + return nil +} + +// Response message for GetRoutingRule RPC. +type GetRoutingRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoutingRule *RoutingRule `protobuf:"bytes,1,opt,name=routing_rule,json=routingRule,proto3" json:"routing_rule,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoutingRuleResponse) Reset() { + *x = GetRoutingRuleResponse{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoutingRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoutingRuleResponse) ProtoMessage() {} + +func (x *GetRoutingRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoutingRuleResponse.ProtoReflect.Descriptor instead. +func (*GetRoutingRuleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{1} +} + +func (x *GetRoutingRuleResponse) GetRoutingRule() *RoutingRule { + if x != nil { + return x.RoutingRule + } + return nil +} + +// Response message for UpdateRoutingRule RPC. +type UpdateRoutingRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoutingRule *RoutingRule `protobuf:"bytes,1,opt,name=routing_rule,json=routingRule,proto3" json:"routing_rule,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoutingRuleResponse) Reset() { + *x = UpdateRoutingRuleResponse{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoutingRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoutingRuleResponse) ProtoMessage() {} + +func (x *UpdateRoutingRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoutingRuleResponse.ProtoReflect.Descriptor instead. +func (*UpdateRoutingRuleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateRoutingRuleResponse) GetRoutingRule() *RoutingRule { + if x != nil { + return x.RoutingRule + } + return nil +} + +// Response message for DeleteRoutingRule RPC. +type DeleteRoutingRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoutingRuleResponse) Reset() { + *x = DeleteRoutingRuleResponse{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoutingRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoutingRuleResponse) ProtoMessage() {} + +func (x *DeleteRoutingRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoutingRuleResponse.ProtoReflect.Descriptor instead. +func (*DeleteRoutingRuleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{3} +} + +type RoutingRule struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` + Expression string `protobuf:"bytes,5,opt,name=expression,proto3" json:"expression,omitempty"` + BackendPool string `protobuf:"bytes,6,opt,name=backend_pool,json=backendPool,proto3" json:"backend_pool,omitempty"` + // Optional fallback backend pool to use when primary pool fails. + // Must reference a different pool than backend_pool. + FallbackPool string `protobuf:"bytes,11,opt,name=fallback_pool,json=fallbackPool,proto3" json:"fallback_pool,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Metadata map[string]string `protobuf:"bytes,8,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RoutingRule) Reset() { + *x = RoutingRule{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RoutingRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoutingRule) ProtoMessage() {} + +func (x *RoutingRule) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoutingRule.ProtoReflect.Descriptor instead. +func (*RoutingRule) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{4} +} + +func (x *RoutingRule) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RoutingRule) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *RoutingRule) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *RoutingRule) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *RoutingRule) GetExpression() string { + if x != nil { + return x.Expression + } + return "" +} + +func (x *RoutingRule) GetBackendPool() string { + if x != nil { + return x.BackendPool + } + return "" +} + +func (x *RoutingRule) GetFallbackPool() string { + if x != nil { + return x.FallbackPool + } + return "" +} + +func (x *RoutingRule) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *RoutingRule) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *RoutingRule) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *RoutingRule) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +type CreateRoutingRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + RoutingRule *RoutingRule `protobuf:"bytes,3,opt,name=routing_rule,json=routingRule,proto3" json:"routing_rule,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoutingRuleRequest) Reset() { + *x = CreateRoutingRuleRequest{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoutingRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoutingRuleRequest) ProtoMessage() {} + +func (x *CreateRoutingRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoutingRuleRequest.ProtoReflect.Descriptor instead. +func (*CreateRoutingRuleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateRoutingRuleRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateRoutingRuleRequest) GetRoutingRule() *RoutingRule { + if x != nil { + return x.RoutingRule + } + return nil +} + +type GetRoutingRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoutingRuleRequest) Reset() { + *x = GetRoutingRuleRequest{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoutingRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoutingRuleRequest) ProtoMessage() {} + +func (x *GetRoutingRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoutingRuleRequest.ProtoReflect.Descriptor instead. +func (*GetRoutingRuleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{6} +} + +func (x *GetRoutingRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListRoutingRulesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoutingRulesRequest) Reset() { + *x = ListRoutingRulesRequest{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoutingRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoutingRulesRequest) ProtoMessage() {} + +func (x *ListRoutingRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoutingRulesRequest.ProtoReflect.Descriptor instead. +func (*ListRoutingRulesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{7} +} + +func (x *ListRoutingRulesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListRoutingRulesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRoutingRulesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListRoutingRulesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListRoutingRulesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListRoutingRulesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoutingRules []*RoutingRule `protobuf:"bytes,1,rep,name=routing_rules,json=routingRules,proto3" json:"routing_rules,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoutingRulesResponse) Reset() { + *x = ListRoutingRulesResponse{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoutingRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoutingRulesResponse) ProtoMessage() {} + +func (x *ListRoutingRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoutingRulesResponse.ProtoReflect.Descriptor instead. +func (*ListRoutingRulesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{8} +} + +func (x *ListRoutingRulesResponse) GetRoutingRules() []*RoutingRule { + if x != nil { + return x.RoutingRules + } + return nil +} + +func (x *ListRoutingRulesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListRoutingRulesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateRoutingRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoutingRule *RoutingRule `protobuf:"bytes,1,opt,name=routing_rule,json=routingRule,proto3" json:"routing_rule,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoutingRuleRequest) Reset() { + *x = UpdateRoutingRuleRequest{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoutingRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoutingRuleRequest) ProtoMessage() {} + +func (x *UpdateRoutingRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoutingRuleRequest.ProtoReflect.Descriptor instead. +func (*UpdateRoutingRuleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateRoutingRuleRequest) GetRoutingRule() *RoutingRule { + if x != nil { + return x.RoutingRule + } + return nil +} + +func (x *UpdateRoutingRuleRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteRoutingRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoutingRuleRequest) Reset() { + *x = DeleteRoutingRuleRequest{} + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoutingRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoutingRuleRequest) ProtoMessage() {} + +func (x *DeleteRoutingRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_routing_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoutingRuleRequest.ProtoReflect.Descriptor instead. +func (*DeleteRoutingRuleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteRoutingRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_redpanda_api_aigateway_v1_routing_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_routing_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, + 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x63, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x49, 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x9a, 0x06, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0c, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe7, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x54, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x31, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, + 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x4f, 0x0a, 0x0d, 0x66, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, + 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0c, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x76, 0xea, 0x41, 0x73, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2f, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x2f, 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x7d, 0x12, + 0x1c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x7b, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x7d, 0x22, 0x99, 0x01, + 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x57, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xae, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, + 0x22, 0x5a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xcb, 0x08, 0x0a, + 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0xde, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x5e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x58, 0x3a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5a, 0x21, 0x3a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, + 0x2a, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0xc2, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, + 0x5a, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x25, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xbf, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x5a, 0x13, 0x12, 0x11, 0x2f, + 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x82, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x33, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x7b, 0x3a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5a, + 0x37, 0x3a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x32, + 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x32, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcb, 0x01, 0x0a, + 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x5a, 0x1c, 0x2a, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x2f, 0x2a, 0x7d, 0x2a, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x42, 0x81, 0x02, 0x0a, 0x1d, 0x63, + 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, + 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, + 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, + 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_routing_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_routing_proto_rawDescData = file_redpanda_api_aigateway_v1_routing_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_routing_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_routing_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_routing_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_routing_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_routing_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_routing_proto_goTypes = []any{ + (*CreateRoutingRuleResponse)(nil), // 0: redpanda.api.aigateway.v1.CreateRoutingRuleResponse + (*GetRoutingRuleResponse)(nil), // 1: redpanda.api.aigateway.v1.GetRoutingRuleResponse + (*UpdateRoutingRuleResponse)(nil), // 2: redpanda.api.aigateway.v1.UpdateRoutingRuleResponse + (*DeleteRoutingRuleResponse)(nil), // 3: redpanda.api.aigateway.v1.DeleteRoutingRuleResponse + (*RoutingRule)(nil), // 4: redpanda.api.aigateway.v1.RoutingRule + (*CreateRoutingRuleRequest)(nil), // 5: redpanda.api.aigateway.v1.CreateRoutingRuleRequest + (*GetRoutingRuleRequest)(nil), // 6: redpanda.api.aigateway.v1.GetRoutingRuleRequest + (*ListRoutingRulesRequest)(nil), // 7: redpanda.api.aigateway.v1.ListRoutingRulesRequest + (*ListRoutingRulesResponse)(nil), // 8: redpanda.api.aigateway.v1.ListRoutingRulesResponse + (*UpdateRoutingRuleRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateRoutingRuleRequest + (*DeleteRoutingRuleRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteRoutingRuleRequest + nil, // 11: redpanda.api.aigateway.v1.RoutingRule.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_routing_proto_depIdxs = []int32{ + 4, // 0: redpanda.api.aigateway.v1.CreateRoutingRuleResponse.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 4, // 1: redpanda.api.aigateway.v1.GetRoutingRuleResponse.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 4, // 2: redpanda.api.aigateway.v1.UpdateRoutingRuleResponse.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 11, // 3: redpanda.api.aigateway.v1.RoutingRule.metadata:type_name -> redpanda.api.aigateway.v1.RoutingRule.MetadataEntry + 12, // 4: redpanda.api.aigateway.v1.RoutingRule.create_time:type_name -> google.protobuf.Timestamp + 12, // 5: redpanda.api.aigateway.v1.RoutingRule.update_time:type_name -> google.protobuf.Timestamp + 4, // 6: redpanda.api.aigateway.v1.CreateRoutingRuleRequest.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 4, // 7: redpanda.api.aigateway.v1.ListRoutingRulesResponse.routing_rules:type_name -> redpanda.api.aigateway.v1.RoutingRule + 4, // 8: redpanda.api.aigateway.v1.UpdateRoutingRuleRequest.routing_rule:type_name -> redpanda.api.aigateway.v1.RoutingRule + 13, // 9: redpanda.api.aigateway.v1.UpdateRoutingRuleRequest.update_mask:type_name -> google.protobuf.FieldMask + 5, // 10: redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule:input_type -> redpanda.api.aigateway.v1.CreateRoutingRuleRequest + 6, // 11: redpanda.api.aigateway.v1.RoutingService.GetRoutingRule:input_type -> redpanda.api.aigateway.v1.GetRoutingRuleRequest + 7, // 12: redpanda.api.aigateway.v1.RoutingService.ListRoutingRules:input_type -> redpanda.api.aigateway.v1.ListRoutingRulesRequest + 9, // 13: redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule:input_type -> redpanda.api.aigateway.v1.UpdateRoutingRuleRequest + 10, // 14: redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule:input_type -> redpanda.api.aigateway.v1.DeleteRoutingRuleRequest + 0, // 15: redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule:output_type -> redpanda.api.aigateway.v1.CreateRoutingRuleResponse + 1, // 16: redpanda.api.aigateway.v1.RoutingService.GetRoutingRule:output_type -> redpanda.api.aigateway.v1.GetRoutingRuleResponse + 8, // 17: redpanda.api.aigateway.v1.RoutingService.ListRoutingRules:output_type -> redpanda.api.aigateway.v1.ListRoutingRulesResponse + 2, // 18: redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule:output_type -> redpanda.api.aigateway.v1.UpdateRoutingRuleResponse + 3, // 19: redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule:output_type -> redpanda.api.aigateway.v1.DeleteRoutingRuleResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_routing_proto_init() } +func file_redpanda_api_aigateway_v1_routing_proto_init() { + if File_redpanda_api_aigateway_v1_routing_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_routing_proto_rawDesc, + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_routing_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_routing_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_routing_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_routing_proto = out.File + file_redpanda_api_aigateway_v1_routing_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_routing_proto_goTypes = nil + file_redpanda_api_aigateway_v1_routing_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.gw.go new file mode 100644 index 0000000000..1c435d04d2 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing.pb.gw.go @@ -0,0 +1,973 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/routing.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_RoutingService_CreateRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.CreateRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_CreateRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.CreateRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoutingService_CreateRoutingRule_1 = &utilities.DoubleArray{Encoding: map[string]int{"routing_rule": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoutingService_CreateRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoutingRuleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_CreateRoutingRule_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_CreateRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateRoutingRuleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_CreateRoutingRule_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoutingService_GetRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_GetRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoutingService_GetRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_GetRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoutingService_ListRoutingRules_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_RoutingService_ListRoutingRules_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoutingRulesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_ListRoutingRules_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRoutingRules(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_ListRoutingRules_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoutingRulesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_ListRoutingRules_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRoutingRules(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoutingService_ListRoutingRules_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_RoutingService_ListRoutingRules_1(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoutingRulesRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_ListRoutingRules_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRoutingRules(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_ListRoutingRules_1(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRoutingRulesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_ListRoutingRules_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRoutingRules(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoutingService_UpdateRoutingRule_0 = &utilities.DoubleArray{Encoding: map[string]int{"routing_rule": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_RoutingService_UpdateRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RoutingRule); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["routing_rule.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "routing_rule.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "routing_rule.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "routing_rule.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_UpdateRoutingRule_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_UpdateRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RoutingRule); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["routing_rule.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "routing_rule.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "routing_rule.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "routing_rule.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_UpdateRoutingRule_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +var filter_RoutingService_UpdateRoutingRule_1 = &utilities.DoubleArray{Encoding: map[string]int{"routing_rule": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_RoutingService_UpdateRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RoutingRule); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["routing_rule.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "routing_rule.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "routing_rule.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "routing_rule.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_UpdateRoutingRule_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_UpdateRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.RoutingRule); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.RoutingRule); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["routing_rule.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "routing_rule.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "routing_rule.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "routing_rule.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingService_UpdateRoutingRule_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoutingService_DeleteRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_DeleteRoutingRule_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +func request_RoutingService_DeleteRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, client RoutingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteRoutingRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_RoutingService_DeleteRoutingRule_1(ctx context.Context, marshaler runtime.Marshaler, server RoutingServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteRoutingRuleRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteRoutingRule(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterRoutingServiceHandlerServer registers the http handlers for service RoutingService to "mux". +// UnaryRPC :call RoutingServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRoutingServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterRoutingServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoutingServiceServer) error { + mux.Handle(http.MethodPost, pattern_RoutingService_CreateRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_CreateRoutingRule_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_CreateRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoutingService_CreateRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule", runtime.WithHTTPPathPattern("/v1/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_CreateRoutingRule_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_CreateRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_GetRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_GetRoutingRule_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_GetRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_GetRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_GetRoutingRule_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_GetRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_ListRoutingRules_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_ListRoutingRules_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_ListRoutingRules_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_ListRoutingRules_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules", runtime.WithHTTPPathPattern("/v1/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_ListRoutingRules_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_ListRoutingRules_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoutingService_UpdateRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule", runtime.WithHTTPPathPattern("/v1/{routing_rule.name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_UpdateRoutingRule_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_UpdateRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoutingService_UpdateRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule", runtime.WithHTTPPathPattern("/v1/{routing_rule.name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_UpdateRoutingRule_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_UpdateRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoutingService_DeleteRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_DeleteRoutingRule_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_DeleteRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoutingService_DeleteRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RoutingService_DeleteRoutingRule_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_DeleteRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterRoutingServiceHandlerFromEndpoint is same as RegisterRoutingServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterRoutingServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterRoutingServiceHandler(ctx, mux, conn) +} + +// RegisterRoutingServiceHandler registers the http handlers for service RoutingService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterRoutingServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRoutingServiceHandlerClient(ctx, mux, NewRoutingServiceClient(conn)) +} + +// RegisterRoutingServiceHandlerClient registers the http handlers for service RoutingService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RoutingServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RoutingServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "RoutingServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterRoutingServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoutingServiceClient) error { + mux.Handle(http.MethodPost, pattern_RoutingService_CreateRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_CreateRoutingRule_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_CreateRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_RoutingService_CreateRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule", runtime.WithHTTPPathPattern("/v1/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_CreateRoutingRule_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_CreateRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_GetRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_GetRoutingRule_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_GetRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_GetRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_GetRoutingRule_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_GetRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_ListRoutingRules_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_ListRoutingRules_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_ListRoutingRules_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_RoutingService_ListRoutingRules_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules", runtime.WithHTTPPathPattern("/v1/routing-rules")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_ListRoutingRules_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_ListRoutingRules_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoutingService_UpdateRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule", runtime.WithHTTPPathPattern("/v1/{routing_rule.name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_UpdateRoutingRule_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_UpdateRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_RoutingService_UpdateRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule", runtime.WithHTTPPathPattern("/v1/{routing_rule.name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_UpdateRoutingRule_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_UpdateRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoutingService_DeleteRoutingRule_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_DeleteRoutingRule_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_DeleteRoutingRule_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RoutingService_DeleteRoutingRule_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule", runtime.WithHTTPPathPattern("/v1/{name=routing-rules/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_RoutingService_DeleteRoutingRule_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RoutingService_DeleteRoutingRule_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_RoutingService_CreateRoutingRule_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "routing-rules"}, "")) + pattern_RoutingService_CreateRoutingRule_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "routing-rules"}, "")) + pattern_RoutingService_GetRoutingRule_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "routing-rules", "name"}, "")) + pattern_RoutingService_GetRoutingRule_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "routing-rules", "name"}, "")) + pattern_RoutingService_ListRoutingRules_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "routing-rules"}, "")) + pattern_RoutingService_ListRoutingRules_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "routing-rules"}, "")) + pattern_RoutingService_UpdateRoutingRule_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "routing-rules", "routing_rule.name"}, "")) + pattern_RoutingService_UpdateRoutingRule_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "routing-rules", "routing_rule.name"}, "")) + pattern_RoutingService_DeleteRoutingRule_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "routing-rules", "name"}, "")) + pattern_RoutingService_DeleteRoutingRule_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "routing-rules", "name"}, "")) +) + +var ( + forward_RoutingService_CreateRoutingRule_0 = runtime.ForwardResponseMessage + forward_RoutingService_CreateRoutingRule_1 = runtime.ForwardResponseMessage + forward_RoutingService_GetRoutingRule_0 = runtime.ForwardResponseMessage + forward_RoutingService_GetRoutingRule_1 = runtime.ForwardResponseMessage + forward_RoutingService_ListRoutingRules_0 = runtime.ForwardResponseMessage + forward_RoutingService_ListRoutingRules_1 = runtime.ForwardResponseMessage + forward_RoutingService_UpdateRoutingRule_0 = runtime.ForwardResponseMessage + forward_RoutingService_UpdateRoutingRule_1 = runtime.ForwardResponseMessage + forward_RoutingService_DeleteRoutingRule_0 = runtime.ForwardResponseMessage + forward_RoutingService_DeleteRoutingRule_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/routing_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing_grpc.pb.go new file mode 100644 index 0000000000..25f30b3488 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/routing_grpc.pb.go @@ -0,0 +1,274 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/routing.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + RoutingService_CreateRoutingRule_FullMethodName = "/redpanda.api.aigateway.v1.RoutingService/CreateRoutingRule" + RoutingService_GetRoutingRule_FullMethodName = "/redpanda.api.aigateway.v1.RoutingService/GetRoutingRule" + RoutingService_ListRoutingRules_FullMethodName = "/redpanda.api.aigateway.v1.RoutingService/ListRoutingRules" + RoutingService_UpdateRoutingRule_FullMethodName = "/redpanda.api.aigateway.v1.RoutingService/UpdateRoutingRule" + RoutingService_DeleteRoutingRule_FullMethodName = "/redpanda.api.aigateway.v1.RoutingService/DeleteRoutingRule" +) + +// RoutingServiceClient is the client API for RoutingService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RoutingServiceClient interface { + CreateRoutingRule(ctx context.Context, in *CreateRoutingRuleRequest, opts ...grpc.CallOption) (*CreateRoutingRuleResponse, error) + GetRoutingRule(ctx context.Context, in *GetRoutingRuleRequest, opts ...grpc.CallOption) (*GetRoutingRuleResponse, error) + ListRoutingRules(ctx context.Context, in *ListRoutingRulesRequest, opts ...grpc.CallOption) (*ListRoutingRulesResponse, error) + UpdateRoutingRule(ctx context.Context, in *UpdateRoutingRuleRequest, opts ...grpc.CallOption) (*UpdateRoutingRuleResponse, error) + DeleteRoutingRule(ctx context.Context, in *DeleteRoutingRuleRequest, opts ...grpc.CallOption) (*DeleteRoutingRuleResponse, error) +} + +type routingServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewRoutingServiceClient(cc grpc.ClientConnInterface) RoutingServiceClient { + return &routingServiceClient{cc} +} + +func (c *routingServiceClient) CreateRoutingRule(ctx context.Context, in *CreateRoutingRuleRequest, opts ...grpc.CallOption) (*CreateRoutingRuleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateRoutingRuleResponse) + err := c.cc.Invoke(ctx, RoutingService_CreateRoutingRule_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *routingServiceClient) GetRoutingRule(ctx context.Context, in *GetRoutingRuleRequest, opts ...grpc.CallOption) (*GetRoutingRuleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetRoutingRuleResponse) + err := c.cc.Invoke(ctx, RoutingService_GetRoutingRule_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *routingServiceClient) ListRoutingRules(ctx context.Context, in *ListRoutingRulesRequest, opts ...grpc.CallOption) (*ListRoutingRulesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRoutingRulesResponse) + err := c.cc.Invoke(ctx, RoutingService_ListRoutingRules_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *routingServiceClient) UpdateRoutingRule(ctx context.Context, in *UpdateRoutingRuleRequest, opts ...grpc.CallOption) (*UpdateRoutingRuleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateRoutingRuleResponse) + err := c.cc.Invoke(ctx, RoutingService_UpdateRoutingRule_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *routingServiceClient) DeleteRoutingRule(ctx context.Context, in *DeleteRoutingRuleRequest, opts ...grpc.CallOption) (*DeleteRoutingRuleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteRoutingRuleResponse) + err := c.cc.Invoke(ctx, RoutingService_DeleteRoutingRule_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RoutingServiceServer is the server API for RoutingService service. +// All implementations must embed UnimplementedRoutingServiceServer +// for forward compatibility. +type RoutingServiceServer interface { + CreateRoutingRule(context.Context, *CreateRoutingRuleRequest) (*CreateRoutingRuleResponse, error) + GetRoutingRule(context.Context, *GetRoutingRuleRequest) (*GetRoutingRuleResponse, error) + ListRoutingRules(context.Context, *ListRoutingRulesRequest) (*ListRoutingRulesResponse, error) + UpdateRoutingRule(context.Context, *UpdateRoutingRuleRequest) (*UpdateRoutingRuleResponse, error) + DeleteRoutingRule(context.Context, *DeleteRoutingRuleRequest) (*DeleteRoutingRuleResponse, error) + mustEmbedUnimplementedRoutingServiceServer() +} + +// UnimplementedRoutingServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedRoutingServiceServer struct{} + +func (UnimplementedRoutingServiceServer) CreateRoutingRule(context.Context, *CreateRoutingRuleRequest) (*CreateRoutingRuleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateRoutingRule not implemented") +} +func (UnimplementedRoutingServiceServer) GetRoutingRule(context.Context, *GetRoutingRuleRequest) (*GetRoutingRuleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoutingRule not implemented") +} +func (UnimplementedRoutingServiceServer) ListRoutingRules(context.Context, *ListRoutingRulesRequest) (*ListRoutingRulesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRoutingRules not implemented") +} +func (UnimplementedRoutingServiceServer) UpdateRoutingRule(context.Context, *UpdateRoutingRuleRequest) (*UpdateRoutingRuleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateRoutingRule not implemented") +} +func (UnimplementedRoutingServiceServer) DeleteRoutingRule(context.Context, *DeleteRoutingRuleRequest) (*DeleteRoutingRuleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteRoutingRule not implemented") +} +func (UnimplementedRoutingServiceServer) mustEmbedUnimplementedRoutingServiceServer() {} +func (UnimplementedRoutingServiceServer) testEmbeddedByValue() {} + +// UnsafeRoutingServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RoutingServiceServer will +// result in compilation errors. +type UnsafeRoutingServiceServer interface { + mustEmbedUnimplementedRoutingServiceServer() +} + +func RegisterRoutingServiceServer(s grpc.ServiceRegistrar, srv RoutingServiceServer) { + // If the following call pancis, it indicates UnimplementedRoutingServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&RoutingService_ServiceDesc, srv) +} + +func _RoutingService_CreateRoutingRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRoutingRuleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoutingServiceServer).CreateRoutingRule(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoutingService_CreateRoutingRule_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoutingServiceServer).CreateRoutingRule(ctx, req.(*CreateRoutingRuleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoutingService_GetRoutingRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoutingRuleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoutingServiceServer).GetRoutingRule(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoutingService_GetRoutingRule_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoutingServiceServer).GetRoutingRule(ctx, req.(*GetRoutingRuleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoutingService_ListRoutingRules_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRoutingRulesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoutingServiceServer).ListRoutingRules(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoutingService_ListRoutingRules_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoutingServiceServer).ListRoutingRules(ctx, req.(*ListRoutingRulesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoutingService_UpdateRoutingRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRoutingRuleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoutingServiceServer).UpdateRoutingRule(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoutingService_UpdateRoutingRule_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoutingServiceServer).UpdateRoutingRule(ctx, req.(*UpdateRoutingRuleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RoutingService_DeleteRoutingRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRoutingRuleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoutingServiceServer).DeleteRoutingRule(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoutingService_DeleteRoutingRule_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoutingServiceServer).DeleteRoutingRule(ctx, req.(*DeleteRoutingRuleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// RoutingService_ServiceDesc is the grpc.ServiceDesc for RoutingService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RoutingService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.RoutingService", + HandlerType: (*RoutingServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateRoutingRule", + Handler: _RoutingService_CreateRoutingRule_Handler, + }, + { + MethodName: "GetRoutingRule", + Handler: _RoutingService_GetRoutingRule_Handler, + }, + { + MethodName: "ListRoutingRules", + Handler: _RoutingService_ListRoutingRules_Handler, + }, + { + MethodName: "UpdateRoutingRule", + Handler: _RoutingService_UpdateRoutingRule_Handler, + }, + { + MethodName: "DeleteRoutingRule", + Handler: _RoutingService_DeleteRoutingRule_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/routing.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.go new file mode 100644 index 0000000000..8c35836d77 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.go @@ -0,0 +1,1496 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/settings.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Request message for GetSettings RPC. +type GetSettingsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSettingsRequest) Reset() { + *x = GetSettingsRequest{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSettingsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSettingsRequest) ProtoMessage() {} + +func (x *GetSettingsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSettingsRequest.ProtoReflect.Descriptor instead. +func (*GetSettingsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{0} +} + +// Response message for GetSettings RPC. +type GetSettingsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Settings *Settings `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSettingsResponse) Reset() { + *x = GetSettingsResponse{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSettingsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSettingsResponse) ProtoMessage() {} + +func (x *GetSettingsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSettingsResponse.ProtoReflect.Descriptor instead. +func (*GetSettingsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{1} +} + +func (x *GetSettingsResponse) GetSettings() *Settings { + if x != nil { + return x.Settings + } + return nil +} + +// Request message for UpdateSettings RPC. +type UpdateSettingsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Updated settings + Settings *Settings `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateSettingsRequest) Reset() { + *x = UpdateSettingsRequest{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateSettingsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSettingsRequest) ProtoMessage() {} + +func (x *UpdateSettingsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateSettingsRequest.ProtoReflect.Descriptor instead. +func (*UpdateSettingsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateSettingsRequest) GetSettings() *Settings { + if x != nil { + return x.Settings + } + return nil +} + +// Response message for UpdateSettings RPC. +type UpdateSettingsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Settings *Settings `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateSettingsResponse) Reset() { + *x = UpdateSettingsResponse{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateSettingsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSettingsResponse) ProtoMessage() {} + +func (x *UpdateSettingsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateSettingsResponse.ProtoReflect.Descriptor instead. +func (*UpdateSettingsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateSettingsResponse) GetSettings() *Settings { + if x != nil { + return x.Settings + } + return nil +} + +// Settings represents global deployment-wide configuration. +// These settings are shared by ALL virtual gateways. +type Settings struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Global storage configuration (Redis, PostgreSQL instances) + Storage *Storage `protobuf:"bytes,1,opt,name=storage,proto3" json:"storage,omitempty"` + // Global rate limiter infrastructure defaults (optional) + RateLimiterDefaults *RateLimiterInfra `protobuf:"bytes,2,opt,name=rate_limiter_defaults,json=rateLimiterDefaults,proto3" json:"rate_limiter_defaults,omitempty"` + // Global spend limiter infrastructure defaults (optional) + SpendLimiterDefaults *SpendLimiterInfra `protobuf:"bytes,3,opt,name=spend_limiter_defaults,json=spendLimiterDefaults,proto3" json:"spend_limiter_defaults,omitempty"` + // Global OIDC authentication configuration (optional) + // When enabled, all gateways will require JWT token validation + Oidc *OIDCConfig `protobuf:"bytes,4,opt,name=oidc,proto3" json:"oidc,omitempty"` + // Global MCP gateway configuration (optional) + // Configures session management for all MCP backends + McpGateway *MCPGatewayConfig `protobuf:"bytes,5,opt,name=mcp_gateway,json=mcpGateway,proto3" json:"mcp_gateway,omitempty"` + // Metadata + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,100,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,101,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Settings) Reset() { + *x = Settings{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Settings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Settings) ProtoMessage() {} + +func (x *Settings) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Settings.ProtoReflect.Descriptor instead. +func (*Settings) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{4} +} + +func (x *Settings) GetStorage() *Storage { + if x != nil { + return x.Storage + } + return nil +} + +func (x *Settings) GetRateLimiterDefaults() *RateLimiterInfra { + if x != nil { + return x.RateLimiterDefaults + } + return nil +} + +func (x *Settings) GetSpendLimiterDefaults() *SpendLimiterInfra { + if x != nil { + return x.SpendLimiterDefaults + } + return nil +} + +func (x *Settings) GetOidc() *OIDCConfig { + if x != nil { + return x.Oidc + } + return nil +} + +func (x *Settings) GetMcpGateway() *MCPGatewayConfig { + if x != nil { + return x.McpGateway + } + return nil +} + +func (x *Settings) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *Settings) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +// Storage represents centralized storage configuration. +// Components reference these storage backends by ID. +type Storage struct { + state protoimpl.MessageState `protogen:"open.v1"` + // List of Redis instances for distributed state + Redis []*RedisInstance `protobuf:"bytes,1,rep,name=redis,proto3" json:"redis,omitempty"` + // List of PostgreSQL instances for persistent storage + Postgresql []*PostgreSQLInstance `protobuf:"bytes,2,rep,name=postgresql,proto3" json:"postgresql,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Storage) Reset() { + *x = Storage{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Storage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Storage) ProtoMessage() {} + +func (x *Storage) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Storage.ProtoReflect.Descriptor instead. +func (*Storage) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{5} +} + +func (x *Storage) GetRedis() []*RedisInstance { + if x != nil { + return x.Redis + } + return nil +} + +func (x *Storage) GetPostgresql() []*PostgreSQLInstance { + if x != nil { + return x.Postgresql + } + return nil +} + +// RedisInstance represents a single Redis instance configuration. +type RedisInstance struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Unique identifier for this Redis instance + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Required: Redis server address (host:port) + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + // Optional: Human-readable description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Optional: Redis password + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + // Optional: TLS configuration + TlsEnabled bool `protobuf:"varint,5,opt,name=tls_enabled,json=tlsEnabled,proto3" json:"tls_enabled,omitempty"` + TlsInsecureSkipVerify bool `protobuf:"varint,6,opt,name=tls_insecure_skip_verify,json=tlsInsecureSkipVerify,proto3" json:"tls_insecure_skip_verify,omitempty"` + TlsCertFile string `protobuf:"bytes,7,opt,name=tls_cert_file,json=tlsCertFile,proto3" json:"tls_cert_file,omitempty"` + TlsKeyFile string `protobuf:"bytes,8,opt,name=tls_key_file,json=tlsKeyFile,proto3" json:"tls_key_file,omitempty"` + TlsCaCertFile string `protobuf:"bytes,9,opt,name=tls_ca_cert_file,json=tlsCaCertFile,proto3" json:"tls_ca_cert_file,omitempty"` + TlsServerName string `protobuf:"bytes,10,opt,name=tls_server_name,json=tlsServerName,proto3" json:"tls_server_name,omitempty"` + // Optional: Connection pool size (default: 50) + PoolSize int32 `protobuf:"varint,11,opt,name=pool_size,json=poolSize,proto3" json:"pool_size,omitempty"` + // Optional: Redis operation timeout in milliseconds (default: 200) + Timeout int32 `protobuf:"varint,12,opt,name=timeout,proto3" json:"timeout,omitempty"` + // Required: Database allocation per component + Databases *RedisDatabases `protobuf:"bytes,13,opt,name=databases,proto3" json:"databases,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RedisInstance) Reset() { + *x = RedisInstance{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RedisInstance) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedisInstance) ProtoMessage() {} + +func (x *RedisInstance) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedisInstance.ProtoReflect.Descriptor instead. +func (*RedisInstance) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{6} +} + +func (x *RedisInstance) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *RedisInstance) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *RedisInstance) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *RedisInstance) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *RedisInstance) GetTlsEnabled() bool { + if x != nil { + return x.TlsEnabled + } + return false +} + +func (x *RedisInstance) GetTlsInsecureSkipVerify() bool { + if x != nil { + return x.TlsInsecureSkipVerify + } + return false +} + +func (x *RedisInstance) GetTlsCertFile() string { + if x != nil { + return x.TlsCertFile + } + return "" +} + +func (x *RedisInstance) GetTlsKeyFile() string { + if x != nil { + return x.TlsKeyFile + } + return "" +} + +func (x *RedisInstance) GetTlsCaCertFile() string { + if x != nil { + return x.TlsCaCertFile + } + return "" +} + +func (x *RedisInstance) GetTlsServerName() string { + if x != nil { + return x.TlsServerName + } + return "" +} + +func (x *RedisInstance) GetPoolSize() int32 { + if x != nil { + return x.PoolSize + } + return 0 +} + +func (x *RedisInstance) GetTimeout() int32 { + if x != nil { + return x.Timeout + } + return 0 +} + +func (x *RedisInstance) GetDatabases() *RedisDatabases { + if x != nil { + return x.Databases + } + return nil +} + +// RedisDatabases defines database numbers for each component. +type RedisDatabases struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Database for rate limiter counters (default: 0) + RateLimiter int32 `protobuf:"varint,1,opt,name=rate_limiter,json=rateLimiter,proto3" json:"rate_limiter,omitempty"` + // Database for token tracker query cache (default: 1) + TokenTrackerCache int32 `protobuf:"varint,2,opt,name=token_tracker_cache,json=tokenTrackerCache,proto3" json:"token_tracker_cache,omitempty"` + // Database for MCP session manager (default: 2) + SessionManager int32 `protobuf:"varint,3,opt,name=session_manager,json=sessionManager,proto3" json:"session_manager,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RedisDatabases) Reset() { + *x = RedisDatabases{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RedisDatabases) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedisDatabases) ProtoMessage() {} + +func (x *RedisDatabases) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedisDatabases.ProtoReflect.Descriptor instead. +func (*RedisDatabases) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{7} +} + +func (x *RedisDatabases) GetRateLimiter() int32 { + if x != nil { + return x.RateLimiter + } + return 0 +} + +func (x *RedisDatabases) GetTokenTrackerCache() int32 { + if x != nil { + return x.TokenTrackerCache + } + return 0 +} + +func (x *RedisDatabases) GetSessionManager() int32 { + if x != nil { + return x.SessionManager + } + return 0 +} + +// PostgreSQLInstance represents a single PostgreSQL instance configuration. +type PostgreSQLInstance struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Unique identifier for this PostgreSQL instance + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Required: PostgreSQL host + Host string `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"` + // Required: PostgreSQL port (default: 5432) + Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"` + // Required: Database name + Database string `protobuf:"bytes,4,opt,name=database,proto3" json:"database,omitempty"` + // Required: Database user + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` + // Optional: Database password + Password string `protobuf:"bytes,6,opt,name=password,proto3" json:"password,omitempty"` + // Optional: Human-readable description + Description string `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"` + // Optional: SSL mode (default: "require") + // Valid values: "disable", "require", "verify-ca", "verify-full" + SslMode string `protobuf:"bytes,8,opt,name=ssl_mode,json=sslMode,proto3" json:"ssl_mode,omitempty"` + // Optional: Connection pool settings + MaxConns int32 `protobuf:"varint,9,opt,name=max_conns,json=maxConns,proto3" json:"max_conns,omitempty"` // Default: 20 + MinConns int32 `protobuf:"varint,10,opt,name=min_conns,json=minConns,proto3" json:"min_conns,omitempty"` // Default: 5 + MaxConnLifetime int32 `protobuf:"varint,11,opt,name=max_conn_lifetime,json=maxConnLifetime,proto3" json:"max_conn_lifetime,omitempty"` // seconds, default: 3600 + MaxConnIdleTime int32 `protobuf:"varint,12,opt,name=max_conn_idle_time,json=maxConnIdleTime,proto3" json:"max_conn_idle_time,omitempty"` // seconds, default: 300 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PostgreSQLInstance) Reset() { + *x = PostgreSQLInstance{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PostgreSQLInstance) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PostgreSQLInstance) ProtoMessage() {} + +func (x *PostgreSQLInstance) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PostgreSQLInstance.ProtoReflect.Descriptor instead. +func (*PostgreSQLInstance) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{8} +} + +func (x *PostgreSQLInstance) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *PostgreSQLInstance) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *PostgreSQLInstance) GetPort() int32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *PostgreSQLInstance) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *PostgreSQLInstance) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *PostgreSQLInstance) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *PostgreSQLInstance) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *PostgreSQLInstance) GetSslMode() string { + if x != nil { + return x.SslMode + } + return "" +} + +func (x *PostgreSQLInstance) GetMaxConns() int32 { + if x != nil { + return x.MaxConns + } + return 0 +} + +func (x *PostgreSQLInstance) GetMinConns() int32 { + if x != nil { + return x.MinConns + } + return 0 +} + +func (x *PostgreSQLInstance) GetMaxConnLifetime() int32 { + if x != nil { + return x.MaxConnLifetime + } + return 0 +} + +func (x *PostgreSQLInstance) GetMaxConnIdleTime() int32 { + if x != nil { + return x.MaxConnIdleTime + } + return 0 +} + +// RateLimiterInfra represents global rate limiter infrastructure configuration. +type RateLimiterInfra struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable rate limiting globally + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Node ID for distributed coordination + NodeId string `protobuf:"bytes,2,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Optional: Reference to storage.redis[].id + // When not specified, uses first Redis instance + StorageId string `protobuf:"bytes,3,opt,name=storage_id,json=storageId,proto3" json:"storage_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RateLimiterInfra) Reset() { + *x = RateLimiterInfra{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RateLimiterInfra) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RateLimiterInfra) ProtoMessage() {} + +func (x *RateLimiterInfra) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RateLimiterInfra.ProtoReflect.Descriptor instead. +func (*RateLimiterInfra) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{9} +} + +func (x *RateLimiterInfra) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *RateLimiterInfra) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +func (x *RateLimiterInfra) GetStorageId() string { + if x != nil { + return x.StorageId + } + return "" +} + +// SpendLimiterInfra represents global spend limiter infrastructure configuration. +type SpendLimiterInfra struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable spend limiting globally + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Token tracker configuration + TokenTracker *TokenTrackerConfig `protobuf:"bytes,2,opt,name=token_tracker,json=tokenTracker,proto3" json:"token_tracker,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendLimiterInfra) Reset() { + *x = SpendLimiterInfra{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendLimiterInfra) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendLimiterInfra) ProtoMessage() {} + +func (x *SpendLimiterInfra) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendLimiterInfra.ProtoReflect.Descriptor instead. +func (*SpendLimiterInfra) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{10} +} + +func (x *SpendLimiterInfra) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *SpendLimiterInfra) GetTokenTracker() *TokenTrackerConfig { + if x != nil { + return x.TokenTracker + } + return nil +} + +// TokenTrackerConfig represents token tracking configuration. +type TokenTrackerConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Storage backend type + StorageType string `protobuf:"bytes,1,opt,name=storage_type,json=storageType,proto3" json:"storage_type,omitempty"` // "postgresql", "redpanda", etc. + // Async write settings + Async bool `protobuf:"varint,2,opt,name=async,proto3" json:"async,omitempty"` + BufferSize int32 `protobuf:"varint,3,opt,name=buffer_size,json=bufferSize,proto3" json:"buffer_size,omitempty"` + FlushInterval int32 `protobuf:"varint,4,opt,name=flush_interval,json=flushInterval,proto3" json:"flush_interval,omitempty"` // seconds + // Query cache configuration + Cache *TokenTrackerCache `protobuf:"bytes,5,opt,name=cache,proto3" json:"cache,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokenTrackerConfig) Reset() { + *x = TokenTrackerConfig{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokenTrackerConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokenTrackerConfig) ProtoMessage() {} + +func (x *TokenTrackerConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokenTrackerConfig.ProtoReflect.Descriptor instead. +func (*TokenTrackerConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{11} +} + +func (x *TokenTrackerConfig) GetStorageType() string { + if x != nil { + return x.StorageType + } + return "" +} + +func (x *TokenTrackerConfig) GetAsync() bool { + if x != nil { + return x.Async + } + return false +} + +func (x *TokenTrackerConfig) GetBufferSize() int32 { + if x != nil { + return x.BufferSize + } + return 0 +} + +func (x *TokenTrackerConfig) GetFlushInterval() int32 { + if x != nil { + return x.FlushInterval + } + return 0 +} + +func (x *TokenTrackerConfig) GetCache() *TokenTrackerCache { + if x != nil { + return x.Cache + } + return nil +} + +// TokenTrackerCache represents token tracker cache configuration. +type TokenTrackerCache struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable caching + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Cache TTL (e.g., "5m", "10s") + Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` + // Optional: Reference to storage.redis[].id + // When not specified, uses first Redis instance + StorageId string `protobuf:"bytes,3,opt,name=storage_id,json=storageId,proto3" json:"storage_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokenTrackerCache) Reset() { + *x = TokenTrackerCache{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokenTrackerCache) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokenTrackerCache) ProtoMessage() {} + +func (x *TokenTrackerCache) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokenTrackerCache.ProtoReflect.Descriptor instead. +func (*TokenTrackerCache) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{12} +} + +func (x *TokenTrackerCache) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *TokenTrackerCache) GetTtl() string { + if x != nil { + return x.Ttl + } + return "" +} + +func (x *TokenTrackerCache) GetStorageId() string { + if x != nil { + return x.StorageId + } + return "" +} + +// OIDCConfig represents global OIDC authentication configuration. +// When enabled, all gateways will validate JWT tokens from the configured issuer. +type OIDCConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable/disable OIDC authentication globally + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // OIDC issuer URL for token validation + // Example: "https://accounts.google.com", "https://auth0.com" + IssuerUrl string `protobuf:"bytes,2,opt,name=issuer_url,json=issuerUrl,proto3" json:"issuer_url,omitempty"` + // List of valid audience claims (client IDs) + // Tokens must have at least one matching audience + AllowedAudiences []string `protobuf:"bytes,3,rep,name=allowed_audiences,json=allowedAudiences,proto3" json:"allowed_audiences,omitempty"` + // Clock skew tolerance in seconds for token validation + // Accounts for time differences between servers (default: 600) + ClockSkewLeeway int32 `protobuf:"varint,4,opt,name=clock_skew_leeway,json=clockSkewLeeway,proto3" json:"clock_skew_leeway,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OIDCConfig) Reset() { + *x = OIDCConfig{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OIDCConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OIDCConfig) ProtoMessage() {} + +func (x *OIDCConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OIDCConfig.ProtoReflect.Descriptor instead. +func (*OIDCConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{13} +} + +func (x *OIDCConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *OIDCConfig) GetIssuerUrl() string { + if x != nil { + return x.IssuerUrl + } + return "" +} + +func (x *OIDCConfig) GetAllowedAudiences() []string { + if x != nil { + return x.AllowedAudiences + } + return nil +} + +func (x *OIDCConfig) GetClockSkewLeeway() int32 { + if x != nil { + return x.ClockSkewLeeway + } + return 0 +} + +// MCPGatewayConfig represents global configuration for MCP (Model Context Protocol) backends. +// These settings apply to ALL MCP backends in the deployment. +type MCPGatewayConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Session manager configuration for MCP backends + SessionManager *MCPSessionManagerConfig `protobuf:"bytes,1,opt,name=session_manager,json=sessionManager,proto3" json:"session_manager,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MCPGatewayConfig) Reset() { + *x = MCPGatewayConfig{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MCPGatewayConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MCPGatewayConfig) ProtoMessage() {} + +func (x *MCPGatewayConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MCPGatewayConfig.ProtoReflect.Descriptor instead. +func (*MCPGatewayConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{14} +} + +func (x *MCPGatewayConfig) GetSessionManager() *MCPSessionManagerConfig { + if x != nil { + return x.SessionManager + } + return nil +} + +// MCPSessionManagerConfig configures session storage for MCP backends. +// When not specified, auto-detects Redis from global storage.redis[]. +type MCPSessionManagerConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Optional: Reference to storage.redis[].id for session storage + // When not specified, uses first Redis instance from storage.redis[] + // Falls back to in-memory if no Redis configured + StorageId string `protobuf:"bytes,1,opt,name=storage_id,json=storageId,proto3" json:"storage_id,omitempty"` + // Optional: Bind sessions to OIDC subject claim (default: true) + // When enabled, each OIDC user gets isolated session + EnforceIdentityBinding bool `protobuf:"varint,2,opt,name=enforce_identity_binding,json=enforceIdentityBinding,proto3" json:"enforce_identity_binding,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MCPSessionManagerConfig) Reset() { + *x = MCPSessionManagerConfig{} + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MCPSessionManagerConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MCPSessionManagerConfig) ProtoMessage() {} + +func (x *MCPSessionManagerConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_settings_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MCPSessionManagerConfig.ProtoReflect.Descriptor instead. +func (*MCPSessionManagerConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP(), []int{15} +} + +func (x *MCPSessionManagerConfig) GetStorageId() string { + if x != nil { + return x.StorageId + } + return "" +} + +func (x *MCPSessionManagerConfig) GetEnforceIdentityBinding() bool { + if x != nil { + return x.EnforceIdentityBinding + } + return false +} + +var File_redpanda_api_aigateway_v1_settings_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_settings_proto_rawDesc = []byte{ + 0x0a, 0x28, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x14, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x56, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x59, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0x8c, 0x04, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x5f, + 0x0a, 0x15, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x52, 0x13, 0x72, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x62, 0x0a, 0x16, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x52, 0x14, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, + 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x4c, + 0x0a, 0x0b, 0x6d, 0x63, 0x70, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x43, 0x50, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0a, 0x6d, 0x63, 0x70, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x3e, + 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x12, 0x4d, + 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x22, 0x97, 0x04, + 0x0a, 0x0d, 0x52, 0x65, 0x64, 0x69, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x6c, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x15, 0x74, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, + 0x0c, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x27, 0x0a, 0x10, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x43, 0x61, + 0x43, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x24, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x08, 0x70, 0x6f, + 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x01, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x09, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x0c, 0x72, 0x61, + 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x0b, 0x72, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x11, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, + 0x30, 0x0a, 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, + 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x22, 0xcc, 0x03, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x0e, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x08, 0x1a, 0x06, 0x18, 0xff, 0xff, 0x03, + 0x28, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1e, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x73, 0x73, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x73, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, + 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x12, + 0x24, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x08, 0x6d, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x43, 0x6f, + 0x6e, 0x6e, 0x4c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x12, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, + 0x0f, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x64, 0x0a, 0x10, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x72, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, 0x0b, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x0a, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2e, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, + 0x04, 0x1a, 0x02, 0x28, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x12, 0x42, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x5e, 0x0a, 0x11, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x0a, 0x4f, 0x49, 0x44, + 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x55, 0x72, 0x6c, + 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x75, 0x64, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x33, 0x0a, + 0x11, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x6b, 0x65, 0x77, 0x5f, 0x6c, 0x65, 0x65, 0x77, + 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, + 0x00, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x6b, 0x65, 0x77, 0x4c, 0x65, 0x65, 0x77, + 0x61, 0x79, 0x22, 0x6f, 0x0a, 0x10, 0x4d, 0x43, 0x50, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x43, 0x50, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x22, 0x72, 0x0a, 0x17, 0x4d, 0x43, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x18, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x32, 0xc9, 0x02, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x95, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x3a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x0c, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x42, 0x82, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, + 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, + 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_settings_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_settings_proto_rawDescData = file_redpanda_api_aigateway_v1_settings_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_settings_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_settings_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_settings_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_settings_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_settings_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_redpanda_api_aigateway_v1_settings_proto_goTypes = []any{ + (*GetSettingsRequest)(nil), // 0: redpanda.api.aigateway.v1.GetSettingsRequest + (*GetSettingsResponse)(nil), // 1: redpanda.api.aigateway.v1.GetSettingsResponse + (*UpdateSettingsRequest)(nil), // 2: redpanda.api.aigateway.v1.UpdateSettingsRequest + (*UpdateSettingsResponse)(nil), // 3: redpanda.api.aigateway.v1.UpdateSettingsResponse + (*Settings)(nil), // 4: redpanda.api.aigateway.v1.Settings + (*Storage)(nil), // 5: redpanda.api.aigateway.v1.Storage + (*RedisInstance)(nil), // 6: redpanda.api.aigateway.v1.RedisInstance + (*RedisDatabases)(nil), // 7: redpanda.api.aigateway.v1.RedisDatabases + (*PostgreSQLInstance)(nil), // 8: redpanda.api.aigateway.v1.PostgreSQLInstance + (*RateLimiterInfra)(nil), // 9: redpanda.api.aigateway.v1.RateLimiterInfra + (*SpendLimiterInfra)(nil), // 10: redpanda.api.aigateway.v1.SpendLimiterInfra + (*TokenTrackerConfig)(nil), // 11: redpanda.api.aigateway.v1.TokenTrackerConfig + (*TokenTrackerCache)(nil), // 12: redpanda.api.aigateway.v1.TokenTrackerCache + (*OIDCConfig)(nil), // 13: redpanda.api.aigateway.v1.OIDCConfig + (*MCPGatewayConfig)(nil), // 14: redpanda.api.aigateway.v1.MCPGatewayConfig + (*MCPSessionManagerConfig)(nil), // 15: redpanda.api.aigateway.v1.MCPSessionManagerConfig + (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_settings_proto_depIdxs = []int32{ + 4, // 0: redpanda.api.aigateway.v1.GetSettingsResponse.settings:type_name -> redpanda.api.aigateway.v1.Settings + 4, // 1: redpanda.api.aigateway.v1.UpdateSettingsRequest.settings:type_name -> redpanda.api.aigateway.v1.Settings + 4, // 2: redpanda.api.aigateway.v1.UpdateSettingsResponse.settings:type_name -> redpanda.api.aigateway.v1.Settings + 5, // 3: redpanda.api.aigateway.v1.Settings.storage:type_name -> redpanda.api.aigateway.v1.Storage + 9, // 4: redpanda.api.aigateway.v1.Settings.rate_limiter_defaults:type_name -> redpanda.api.aigateway.v1.RateLimiterInfra + 10, // 5: redpanda.api.aigateway.v1.Settings.spend_limiter_defaults:type_name -> redpanda.api.aigateway.v1.SpendLimiterInfra + 13, // 6: redpanda.api.aigateway.v1.Settings.oidc:type_name -> redpanda.api.aigateway.v1.OIDCConfig + 14, // 7: redpanda.api.aigateway.v1.Settings.mcp_gateway:type_name -> redpanda.api.aigateway.v1.MCPGatewayConfig + 16, // 8: redpanda.api.aigateway.v1.Settings.created_at:type_name -> google.protobuf.Timestamp + 16, // 9: redpanda.api.aigateway.v1.Settings.updated_at:type_name -> google.protobuf.Timestamp + 6, // 10: redpanda.api.aigateway.v1.Storage.redis:type_name -> redpanda.api.aigateway.v1.RedisInstance + 8, // 11: redpanda.api.aigateway.v1.Storage.postgresql:type_name -> redpanda.api.aigateway.v1.PostgreSQLInstance + 7, // 12: redpanda.api.aigateway.v1.RedisInstance.databases:type_name -> redpanda.api.aigateway.v1.RedisDatabases + 11, // 13: redpanda.api.aigateway.v1.SpendLimiterInfra.token_tracker:type_name -> redpanda.api.aigateway.v1.TokenTrackerConfig + 12, // 14: redpanda.api.aigateway.v1.TokenTrackerConfig.cache:type_name -> redpanda.api.aigateway.v1.TokenTrackerCache + 15, // 15: redpanda.api.aigateway.v1.MCPGatewayConfig.session_manager:type_name -> redpanda.api.aigateway.v1.MCPSessionManagerConfig + 0, // 16: redpanda.api.aigateway.v1.SettingsService.GetSettings:input_type -> redpanda.api.aigateway.v1.GetSettingsRequest + 2, // 17: redpanda.api.aigateway.v1.SettingsService.UpdateSettings:input_type -> redpanda.api.aigateway.v1.UpdateSettingsRequest + 1, // 18: redpanda.api.aigateway.v1.SettingsService.GetSettings:output_type -> redpanda.api.aigateway.v1.GetSettingsResponse + 3, // 19: redpanda.api.aigateway.v1.SettingsService.UpdateSettings:output_type -> redpanda.api.aigateway.v1.UpdateSettingsResponse + 18, // [18:20] is the sub-list for method output_type + 16, // [16:18] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_settings_proto_init() } +func file_redpanda_api_aigateway_v1_settings_proto_init() { + if File_redpanda_api_aigateway_v1_settings_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_settings_proto_rawDesc, + NumEnums: 0, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_settings_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_settings_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_settings_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_settings_proto = out.File + file_redpanda_api_aigateway_v1_settings_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_settings_proto_goTypes = nil + file_redpanda_api_aigateway_v1_settings_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.gw.go new file mode 100644 index 0000000000..47e44889cd --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings.pb.gw.go @@ -0,0 +1,217 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/settings.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_SettingsService_GetSettings_0(ctx context.Context, marshaler runtime.Marshaler, client SettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSettingsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetSettings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SettingsService_GetSettings_0(ctx context.Context, marshaler runtime.Marshaler, server SettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSettingsRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetSettings(ctx, &protoReq) + return msg, metadata, err +} + +func request_SettingsService_UpdateSettings_0(ctx context.Context, marshaler runtime.Marshaler, client SettingsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSettingsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Settings); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.UpdateSettings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SettingsService_UpdateSettings_0(ctx context.Context, marshaler runtime.Marshaler, server SettingsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSettingsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Settings); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateSettings(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterSettingsServiceHandlerServer registers the http handlers for service SettingsService to "mux". +// UnaryRPC :call SettingsServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSettingsServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterSettingsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SettingsServiceServer) error { + mux.Handle(http.MethodGet, pattern_SettingsService_GetSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SettingsService/GetSettings", runtime.WithHTTPPathPattern("/v1/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SettingsService_GetSettings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SettingsService_GetSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_SettingsService_UpdateSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SettingsService/UpdateSettings", runtime.WithHTTPPathPattern("/v1/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SettingsService_UpdateSettings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SettingsService_UpdateSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterSettingsServiceHandlerFromEndpoint is same as RegisterSettingsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSettingsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterSettingsServiceHandler(ctx, mux, conn) +} + +// RegisterSettingsServiceHandler registers the http handlers for service SettingsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSettingsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSettingsServiceHandlerClient(ctx, mux, NewSettingsServiceClient(conn)) +} + +// RegisterSettingsServiceHandlerClient registers the http handlers for service SettingsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SettingsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SettingsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SettingsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterSettingsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SettingsServiceClient) error { + mux.Handle(http.MethodGet, pattern_SettingsService_GetSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SettingsService/GetSettings", runtime.WithHTTPPathPattern("/v1/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SettingsService_GetSettings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SettingsService_GetSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_SettingsService_UpdateSettings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SettingsService/UpdateSettings", runtime.WithHTTPPathPattern("/v1/settings")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SettingsService_UpdateSettings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SettingsService_UpdateSettings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_SettingsService_GetSettings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "settings"}, "")) + pattern_SettingsService_UpdateSettings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "settings"}, "")) +) + +var ( + forward_SettingsService_GetSettings_0 = runtime.ForwardResponseMessage + forward_SettingsService_UpdateSettings_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/settings_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings_grpc.pb.go new file mode 100644 index 0000000000..3379383c8c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/settings_grpc.pb.go @@ -0,0 +1,170 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/settings.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + SettingsService_GetSettings_FullMethodName = "/redpanda.api.aigateway.v1.SettingsService/GetSettings" + SettingsService_UpdateSettings_FullMethodName = "/redpanda.api.aigateway.v1.SettingsService/UpdateSettings" +) + +// SettingsServiceClient is the client API for SettingsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// SettingsService manages global deployment-wide settings. +// Settings are shared by ALL virtual gateways in the deployment. +type SettingsServiceClient interface { + // Gets the global settings for the entire deployment. + GetSettings(ctx context.Context, in *GetSettingsRequest, opts ...grpc.CallOption) (*GetSettingsResponse, error) + // Updates the global settings for the entire deployment. + UpdateSettings(ctx context.Context, in *UpdateSettingsRequest, opts ...grpc.CallOption) (*UpdateSettingsResponse, error) +} + +type settingsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSettingsServiceClient(cc grpc.ClientConnInterface) SettingsServiceClient { + return &settingsServiceClient{cc} +} + +func (c *settingsServiceClient) GetSettings(ctx context.Context, in *GetSettingsRequest, opts ...grpc.CallOption) (*GetSettingsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSettingsResponse) + err := c.cc.Invoke(ctx, SettingsService_GetSettings_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *settingsServiceClient) UpdateSettings(ctx context.Context, in *UpdateSettingsRequest, opts ...grpc.CallOption) (*UpdateSettingsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateSettingsResponse) + err := c.cc.Invoke(ctx, SettingsService_UpdateSettings_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SettingsServiceServer is the server API for SettingsService service. +// All implementations must embed UnimplementedSettingsServiceServer +// for forward compatibility. +// +// SettingsService manages global deployment-wide settings. +// Settings are shared by ALL virtual gateways in the deployment. +type SettingsServiceServer interface { + // Gets the global settings for the entire deployment. + GetSettings(context.Context, *GetSettingsRequest) (*GetSettingsResponse, error) + // Updates the global settings for the entire deployment. + UpdateSettings(context.Context, *UpdateSettingsRequest) (*UpdateSettingsResponse, error) + mustEmbedUnimplementedSettingsServiceServer() +} + +// UnimplementedSettingsServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedSettingsServiceServer struct{} + +func (UnimplementedSettingsServiceServer) GetSettings(context.Context, *GetSettingsRequest) (*GetSettingsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSettings not implemented") +} +func (UnimplementedSettingsServiceServer) UpdateSettings(context.Context, *UpdateSettingsRequest) (*UpdateSettingsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateSettings not implemented") +} +func (UnimplementedSettingsServiceServer) mustEmbedUnimplementedSettingsServiceServer() {} +func (UnimplementedSettingsServiceServer) testEmbeddedByValue() {} + +// UnsafeSettingsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SettingsServiceServer will +// result in compilation errors. +type UnsafeSettingsServiceServer interface { + mustEmbedUnimplementedSettingsServiceServer() +} + +func RegisterSettingsServiceServer(s grpc.ServiceRegistrar, srv SettingsServiceServer) { + // If the following call pancis, it indicates UnimplementedSettingsServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&SettingsService_ServiceDesc, srv) +} + +func _SettingsService_GetSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSettingsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SettingsServiceServer).GetSettings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SettingsService_GetSettings_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SettingsServiceServer).GetSettings(ctx, req.(*GetSettingsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SettingsService_UpdateSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateSettingsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SettingsServiceServer).UpdateSettings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SettingsService_UpdateSettings_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SettingsServiceServer).UpdateSettings(ctx, req.(*UpdateSettingsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SettingsService_ServiceDesc is the grpc.ServiceDesc for SettingsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SettingsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.SettingsService", + HandlerType: (*SettingsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSettings", + Handler: _SettingsService_GetSettings_Handler, + }, + { + MethodName: "UpdateSettings", + Handler: _SettingsService_UpdateSettings_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/settings.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.go new file mode 100644 index 0000000000..32d6404116 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.go @@ -0,0 +1,1488 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/spend_limit.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SpendLimitWindowType int32 + +const ( + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_UNSPECIFIED SpendLimitWindowType = 0 + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_SLIDING SpendLimitWindowType = 1 + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_FIXED SpendLimitWindowType = 2 + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_DAILY SpendLimitWindowType = 3 + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_WEEKLY SpendLimitWindowType = 4 + SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_MONTHLY SpendLimitWindowType = 5 +) + +// Enum value maps for SpendLimitWindowType. +var ( + SpendLimitWindowType_name = map[int32]string{ + 0: "SPEND_LIMIT_WINDOW_TYPE_UNSPECIFIED", + 1: "SPEND_LIMIT_WINDOW_TYPE_SLIDING", + 2: "SPEND_LIMIT_WINDOW_TYPE_FIXED", + 3: "SPEND_LIMIT_WINDOW_TYPE_DAILY", + 4: "SPEND_LIMIT_WINDOW_TYPE_WEEKLY", + 5: "SPEND_LIMIT_WINDOW_TYPE_MONTHLY", + } + SpendLimitWindowType_value = map[string]int32{ + "SPEND_LIMIT_WINDOW_TYPE_UNSPECIFIED": 0, + "SPEND_LIMIT_WINDOW_TYPE_SLIDING": 1, + "SPEND_LIMIT_WINDOW_TYPE_FIXED": 2, + "SPEND_LIMIT_WINDOW_TYPE_DAILY": 3, + "SPEND_LIMIT_WINDOW_TYPE_WEEKLY": 4, + "SPEND_LIMIT_WINDOW_TYPE_MONTHLY": 5, + } +) + +func (x SpendLimitWindowType) Enum() *SpendLimitWindowType { + p := new(SpendLimitWindowType) + *p = x + return p +} + +func (x SpendLimitWindowType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SpendLimitWindowType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes[0].Descriptor() +} + +func (SpendLimitWindowType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes[0] +} + +func (x SpendLimitWindowType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SpendLimitWindowType.Descriptor instead. +func (SpendLimitWindowType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{0} +} + +type SpendLimitAction int32 + +const ( + SpendLimitAction_SPEND_LIMIT_ACTION_UNSPECIFIED SpendLimitAction = 0 + SpendLimitAction_SPEND_LIMIT_ACTION_BLOCK SpendLimitAction = 1 + SpendLimitAction_SPEND_LIMIT_ACTION_ALERT SpendLimitAction = 2 + SpendLimitAction_SPEND_LIMIT_ACTION_DOWNGRADE SpendLimitAction = 3 +) + +// Enum value maps for SpendLimitAction. +var ( + SpendLimitAction_name = map[int32]string{ + 0: "SPEND_LIMIT_ACTION_UNSPECIFIED", + 1: "SPEND_LIMIT_ACTION_BLOCK", + 2: "SPEND_LIMIT_ACTION_ALERT", + 3: "SPEND_LIMIT_ACTION_DOWNGRADE", + } + SpendLimitAction_value = map[string]int32{ + "SPEND_LIMIT_ACTION_UNSPECIFIED": 0, + "SPEND_LIMIT_ACTION_BLOCK": 1, + "SPEND_LIMIT_ACTION_ALERT": 2, + "SPEND_LIMIT_ACTION_DOWNGRADE": 3, + } +) + +func (x SpendLimitAction) Enum() *SpendLimitAction { + p := new(SpendLimitAction) + *p = x + return p +} + +func (x SpendLimitAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SpendLimitAction) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes[1].Descriptor() +} + +func (SpendLimitAction) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes[1] +} + +func (x SpendLimitAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SpendLimitAction.Descriptor instead. +func (SpendLimitAction) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{1} +} + +// Response message for CreateSpendLimit RPC. +type CreateSpendLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimit *SpendLimit `protobuf:"bytes,1,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateSpendLimitResponse) Reset() { + *x = CreateSpendLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateSpendLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSpendLimitResponse) ProtoMessage() {} + +func (x *CreateSpendLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSpendLimitResponse.ProtoReflect.Descriptor instead. +func (*CreateSpendLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateSpendLimitResponse) GetSpendLimit() *SpendLimit { + if x != nil { + return x.SpendLimit + } + return nil +} + +// Response message for GetSpendLimit RPC. +type GetSpendLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimit *SpendLimit `protobuf:"bytes,1,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendLimitResponse) Reset() { + *x = GetSpendLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendLimitResponse) ProtoMessage() {} + +func (x *GetSpendLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendLimitResponse.ProtoReflect.Descriptor instead. +func (*GetSpendLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{1} +} + +func (x *GetSpendLimitResponse) GetSpendLimit() *SpendLimit { + if x != nil { + return x.SpendLimit + } + return nil +} + +// Response message for UpdateSpendLimit RPC. +type UpdateSpendLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimit *SpendLimit `protobuf:"bytes,1,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateSpendLimitResponse) Reset() { + *x = UpdateSpendLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateSpendLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSpendLimitResponse) ProtoMessage() {} + +func (x *UpdateSpendLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateSpendLimitResponse.ProtoReflect.Descriptor instead. +func (*UpdateSpendLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateSpendLimitResponse) GetSpendLimit() *SpendLimit { + if x != nil { + return x.SpendLimit + } + return nil +} + +// Response message for DeleteSpendLimit RPC. +type DeleteSpendLimitResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteSpendLimitResponse) Reset() { + *x = DeleteSpendLimitResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteSpendLimitResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSpendLimitResponse) ProtoMessage() {} + +func (x *DeleteSpendLimitResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteSpendLimitResponse.ProtoReflect.Descriptor instead. +func (*DeleteSpendLimitResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{3} +} + +// Response message for GetSpendLimitUsage RPC. +type GetSpendLimitUsageResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimitUsage *SpendLimitUsage `protobuf:"bytes,1,opt,name=spend_limit_usage,json=spendLimitUsage,proto3" json:"spend_limit_usage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendLimitUsageResponse) Reset() { + *x = GetSpendLimitUsageResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendLimitUsageResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendLimitUsageResponse) ProtoMessage() {} + +func (x *GetSpendLimitUsageResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendLimitUsageResponse.ProtoReflect.Descriptor instead. +func (*GetSpendLimitUsageResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{4} +} + +func (x *GetSpendLimitUsageResponse) GetSpendLimitUsage() *SpendLimitUsage { + if x != nil { + return x.SpendLimitUsage + } + return nil +} + +type SpendLimit struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + MatchExpression string `protobuf:"bytes,4,opt,name=match_expression,json=matchExpression,proto3" json:"match_expression,omitempty"` + // CEL expression to extract spend limit key (e.g., "request.headers['X-User-ID'][0]") + // If not provided, a global spend limit is applied + // Example: request.context.oidc_claims.sub (per-user budgets) + // Example: request.context.oidc_claims.org_id (per-organization budgets) + KeyExtractor string `protobuf:"bytes,5,opt,name=key_extractor,json=keyExtractor,proto3" json:"key_extractor,omitempty"` + LimitCents int64 `protobuf:"varint,6,opt,name=limit_cents,json=limitCents,proto3" json:"limit_cents,omitempty"` + Window *SpendLimitWindow `protobuf:"bytes,7,opt,name=window,proto3" json:"window,omitempty"` + Action SpendLimitAction `protobuf:"varint,8,opt,name=action,proto3,enum=redpanda.api.aigateway.v1.SpendLimitAction" json:"action,omitempty"` + AlertThresholds []int32 `protobuf:"varint,9,rep,packed,name=alert_thresholds,json=alertThresholds,proto3" json:"alert_thresholds,omitempty"` + Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` + Metadata map[string]string `protobuf:"bytes,11,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Token-based limits (usage quotas, combined input+output tokens) + // Aligns with CUE schema: schema_spendlimit.cue lines 27-30 + // 0 = unlimited + TokensPerMinute int64 `protobuf:"varint,14,opt,name=tokens_per_minute,json=tokensPerMinute,proto3" json:"tokens_per_minute,omitempty"` + TokensPerDay int64 `protobuf:"varint,15,opt,name=tokens_per_day,json=tokensPerDay,proto3" json:"tokens_per_day,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendLimit) Reset() { + *x = SpendLimit{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendLimit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendLimit) ProtoMessage() {} + +func (x *SpendLimit) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendLimit.ProtoReflect.Descriptor instead. +func (*SpendLimit) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{5} +} + +func (x *SpendLimit) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SpendLimit) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *SpendLimit) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SpendLimit) GetMatchExpression() string { + if x != nil { + return x.MatchExpression + } + return "" +} + +func (x *SpendLimit) GetKeyExtractor() string { + if x != nil { + return x.KeyExtractor + } + return "" +} + +func (x *SpendLimit) GetLimitCents() int64 { + if x != nil { + return x.LimitCents + } + return 0 +} + +func (x *SpendLimit) GetWindow() *SpendLimitWindow { + if x != nil { + return x.Window + } + return nil +} + +func (x *SpendLimit) GetAction() SpendLimitAction { + if x != nil { + return x.Action + } + return SpendLimitAction_SPEND_LIMIT_ACTION_UNSPECIFIED +} + +func (x *SpendLimit) GetAlertThresholds() []int32 { + if x != nil { + return x.AlertThresholds + } + return nil +} + +func (x *SpendLimit) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *SpendLimit) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *SpendLimit) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *SpendLimit) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *SpendLimit) GetTokensPerMinute() int64 { + if x != nil { + return x.TokensPerMinute + } + return 0 +} + +func (x *SpendLimit) GetTokensPerDay() int64 { + if x != nil { + return x.TokensPerDay + } + return 0 +} + +type SpendLimitWindow struct { + state protoimpl.MessageState `protogen:"open.v1"` + SizeSeconds int32 `protobuf:"varint,1,opt,name=size_seconds,json=sizeSeconds,proto3" json:"size_seconds,omitempty"` + Type SpendLimitWindowType `protobuf:"varint,2,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.SpendLimitWindowType" json:"type,omitempty"` // Must not be UNSPECIFIED + ResetAt string `protobuf:"bytes,3,opt,name=reset_at,json=resetAt,proto3" json:"reset_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendLimitWindow) Reset() { + *x = SpendLimitWindow{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendLimitWindow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendLimitWindow) ProtoMessage() {} + +func (x *SpendLimitWindow) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendLimitWindow.ProtoReflect.Descriptor instead. +func (*SpendLimitWindow) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{6} +} + +func (x *SpendLimitWindow) GetSizeSeconds() int32 { + if x != nil { + return x.SizeSeconds + } + return 0 +} + +func (x *SpendLimitWindow) GetType() SpendLimitWindowType { + if x != nil { + return x.Type + } + return SpendLimitWindowType_SPEND_LIMIT_WINDOW_TYPE_UNSPECIFIED +} + +func (x *SpendLimitWindow) GetResetAt() string { + if x != nil { + return x.ResetAt + } + return "" +} + +type SpendLimitUsage struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimit string `protobuf:"bytes,1,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + CurrentSpendCents int64 `protobuf:"varint,2,opt,name=current_spend_cents,json=currentSpendCents,proto3" json:"current_spend_cents,omitempty"` + LimitCents int64 `protobuf:"varint,3,opt,name=limit_cents,json=limitCents,proto3" json:"limit_cents,omitempty"` + PercentageUsed int32 `protobuf:"varint,4,opt,name=percentage_used,json=percentageUsed,proto3" json:"percentage_used,omitempty"` + WindowStart *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=window_start,json=windowStart,proto3" json:"window_start,omitempty"` + WindowEnd *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=window_end,json=windowEnd,proto3" json:"window_end,omitempty"` + IsExceeded bool `protobuf:"varint,7,opt,name=is_exceeded,json=isExceeded,proto3" json:"is_exceeded,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpendLimitUsage) Reset() { + *x = SpendLimitUsage{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpendLimitUsage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendLimitUsage) ProtoMessage() {} + +func (x *SpendLimitUsage) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpendLimitUsage.ProtoReflect.Descriptor instead. +func (*SpendLimitUsage) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{7} +} + +func (x *SpendLimitUsage) GetSpendLimit() string { + if x != nil { + return x.SpendLimit + } + return "" +} + +func (x *SpendLimitUsage) GetCurrentSpendCents() int64 { + if x != nil { + return x.CurrentSpendCents + } + return 0 +} + +func (x *SpendLimitUsage) GetLimitCents() int64 { + if x != nil { + return x.LimitCents + } + return 0 +} + +func (x *SpendLimitUsage) GetPercentageUsed() int32 { + if x != nil { + return x.PercentageUsed + } + return 0 +} + +func (x *SpendLimitUsage) GetWindowStart() *timestamppb.Timestamp { + if x != nil { + return x.WindowStart + } + return nil +} + +func (x *SpendLimitUsage) GetWindowEnd() *timestamppb.Timestamp { + if x != nil { + return x.WindowEnd + } + return nil +} + +func (x *SpendLimitUsage) GetIsExceeded() bool { + if x != nil { + return x.IsExceeded + } + return false +} + +type CreateSpendLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + SpendLimit *SpendLimit `protobuf:"bytes,3,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateSpendLimitRequest) Reset() { + *x = CreateSpendLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateSpendLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSpendLimitRequest) ProtoMessage() {} + +func (x *CreateSpendLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSpendLimitRequest.ProtoReflect.Descriptor instead. +func (*CreateSpendLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{8} +} + +func (x *CreateSpendLimitRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateSpendLimitRequest) GetSpendLimit() *SpendLimit { + if x != nil { + return x.SpendLimit + } + return nil +} + +type GetSpendLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendLimitRequest) Reset() { + *x = GetSpendLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendLimitRequest) ProtoMessage() {} + +func (x *GetSpendLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendLimitRequest.ProtoReflect.Descriptor instead. +func (*GetSpendLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{9} +} + +func (x *GetSpendLimitRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListSpendLimitsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListSpendLimitsRequest) Reset() { + *x = ListSpendLimitsRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListSpendLimitsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSpendLimitsRequest) ProtoMessage() {} + +func (x *ListSpendLimitsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSpendLimitsRequest.ProtoReflect.Descriptor instead. +func (*ListSpendLimitsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{10} +} + +func (x *ListSpendLimitsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListSpendLimitsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListSpendLimitsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListSpendLimitsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListSpendLimitsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +type ListSpendLimitsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimits []*SpendLimit `protobuf:"bytes,1,rep,name=spend_limits,json=spendLimits,proto3" json:"spend_limits,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListSpendLimitsResponse) Reset() { + *x = ListSpendLimitsResponse{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListSpendLimitsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSpendLimitsResponse) ProtoMessage() {} + +func (x *ListSpendLimitsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSpendLimitsResponse.ProtoReflect.Descriptor instead. +func (*ListSpendLimitsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{11} +} + +func (x *ListSpendLimitsResponse) GetSpendLimits() []*SpendLimit { + if x != nil { + return x.SpendLimits + } + return nil +} + +func (x *ListSpendLimitsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListSpendLimitsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +type UpdateSpendLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + SpendLimit *SpendLimit `protobuf:"bytes,1,opt,name=spend_limit,json=spendLimit,proto3" json:"spend_limit,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateSpendLimitRequest) Reset() { + *x = UpdateSpendLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateSpendLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSpendLimitRequest) ProtoMessage() {} + +func (x *UpdateSpendLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateSpendLimitRequest.ProtoReflect.Descriptor instead. +func (*UpdateSpendLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateSpendLimitRequest) GetSpendLimit() *SpendLimit { + if x != nil { + return x.SpendLimit + } + return nil +} + +func (x *UpdateSpendLimitRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +type DeleteSpendLimitRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteSpendLimitRequest) Reset() { + *x = DeleteSpendLimitRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteSpendLimitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSpendLimitRequest) ProtoMessage() {} + +func (x *DeleteSpendLimitRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteSpendLimitRequest.ProtoReflect.Descriptor instead. +func (*DeleteSpendLimitRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{13} +} + +func (x *DeleteSpendLimitRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetSpendLimitUsageRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The extracted key value to get usage for (e.g., user ID, org ID) + // If not provided, returns global usage + KeyValue string `protobuf:"bytes,2,opt,name=key_value,json=keyValue,proto3" json:"key_value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpendLimitUsageRequest) Reset() { + *x = GetSpendLimitUsageRequest{} + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpendLimitUsageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpendLimitUsageRequest) ProtoMessage() {} + +func (x *GetSpendLimitUsageRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpendLimitUsageRequest.ProtoReflect.Descriptor instead. +func (*GetSpendLimitUsageRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP(), []int{14} +} + +func (x *GetSpendLimitUsageRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GetSpendLimitUsageRequest) GetKeyValue() string { + if x != nil { + return x.KeyValue + } + return "" +} + +var File_redpanda_api_aigateway_v1_spend_limit_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_spend_limit_proto_rawDesc = []byte{ + 0x0a, 0x2b, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x62, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x46, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x62, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, + 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x1a, 0x0a, 0x18, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0f, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa1, 0x09, + 0x0a, 0x0a, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, + 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x22, + 0x02, 0x28, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x4e, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x42, 0x09, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, + 0x50, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x11, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, + 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, + 0x12, 0x2d, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, + 0x61, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, + 0x00, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, 0x79, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0xc2, 0x02, 0xea, + 0x41, 0x6e, 0x0a, 0x21, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, + 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x7d, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x7d, 0x12, 0x1a, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x2f, 0x7b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x7d, + 0xba, 0x48, 0xcd, 0x01, 0x1a, 0xca, 0x01, 0x0a, 0x1d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x2e, 0x61, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5a, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x28, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, 0x29, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x30, 0x1a, 0x4d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, 0x20, 0x3e, 0x20, + 0x30, 0x22, 0xa8, 0x01, 0x0a, 0x10, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, + 0x04, 0x1a, 0x02, 0x20, 0x00, 0x52, 0x0b, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x54, 0x79, 0x70, + 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x65, 0x74, 0x41, 0x74, 0x22, 0xef, 0x02, 0x0a, + 0x0f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x47, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x55, + 0x73, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x22, 0x9a, + 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0e, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x42, 0x79, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x48, 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0b, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, + 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, + 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x58, 0x0a, + 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x77, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x2a, 0xf3, 0x01, 0x0a, 0x14, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x53, 0x50, 0x45, + 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, + 0x54, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, + 0x49, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x50, 0x45, 0x4e, 0x44, + 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x50, + 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x49, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x22, 0x0a, + 0x1e, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x57, 0x49, 0x4e, + 0x44, 0x4f, 0x57, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x45, 0x45, 0x4b, 0x4c, 0x59, 0x10, + 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, + 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, + 0x54, 0x48, 0x4c, 0x59, 0x10, 0x05, 0x2a, 0x94, 0x01, 0x0a, 0x10, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, 0x53, + 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x1c, 0x0a, 0x18, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x1c, 0x0a, + 0x18, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x45, 0x52, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x53, + 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x10, 0x03, 0x32, 0x8f, 0x0a, + 0x0a, 0x11, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0xd7, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x3a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5a, 0x1f, 0x3a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, + 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0xbd, 0x01, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x5a, 0x1b, 0x12, 0x19, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xba, 0x01, + 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, + 0x5a, 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0xf8, 0x01, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x75, + 0x3a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5a, 0x34, 0x3a, + 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x32, 0x25, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x2f, 0x2a, 0x7d, 0x32, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc6, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x5a, 0x1b, 0x2a, 0x19, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2a, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xde, + 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x5a, 0x24, 0x12, 0x22, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x2d, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, + 0x84, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x42, 0x0f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, + 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, + 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, + 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescData = file_redpanda_api_aigateway_v1_spend_limit_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_spend_limit_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_redpanda_api_aigateway_v1_spend_limit_proto_goTypes = []any{ + (SpendLimitWindowType)(0), // 0: redpanda.api.aigateway.v1.SpendLimitWindowType + (SpendLimitAction)(0), // 1: redpanda.api.aigateway.v1.SpendLimitAction + (*CreateSpendLimitResponse)(nil), // 2: redpanda.api.aigateway.v1.CreateSpendLimitResponse + (*GetSpendLimitResponse)(nil), // 3: redpanda.api.aigateway.v1.GetSpendLimitResponse + (*UpdateSpendLimitResponse)(nil), // 4: redpanda.api.aigateway.v1.UpdateSpendLimitResponse + (*DeleteSpendLimitResponse)(nil), // 5: redpanda.api.aigateway.v1.DeleteSpendLimitResponse + (*GetSpendLimitUsageResponse)(nil), // 6: redpanda.api.aigateway.v1.GetSpendLimitUsageResponse + (*SpendLimit)(nil), // 7: redpanda.api.aigateway.v1.SpendLimit + (*SpendLimitWindow)(nil), // 8: redpanda.api.aigateway.v1.SpendLimitWindow + (*SpendLimitUsage)(nil), // 9: redpanda.api.aigateway.v1.SpendLimitUsage + (*CreateSpendLimitRequest)(nil), // 10: redpanda.api.aigateway.v1.CreateSpendLimitRequest + (*GetSpendLimitRequest)(nil), // 11: redpanda.api.aigateway.v1.GetSpendLimitRequest + (*ListSpendLimitsRequest)(nil), // 12: redpanda.api.aigateway.v1.ListSpendLimitsRequest + (*ListSpendLimitsResponse)(nil), // 13: redpanda.api.aigateway.v1.ListSpendLimitsResponse + (*UpdateSpendLimitRequest)(nil), // 14: redpanda.api.aigateway.v1.UpdateSpendLimitRequest + (*DeleteSpendLimitRequest)(nil), // 15: redpanda.api.aigateway.v1.DeleteSpendLimitRequest + (*GetSpendLimitUsageRequest)(nil), // 16: redpanda.api.aigateway.v1.GetSpendLimitUsageRequest + nil, // 17: redpanda.api.aigateway.v1.SpendLimit.MetadataEntry + (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 19: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_spend_limit_proto_depIdxs = []int32{ + 7, // 0: redpanda.api.aigateway.v1.CreateSpendLimitResponse.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 7, // 1: redpanda.api.aigateway.v1.GetSpendLimitResponse.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 7, // 2: redpanda.api.aigateway.v1.UpdateSpendLimitResponse.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 9, // 3: redpanda.api.aigateway.v1.GetSpendLimitUsageResponse.spend_limit_usage:type_name -> redpanda.api.aigateway.v1.SpendLimitUsage + 8, // 4: redpanda.api.aigateway.v1.SpendLimit.window:type_name -> redpanda.api.aigateway.v1.SpendLimitWindow + 1, // 5: redpanda.api.aigateway.v1.SpendLimit.action:type_name -> redpanda.api.aigateway.v1.SpendLimitAction + 17, // 6: redpanda.api.aigateway.v1.SpendLimit.metadata:type_name -> redpanda.api.aigateway.v1.SpendLimit.MetadataEntry + 18, // 7: redpanda.api.aigateway.v1.SpendLimit.create_time:type_name -> google.protobuf.Timestamp + 18, // 8: redpanda.api.aigateway.v1.SpendLimit.update_time:type_name -> google.protobuf.Timestamp + 0, // 9: redpanda.api.aigateway.v1.SpendLimitWindow.type:type_name -> redpanda.api.aigateway.v1.SpendLimitWindowType + 18, // 10: redpanda.api.aigateway.v1.SpendLimitUsage.window_start:type_name -> google.protobuf.Timestamp + 18, // 11: redpanda.api.aigateway.v1.SpendLimitUsage.window_end:type_name -> google.protobuf.Timestamp + 7, // 12: redpanda.api.aigateway.v1.CreateSpendLimitRequest.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 7, // 13: redpanda.api.aigateway.v1.ListSpendLimitsResponse.spend_limits:type_name -> redpanda.api.aigateway.v1.SpendLimit + 7, // 14: redpanda.api.aigateway.v1.UpdateSpendLimitRequest.spend_limit:type_name -> redpanda.api.aigateway.v1.SpendLimit + 19, // 15: redpanda.api.aigateway.v1.UpdateSpendLimitRequest.update_mask:type_name -> google.protobuf.FieldMask + 10, // 16: redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit:input_type -> redpanda.api.aigateway.v1.CreateSpendLimitRequest + 11, // 17: redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit:input_type -> redpanda.api.aigateway.v1.GetSpendLimitRequest + 12, // 18: redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits:input_type -> redpanda.api.aigateway.v1.ListSpendLimitsRequest + 14, // 19: redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit:input_type -> redpanda.api.aigateway.v1.UpdateSpendLimitRequest + 15, // 20: redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit:input_type -> redpanda.api.aigateway.v1.DeleteSpendLimitRequest + 16, // 21: redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage:input_type -> redpanda.api.aigateway.v1.GetSpendLimitUsageRequest + 2, // 22: redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit:output_type -> redpanda.api.aigateway.v1.CreateSpendLimitResponse + 3, // 23: redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit:output_type -> redpanda.api.aigateway.v1.GetSpendLimitResponse + 13, // 24: redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits:output_type -> redpanda.api.aigateway.v1.ListSpendLimitsResponse + 4, // 25: redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit:output_type -> redpanda.api.aigateway.v1.UpdateSpendLimitResponse + 5, // 26: redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit:output_type -> redpanda.api.aigateway.v1.DeleteSpendLimitResponse + 6, // 27: redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage:output_type -> redpanda.api.aigateway.v1.GetSpendLimitUsageResponse + 22, // [22:28] is the sub-list for method output_type + 16, // [16:22] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_spend_limit_proto_init() } +func file_redpanda_api_aigateway_v1_spend_limit_proto_init() { + if File_redpanda_api_aigateway_v1_spend_limit_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_spend_limit_proto_rawDesc, + NumEnums: 2, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_spend_limit_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_spend_limit_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_spend_limit_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_spend_limit_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_spend_limit_proto = out.File + file_redpanda_api_aigateway_v1_spend_limit_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_spend_limit_proto_goTypes = nil + file_redpanda_api_aigateway_v1_spend_limit_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.gw.go new file mode 100644 index 0000000000..d2ac6a3c8e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit.pb.gw.go @@ -0,0 +1,1157 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/spend_limit.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +func request_SpendLimitService_CreateSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.CreateSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_CreateSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.CreateSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_CreateSpendLimit_1 = &utilities.DoubleArray{Encoding: map[string]int{"spend_limit": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SpendLimitService_CreateSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateSpendLimitRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_CreateSpendLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_CreateSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateSpendLimitRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_CreateSpendLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_SpendLimitService_GetSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_GetSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_SpendLimitService_GetSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_GetSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_ListSpendLimits_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SpendLimitService_ListSpendLimits_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListSpendLimitsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_ListSpendLimits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListSpendLimits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_ListSpendLimits_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListSpendLimitsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_ListSpendLimits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListSpendLimits(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_ListSpendLimits_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_SpendLimitService_ListSpendLimits_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListSpendLimitsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_ListSpendLimits_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListSpendLimits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_ListSpendLimits_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListSpendLimitsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_ListSpendLimits_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListSpendLimits(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_UpdateSpendLimit_0 = &utilities.DoubleArray{Encoding: map[string]int{"spend_limit": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_SpendLimitService_UpdateSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.SpendLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["spend_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "spend_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "spend_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "spend_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_UpdateSpendLimit_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_UpdateSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.SpendLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["spend_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "spend_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "spend_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "spend_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_UpdateSpendLimit_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_UpdateSpendLimit_1 = &utilities.DoubleArray{Encoding: map[string]int{"spend_limit": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_SpendLimitService_UpdateSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.SpendLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["spend_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "spend_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "spend_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "spend_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_UpdateSpendLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_UpdateSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.SpendLimit); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.SpendLimit); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["spend_limit.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "spend_limit.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "spend_limit.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "spend_limit.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_UpdateSpendLimit_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_SpendLimitService_DeleteSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_DeleteSpendLimit_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +func request_SpendLimitService_DeleteSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.DeleteSpendLimit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_DeleteSpendLimit_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteSpendLimitRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.DeleteSpendLimit(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_GetSpendLimitUsage_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SpendLimitService_GetSpendLimitUsage_0(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitUsageRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_GetSpendLimitUsage_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetSpendLimitUsage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_GetSpendLimitUsage_0(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitUsageRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_GetSpendLimitUsage_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetSpendLimitUsage(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SpendLimitService_GetSpendLimitUsage_1 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SpendLimitService_GetSpendLimitUsage_1(ctx context.Context, marshaler runtime.Marshaler, client SpendLimitServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitUsageRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_GetSpendLimitUsage_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetSpendLimitUsage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SpendLimitService_GetSpendLimitUsage_1(ctx context.Context, marshaler runtime.Marshaler, server SpendLimitServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetSpendLimitUsageRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SpendLimitService_GetSpendLimitUsage_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetSpendLimitUsage(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterSpendLimitServiceHandlerServer registers the http handlers for service SpendLimitService to "mux". +// UnaryRPC :call SpendLimitServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSpendLimitServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterSpendLimitServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SpendLimitServiceServer) error { + mux.Handle(http.MethodPost, pattern_SpendLimitService_CreateSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_CreateSpendLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_CreateSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SpendLimitService_CreateSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit", runtime.WithHTTPPathPattern("/v1/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_CreateSpendLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_CreateSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_GetSpendLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_GetSpendLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_ListSpendLimits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_ListSpendLimits_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_ListSpendLimits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_ListSpendLimits_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits", runtime.WithHTTPPathPattern("/v1/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_ListSpendLimits_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_ListSpendLimits_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SpendLimitService_UpdateSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit", runtime.WithHTTPPathPattern("/v1/{spend_limit.name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_UpdateSpendLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_UpdateSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SpendLimitService_UpdateSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit", runtime.WithHTTPPathPattern("/v1/{spend_limit.name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_UpdateSpendLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_UpdateSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SpendLimitService_DeleteSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_DeleteSpendLimit_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_DeleteSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SpendLimitService_DeleteSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_DeleteSpendLimit_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_DeleteSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimitUsage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}:getUsage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_GetSpendLimitUsage_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimitUsage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimitUsage_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}:getUsage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SpendLimitService_GetSpendLimitUsage_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimitUsage_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterSpendLimitServiceHandlerFromEndpoint is same as RegisterSpendLimitServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSpendLimitServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterSpendLimitServiceHandler(ctx, mux, conn) +} + +// RegisterSpendLimitServiceHandler registers the http handlers for service SpendLimitService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSpendLimitServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSpendLimitServiceHandlerClient(ctx, mux, NewSpendLimitServiceClient(conn)) +} + +// RegisterSpendLimitServiceHandlerClient registers the http handlers for service SpendLimitService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SpendLimitServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SpendLimitServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SpendLimitServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterSpendLimitServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SpendLimitServiceClient) error { + mux.Handle(http.MethodPost, pattern_SpendLimitService_CreateSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_CreateSpendLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_CreateSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SpendLimitService_CreateSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit", runtime.WithHTTPPathPattern("/v1/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_CreateSpendLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_CreateSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_GetSpendLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_GetSpendLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_ListSpendLimits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits", runtime.WithHTTPPathPattern("/v1/{parent=gateways/*}/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_ListSpendLimits_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_ListSpendLimits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_ListSpendLimits_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits", runtime.WithHTTPPathPattern("/v1/spend-limits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_ListSpendLimits_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_ListSpendLimits_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SpendLimitService_UpdateSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit", runtime.WithHTTPPathPattern("/v1/{spend_limit.name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_UpdateSpendLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_UpdateSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SpendLimitService_UpdateSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit", runtime.WithHTTPPathPattern("/v1/{spend_limit.name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_UpdateSpendLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_UpdateSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SpendLimitService_DeleteSpendLimit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_DeleteSpendLimit_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_DeleteSpendLimit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SpendLimitService_DeleteSpendLimit_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_DeleteSpendLimit_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_DeleteSpendLimit_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimitUsage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage", runtime.WithHTTPPathPattern("/v1/{name=gateways/*/spend-limits/*}:getUsage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_GetSpendLimitUsage_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimitUsage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SpendLimitService_GetSpendLimitUsage_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage", runtime.WithHTTPPathPattern("/v1/{name=spend-limits/*}:getUsage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpendLimitService_GetSpendLimitUsage_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SpendLimitService_GetSpendLimitUsage_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_SpendLimitService_CreateSpendLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "spend-limits"}, "")) + pattern_SpendLimitService_CreateSpendLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "spend-limits"}, "")) + pattern_SpendLimitService_GetSpendLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "spend-limits", "name"}, "")) + pattern_SpendLimitService_GetSpendLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "spend-limits", "name"}, "")) + pattern_SpendLimitService_ListSpendLimits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "gateways", "parent", "spend-limits"}, "")) + pattern_SpendLimitService_ListSpendLimits_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "spend-limits"}, "")) + pattern_SpendLimitService_UpdateSpendLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "spend-limits", "spend_limit.name"}, "")) + pattern_SpendLimitService_UpdateSpendLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "spend-limits", "spend_limit.name"}, "")) + pattern_SpendLimitService_DeleteSpendLimit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "spend-limits", "name"}, "")) + pattern_SpendLimitService_DeleteSpendLimit_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "spend-limits", "name"}, "")) + pattern_SpendLimitService_GetSpendLimitUsage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "gateways", "spend-limits", "name"}, "getUsage")) + pattern_SpendLimitService_GetSpendLimitUsage_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "spend-limits", "name"}, "getUsage")) +) + +var ( + forward_SpendLimitService_CreateSpendLimit_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_CreateSpendLimit_1 = runtime.ForwardResponseMessage + forward_SpendLimitService_GetSpendLimit_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_GetSpendLimit_1 = runtime.ForwardResponseMessage + forward_SpendLimitService_ListSpendLimits_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_ListSpendLimits_1 = runtime.ForwardResponseMessage + forward_SpendLimitService_UpdateSpendLimit_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_UpdateSpendLimit_1 = runtime.ForwardResponseMessage + forward_SpendLimitService_DeleteSpendLimit_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_DeleteSpendLimit_1 = runtime.ForwardResponseMessage + forward_SpendLimitService_GetSpendLimitUsage_0 = runtime.ForwardResponseMessage + forward_SpendLimitService_GetSpendLimitUsage_1 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit_grpc.pb.go new file mode 100644 index 0000000000..974807d6c7 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/spend_limit_grpc.pb.go @@ -0,0 +1,312 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/spend_limit.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + SpendLimitService_CreateSpendLimit_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/CreateSpendLimit" + SpendLimitService_GetSpendLimit_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimit" + SpendLimitService_ListSpendLimits_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/ListSpendLimits" + SpendLimitService_UpdateSpendLimit_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/UpdateSpendLimit" + SpendLimitService_DeleteSpendLimit_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/DeleteSpendLimit" + SpendLimitService_GetSpendLimitUsage_FullMethodName = "/redpanda.api.aigateway.v1.SpendLimitService/GetSpendLimitUsage" +) + +// SpendLimitServiceClient is the client API for SpendLimitService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SpendLimitServiceClient interface { + CreateSpendLimit(ctx context.Context, in *CreateSpendLimitRequest, opts ...grpc.CallOption) (*CreateSpendLimitResponse, error) + GetSpendLimit(ctx context.Context, in *GetSpendLimitRequest, opts ...grpc.CallOption) (*GetSpendLimitResponse, error) + ListSpendLimits(ctx context.Context, in *ListSpendLimitsRequest, opts ...grpc.CallOption) (*ListSpendLimitsResponse, error) + UpdateSpendLimit(ctx context.Context, in *UpdateSpendLimitRequest, opts ...grpc.CallOption) (*UpdateSpendLimitResponse, error) + DeleteSpendLimit(ctx context.Context, in *DeleteSpendLimitRequest, opts ...grpc.CallOption) (*DeleteSpendLimitResponse, error) + GetSpendLimitUsage(ctx context.Context, in *GetSpendLimitUsageRequest, opts ...grpc.CallOption) (*GetSpendLimitUsageResponse, error) +} + +type spendLimitServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSpendLimitServiceClient(cc grpc.ClientConnInterface) SpendLimitServiceClient { + return &spendLimitServiceClient{cc} +} + +func (c *spendLimitServiceClient) CreateSpendLimit(ctx context.Context, in *CreateSpendLimitRequest, opts ...grpc.CallOption) (*CreateSpendLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateSpendLimitResponse) + err := c.cc.Invoke(ctx, SpendLimitService_CreateSpendLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *spendLimitServiceClient) GetSpendLimit(ctx context.Context, in *GetSpendLimitRequest, opts ...grpc.CallOption) (*GetSpendLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSpendLimitResponse) + err := c.cc.Invoke(ctx, SpendLimitService_GetSpendLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *spendLimitServiceClient) ListSpendLimits(ctx context.Context, in *ListSpendLimitsRequest, opts ...grpc.CallOption) (*ListSpendLimitsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListSpendLimitsResponse) + err := c.cc.Invoke(ctx, SpendLimitService_ListSpendLimits_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *spendLimitServiceClient) UpdateSpendLimit(ctx context.Context, in *UpdateSpendLimitRequest, opts ...grpc.CallOption) (*UpdateSpendLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateSpendLimitResponse) + err := c.cc.Invoke(ctx, SpendLimitService_UpdateSpendLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *spendLimitServiceClient) DeleteSpendLimit(ctx context.Context, in *DeleteSpendLimitRequest, opts ...grpc.CallOption) (*DeleteSpendLimitResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteSpendLimitResponse) + err := c.cc.Invoke(ctx, SpendLimitService_DeleteSpendLimit_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *spendLimitServiceClient) GetSpendLimitUsage(ctx context.Context, in *GetSpendLimitUsageRequest, opts ...grpc.CallOption) (*GetSpendLimitUsageResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetSpendLimitUsageResponse) + err := c.cc.Invoke(ctx, SpendLimitService_GetSpendLimitUsage_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SpendLimitServiceServer is the server API for SpendLimitService service. +// All implementations must embed UnimplementedSpendLimitServiceServer +// for forward compatibility. +type SpendLimitServiceServer interface { + CreateSpendLimit(context.Context, *CreateSpendLimitRequest) (*CreateSpendLimitResponse, error) + GetSpendLimit(context.Context, *GetSpendLimitRequest) (*GetSpendLimitResponse, error) + ListSpendLimits(context.Context, *ListSpendLimitsRequest) (*ListSpendLimitsResponse, error) + UpdateSpendLimit(context.Context, *UpdateSpendLimitRequest) (*UpdateSpendLimitResponse, error) + DeleteSpendLimit(context.Context, *DeleteSpendLimitRequest) (*DeleteSpendLimitResponse, error) + GetSpendLimitUsage(context.Context, *GetSpendLimitUsageRequest) (*GetSpendLimitUsageResponse, error) + mustEmbedUnimplementedSpendLimitServiceServer() +} + +// UnimplementedSpendLimitServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedSpendLimitServiceServer struct{} + +func (UnimplementedSpendLimitServiceServer) CreateSpendLimit(context.Context, *CreateSpendLimitRequest) (*CreateSpendLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSpendLimit not implemented") +} +func (UnimplementedSpendLimitServiceServer) GetSpendLimit(context.Context, *GetSpendLimitRequest) (*GetSpendLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSpendLimit not implemented") +} +func (UnimplementedSpendLimitServiceServer) ListSpendLimits(context.Context, *ListSpendLimitsRequest) (*ListSpendLimitsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSpendLimits not implemented") +} +func (UnimplementedSpendLimitServiceServer) UpdateSpendLimit(context.Context, *UpdateSpendLimitRequest) (*UpdateSpendLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateSpendLimit not implemented") +} +func (UnimplementedSpendLimitServiceServer) DeleteSpendLimit(context.Context, *DeleteSpendLimitRequest) (*DeleteSpendLimitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteSpendLimit not implemented") +} +func (UnimplementedSpendLimitServiceServer) GetSpendLimitUsage(context.Context, *GetSpendLimitUsageRequest) (*GetSpendLimitUsageResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSpendLimitUsage not implemented") +} +func (UnimplementedSpendLimitServiceServer) mustEmbedUnimplementedSpendLimitServiceServer() {} +func (UnimplementedSpendLimitServiceServer) testEmbeddedByValue() {} + +// UnsafeSpendLimitServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SpendLimitServiceServer will +// result in compilation errors. +type UnsafeSpendLimitServiceServer interface { + mustEmbedUnimplementedSpendLimitServiceServer() +} + +func RegisterSpendLimitServiceServer(s grpc.ServiceRegistrar, srv SpendLimitServiceServer) { + // If the following call pancis, it indicates UnimplementedSpendLimitServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&SpendLimitService_ServiceDesc, srv) +} + +func _SpendLimitService_CreateSpendLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSpendLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).CreateSpendLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_CreateSpendLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).CreateSpendLimit(ctx, req.(*CreateSpendLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SpendLimitService_GetSpendLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSpendLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).GetSpendLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_GetSpendLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).GetSpendLimit(ctx, req.(*GetSpendLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SpendLimitService_ListSpendLimits_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListSpendLimitsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).ListSpendLimits(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_ListSpendLimits_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).ListSpendLimits(ctx, req.(*ListSpendLimitsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SpendLimitService_UpdateSpendLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateSpendLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).UpdateSpendLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_UpdateSpendLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).UpdateSpendLimit(ctx, req.(*UpdateSpendLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SpendLimitService_DeleteSpendLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteSpendLimitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).DeleteSpendLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_DeleteSpendLimit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).DeleteSpendLimit(ctx, req.(*DeleteSpendLimitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SpendLimitService_GetSpendLimitUsage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSpendLimitUsageRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SpendLimitServiceServer).GetSpendLimitUsage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SpendLimitService_GetSpendLimitUsage_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SpendLimitServiceServer).GetSpendLimitUsage(ctx, req.(*GetSpendLimitUsageRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SpendLimitService_ServiceDesc is the grpc.ServiceDesc for SpendLimitService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SpendLimitService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.SpendLimitService", + HandlerType: (*SpendLimitServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateSpendLimit", + Handler: _SpendLimitService_CreateSpendLimit_Handler, + }, + { + MethodName: "GetSpendLimit", + Handler: _SpendLimitService_GetSpendLimit_Handler, + }, + { + MethodName: "ListSpendLimits", + Handler: _SpendLimitService_ListSpendLimits_Handler, + }, + { + MethodName: "UpdateSpendLimit", + Handler: _SpendLimitService_UpdateSpendLimit_Handler, + }, + { + MethodName: "DeleteSpendLimit", + Handler: _SpendLimitService_DeleteSpendLimit_Handler, + }, + { + MethodName: "GetSpendLimitUsage", + Handler: _SpendLimitService_GetSpendLimitUsage_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/spend_limit.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.go new file mode 100644 index 0000000000..94cf701864 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.go @@ -0,0 +1,2814 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/sso.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// IdentityProviderType specifies the protocol used by the identity provider. +type IdentityProviderType int32 + +const ( + IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED IdentityProviderType = 0 + // OpenID Connect (OIDC) provider + IdentityProviderType_IDENTITY_PROVIDER_TYPE_OIDC IdentityProviderType = 1 +) + +// Enum value maps for IdentityProviderType. +var ( + IdentityProviderType_name = map[int32]string{ + 0: "IDENTITY_PROVIDER_TYPE_UNSPECIFIED", + 1: "IDENTITY_PROVIDER_TYPE_OIDC", + } + IdentityProviderType_value = map[string]int32{ + "IDENTITY_PROVIDER_TYPE_UNSPECIFIED": 0, + "IDENTITY_PROVIDER_TYPE_OIDC": 1, + } +) + +func (x IdentityProviderType) Enum() *IdentityProviderType { + p := new(IdentityProviderType) + *p = x + return p +} + +func (x IdentityProviderType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdentityProviderType) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_sso_proto_enumTypes[0].Descriptor() +} + +func (IdentityProviderType) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_sso_proto_enumTypes[0] +} + +func (x IdentityProviderType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IdentityProviderType.Descriptor instead. +func (IdentityProviderType) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{0} +} + +// AuthMethod specifies how an IdP can be used for authentication. +type AuthMethod int32 + +const ( + AuthMethod_AUTH_METHOD_UNSPECIFIED AuthMethod = 0 + // OAuth2 Authorization Code flow with PKCE (browser SSO). + // Used for WebUI login where the user is redirected to the IdP. + AuthMethod_AUTH_METHOD_AUTHORIZATION_CODE AuthMethod = 1 + // Direct Bearer token validation (API authentication). + // Used for CLI/API access where tokens are obtained externally. + AuthMethod_AUTH_METHOD_JWT_BEARER AuthMethod = 2 +) + +// Enum value maps for AuthMethod. +var ( + AuthMethod_name = map[int32]string{ + 0: "AUTH_METHOD_UNSPECIFIED", + 1: "AUTH_METHOD_AUTHORIZATION_CODE", + 2: "AUTH_METHOD_JWT_BEARER", + } + AuthMethod_value = map[string]int32{ + "AUTH_METHOD_UNSPECIFIED": 0, + "AUTH_METHOD_AUTHORIZATION_CODE": 1, + "AUTH_METHOD_JWT_BEARER": 2, + } +) + +func (x AuthMethod) Enum() *AuthMethod { + p := new(AuthMethod) + *p = x + return p +} + +func (x AuthMethod) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuthMethod) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_sso_proto_enumTypes[1].Descriptor() +} + +func (AuthMethod) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_sso_proto_enumTypes[1] +} + +func (x AuthMethod) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuthMethod.Descriptor instead. +func (AuthMethod) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{1} +} + +// ProviderTemplate identifies pre-built provider configurations. +type ProviderTemplate int32 + +const ( + ProviderTemplate_PROVIDER_TEMPLATE_UNSPECIFIED ProviderTemplate = 0 + // Generic OIDC provider (manual configuration) + ProviderTemplate_PROVIDER_TEMPLATE_GENERIC ProviderTemplate = 1 + // Google Workspace / Google Cloud Identity + ProviderTemplate_PROVIDER_TEMPLATE_GOOGLE ProviderTemplate = 2 + // GitHub (OAuth2 with OIDC-like claims) + ProviderTemplate_PROVIDER_TEMPLATE_GITHUB ProviderTemplate = 3 + // Okta + ProviderTemplate_PROVIDER_TEMPLATE_OKTA ProviderTemplate = 4 + // Microsoft Azure AD / Entra ID + ProviderTemplate_PROVIDER_TEMPLATE_AZURE_AD ProviderTemplate = 5 + // Auth0 + ProviderTemplate_PROVIDER_TEMPLATE_AUTH0 ProviderTemplate = 6 +) + +// Enum value maps for ProviderTemplate. +var ( + ProviderTemplate_name = map[int32]string{ + 0: "PROVIDER_TEMPLATE_UNSPECIFIED", + 1: "PROVIDER_TEMPLATE_GENERIC", + 2: "PROVIDER_TEMPLATE_GOOGLE", + 3: "PROVIDER_TEMPLATE_GITHUB", + 4: "PROVIDER_TEMPLATE_OKTA", + 5: "PROVIDER_TEMPLATE_AZURE_AD", + 6: "PROVIDER_TEMPLATE_AUTH0", + } + ProviderTemplate_value = map[string]int32{ + "PROVIDER_TEMPLATE_UNSPECIFIED": 0, + "PROVIDER_TEMPLATE_GENERIC": 1, + "PROVIDER_TEMPLATE_GOOGLE": 2, + "PROVIDER_TEMPLATE_GITHUB": 3, + "PROVIDER_TEMPLATE_OKTA": 4, + "PROVIDER_TEMPLATE_AZURE_AD": 5, + "PROVIDER_TEMPLATE_AUTH0": 6, + } +) + +func (x ProviderTemplate) Enum() *ProviderTemplate { + p := new(ProviderTemplate) + *p = x + return p +} + +func (x ProviderTemplate) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProviderTemplate) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_sso_proto_enumTypes[2].Descriptor() +} + +func (ProviderTemplate) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_sso_proto_enumTypes[2] +} + +func (x ProviderTemplate) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ProviderTemplate.Descriptor instead. +func (ProviderTemplate) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{2} +} + +// DomainVerificationStatus indicates the verification state of a domain. +type DomainVerificationStatus int32 + +const ( + DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_UNSPECIFIED DomainVerificationStatus = 0 + // Verification pending - DNS record not yet added or checked + DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_PENDING DomainVerificationStatus = 1 + // Domain successfully verified + DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_VERIFIED DomainVerificationStatus = 2 + // Verification failed (DNS record not found or mismatch) + DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_FAILED DomainVerificationStatus = 3 + // Verification token expired + DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_EXPIRED DomainVerificationStatus = 4 +) + +// Enum value maps for DomainVerificationStatus. +var ( + DomainVerificationStatus_name = map[int32]string{ + 0: "DOMAIN_VERIFICATION_STATUS_UNSPECIFIED", + 1: "DOMAIN_VERIFICATION_STATUS_PENDING", + 2: "DOMAIN_VERIFICATION_STATUS_VERIFIED", + 3: "DOMAIN_VERIFICATION_STATUS_FAILED", + 4: "DOMAIN_VERIFICATION_STATUS_EXPIRED", + } + DomainVerificationStatus_value = map[string]int32{ + "DOMAIN_VERIFICATION_STATUS_UNSPECIFIED": 0, + "DOMAIN_VERIFICATION_STATUS_PENDING": 1, + "DOMAIN_VERIFICATION_STATUS_VERIFIED": 2, + "DOMAIN_VERIFICATION_STATUS_FAILED": 3, + "DOMAIN_VERIFICATION_STATUS_EXPIRED": 4, + } +) + +func (x DomainVerificationStatus) Enum() *DomainVerificationStatus { + p := new(DomainVerificationStatus) + *p = x + return p +} + +func (x DomainVerificationStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DomainVerificationStatus) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_sso_proto_enumTypes[3].Descriptor() +} + +func (DomainVerificationStatus) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_sso_proto_enumTypes[3] +} + +func (x DomainVerificationStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DomainVerificationStatus.Descriptor instead. +func (DomainVerificationStatus) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{3} +} + +// IdentityProvider represents an external OIDC identity provider configuration. +type IdentityProvider struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/identity-providers/{identity_provider}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name shown in UI (e.g., "Corporate Okta") + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Provider type. Currently only OIDC is supported. + Type IdentityProviderType `protobuf:"varint,3,opt,name=type,proto3,enum=redpanda.api.aigateway.v1.IdentityProviderType" json:"type,omitempty"` + // Whether this IdP is enabled for authentication. + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // OIDC configuration. + OidcConfig *OIDCProviderConfig `protobuf:"bytes,5,opt,name=oidc_config,json=oidcConfig,proto3" json:"oidc_config,omitempty"` + // Claim mappings from IdP claims to internal user attributes. + ClaimMappings *ClaimMappings `protobuf:"bytes,6,opt,name=claim_mappings,json=claimMappings,proto3" json:"claim_mappings,omitempty"` + // JIT (Just-In-Time) provisioning settings. + JitProvisioning *JITProvisioningConfig `protobuf:"bytes,7,opt,name=jit_provisioning,json=jitProvisioning,proto3" json:"jit_provisioning,omitempty"` + // Whether to automatically link SSO identities to existing users by email. + // When enabled, if a user logs in via SSO and their verified email matches + // an existing user account, the SSO identity is linked to that account. + AutoLinkEnabled bool `protobuf:"varint,13,opt,name=auto_link_enabled,json=autoLinkEnabled,proto3" json:"auto_link_enabled,omitempty"` + // Authentication method this IdP supports. + // AUTH_METHOD_AUTHORIZATION_CODE for browser SSO, AUTH_METHOD_JWT_BEARER for API tokens. + AuthMethod AuthMethod `protobuf:"varint,14,opt,name=auth_method,json=authMethod,proto3,enum=redpanda.api.aigateway.v1.AuthMethod" json:"auth_method,omitempty"` + // Metadata for system management and bootstrap tracking. + // Used to mark IdPs as system_managed (synced from config). + Metadata map[string]string `protobuf:"bytes,15,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Provider template used for pre-built configurations. + ProviderTemplate ProviderTemplate `protobuf:"varint,8,opt,name=provider_template,json=providerTemplate,proto3,enum=redpanda.api.aigateway.v1.ProviderTemplate" json:"provider_template,omitempty"` + // Output only. Creation timestamp. + CreateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp. + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (user ID or service account). + Creator string `protobuf:"bytes,11,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater. + Updater string `protobuf:"bytes,12,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProvider) Reset() { + *x = IdentityProvider{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProvider) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProvider) ProtoMessage() {} + +func (x *IdentityProvider) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IdentityProvider.ProtoReflect.Descriptor instead. +func (*IdentityProvider) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{0} +} + +func (x *IdentityProvider) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *IdentityProvider) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *IdentityProvider) GetType() IdentityProviderType { + if x != nil { + return x.Type + } + return IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED +} + +func (x *IdentityProvider) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *IdentityProvider) GetOidcConfig() *OIDCProviderConfig { + if x != nil { + return x.OidcConfig + } + return nil +} + +func (x *IdentityProvider) GetClaimMappings() *ClaimMappings { + if x != nil { + return x.ClaimMappings + } + return nil +} + +func (x *IdentityProvider) GetJitProvisioning() *JITProvisioningConfig { + if x != nil { + return x.JitProvisioning + } + return nil +} + +func (x *IdentityProvider) GetAutoLinkEnabled() bool { + if x != nil { + return x.AutoLinkEnabled + } + return false +} + +func (x *IdentityProvider) GetAuthMethod() AuthMethod { + if x != nil { + return x.AuthMethod + } + return AuthMethod_AUTH_METHOD_UNSPECIFIED +} + +func (x *IdentityProvider) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *IdentityProvider) GetProviderTemplate() ProviderTemplate { + if x != nil { + return x.ProviderTemplate + } + return ProviderTemplate_PROVIDER_TEMPLATE_UNSPECIFIED +} + +func (x *IdentityProvider) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *IdentityProvider) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *IdentityProvider) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *IdentityProvider) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// OIDCProviderConfig contains OIDC-specific configuration for identity providers. +type OIDCProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. The issuer URL (e.g., "https://accounts.google.com"). + // Used for OIDC discovery (.well-known/openid-configuration). + IssuerUrl string `protobuf:"bytes,1,opt,name=issuer_url,json=issuerUrl,proto3" json:"issuer_url,omitempty"` + // Required. OAuth2 client ID from the IdP. + ClientId string `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // OAuth2 client secret. Only provided in create/update requests. + // Never returned in get/list responses (stored via SecretsService). + ClientSecret string `protobuf:"bytes,3,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` + // OAuth2 scopes to request. Defaults to ["openid", "profile", "email"]. + Scopes []string `protobuf:"bytes,4,rep,name=scopes,proto3" json:"scopes,omitempty"` + // Allowed audiences for token validation (required for jwt_bearer auth_method). + // Tokens must contain at least one of these audiences in the "aud" claim. + // SECURITY: Without this for jwt_bearer, any token from the issuer would be + // accepted, allowing tokens issued for other applications to access the API. + AllowedAudiences []string `protobuf:"bytes,9,rep,name=allowed_audiences,json=allowedAudiences,proto3" json:"allowed_audiences,omitempty"` + // Login URL for auth failure redirect (required for jwt_bearer auth_method). + // When authentication fails, the API returns this URL so the WebUI can + // redirect the user back to the parent application for re-authentication. + LoginUrl string `protobuf:"bytes,10,opt,name=login_url,json=loginUrl,proto3" json:"login_url,omitempty"` + // Optional. Custom authorization endpoint (overrides discovery). + AuthorizationEndpoint string `protobuf:"bytes,5,opt,name=authorization_endpoint,json=authorizationEndpoint,proto3" json:"authorization_endpoint,omitempty"` + // Optional. Custom token endpoint (overrides discovery). + TokenEndpoint string `protobuf:"bytes,6,opt,name=token_endpoint,json=tokenEndpoint,proto3" json:"token_endpoint,omitempty"` + // Optional. Custom userinfo endpoint (overrides discovery). + UserinfoEndpoint string `protobuf:"bytes,7,opt,name=userinfo_endpoint,json=userinfoEndpoint,proto3" json:"userinfo_endpoint,omitempty"` + // Optional. Custom JWKS URI (overrides discovery). + JwksUri string `protobuf:"bytes,8,opt,name=jwks_uri,json=jwksUri,proto3" json:"jwks_uri,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OIDCProviderConfig) Reset() { + *x = OIDCProviderConfig{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OIDCProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OIDCProviderConfig) ProtoMessage() {} + +func (x *OIDCProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OIDCProviderConfig.ProtoReflect.Descriptor instead. +func (*OIDCProviderConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{1} +} + +func (x *OIDCProviderConfig) GetIssuerUrl() string { + if x != nil { + return x.IssuerUrl + } + return "" +} + +func (x *OIDCProviderConfig) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +func (x *OIDCProviderConfig) GetClientSecret() string { + if x != nil { + return x.ClientSecret + } + return "" +} + +func (x *OIDCProviderConfig) GetScopes() []string { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *OIDCProviderConfig) GetAllowedAudiences() []string { + if x != nil { + return x.AllowedAudiences + } + return nil +} + +func (x *OIDCProviderConfig) GetLoginUrl() string { + if x != nil { + return x.LoginUrl + } + return "" +} + +func (x *OIDCProviderConfig) GetAuthorizationEndpoint() string { + if x != nil { + return x.AuthorizationEndpoint + } + return "" +} + +func (x *OIDCProviderConfig) GetTokenEndpoint() string { + if x != nil { + return x.TokenEndpoint + } + return "" +} + +func (x *OIDCProviderConfig) GetUserinfoEndpoint() string { + if x != nil { + return x.UserinfoEndpoint + } + return "" +} + +func (x *OIDCProviderConfig) GetJwksUri() string { + if x != nil { + return x.JwksUri + } + return "" +} + +// ClaimMappings defines how external IdP claims map to internal user attributes. +type ClaimMappings struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Claim containing the user's email address. + // Default: "email" + EmailClaim string `protobuf:"bytes,1,opt,name=email_claim,json=emailClaim,proto3" json:"email_claim,omitempty"` + // Claim containing the user's display name. + // Default: "name" + NameClaim string `protobuf:"bytes,2,opt,name=name_claim,json=nameClaim,proto3" json:"name_claim,omitempty"` + // Claim containing the user's given/first name. + // Default: "given_name" + GivenNameClaim string `protobuf:"bytes,3,opt,name=given_name_claim,json=givenNameClaim,proto3" json:"given_name_claim,omitempty"` + // Claim containing the user's family/last name. + // Default: "family_name" + FamilyNameClaim string `protobuf:"bytes,4,opt,name=family_name_claim,json=familyNameClaim,proto3" json:"family_name_claim,omitempty"` + // Claim containing the user's profile picture URL. + // Default: "picture" + PictureClaim string `protobuf:"bytes,5,opt,name=picture_claim,json=pictureClaim,proto3" json:"picture_claim,omitempty"` + // Additional custom claim mappings. + // Key: internal attribute name, Value: external claim name + CustomClaims map[string]string `protobuf:"bytes,6,rep,name=custom_claims,json=customClaims,proto3" json:"custom_claims,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ClaimMappings) Reset() { + *x = ClaimMappings{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ClaimMappings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClaimMappings) ProtoMessage() {} + +func (x *ClaimMappings) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClaimMappings.ProtoReflect.Descriptor instead. +func (*ClaimMappings) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{2} +} + +func (x *ClaimMappings) GetEmailClaim() string { + if x != nil { + return x.EmailClaim + } + return "" +} + +func (x *ClaimMappings) GetNameClaim() string { + if x != nil { + return x.NameClaim + } + return "" +} + +func (x *ClaimMappings) GetGivenNameClaim() string { + if x != nil { + return x.GivenNameClaim + } + return "" +} + +func (x *ClaimMappings) GetFamilyNameClaim() string { + if x != nil { + return x.FamilyNameClaim + } + return "" +} + +func (x *ClaimMappings) GetPictureClaim() string { + if x != nil { + return x.PictureClaim + } + return "" +} + +func (x *ClaimMappings) GetCustomClaims() map[string]string { + if x != nil { + return x.CustomClaims + } + return nil +} + +// JITProvisioningConfig controls automatic user creation on first login. +type JITProvisioningConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether to automatically create users on first SSO login. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Default organization to add JIT-provisioned users to. + // Format: `accounts/{account}/organizations/{organization}` + DefaultOrganization string `protobuf:"bytes,2,opt,name=default_organization,json=defaultOrganization,proto3" json:"default_organization,omitempty"` + // Default role for JIT-provisioned users in the organization. + // Values: "admin", "member", "viewer". Default: "member" + DefaultRole string `protobuf:"bytes,3,opt,name=default_role,json=defaultRole,proto3" json:"default_role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JITProvisioningConfig) Reset() { + *x = JITProvisioningConfig{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JITProvisioningConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JITProvisioningConfig) ProtoMessage() {} + +func (x *JITProvisioningConfig) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JITProvisioningConfig.ProtoReflect.Descriptor instead. +func (*JITProvisioningConfig) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{3} +} + +func (x *JITProvisioningConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *JITProvisioningConfig) GetDefaultOrganization() string { + if x != nil { + return x.DefaultOrganization + } + return "" +} + +func (x *JITProvisioningConfig) GetDefaultRole() string { + if x != nil { + return x.DefaultRole + } + return "" +} + +// EmailDomain represents an email domain mapped to an identity provider. +type EmailDomain struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The email domain (e.g., "example.com"). + Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` + // Whether this domain is enabled for Home Realm Discovery. + // Only verified domains can be enabled. + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Verification status. + VerificationStatus DomainVerificationStatus `protobuf:"varint,4,opt,name=verification_status,json=verificationStatus,proto3,enum=redpanda.api.aigateway.v1.DomainVerificationStatus" json:"verification_status,omitempty"` + // DNS TXT record value for verification. + // Add as: _redpanda-aigateway-verify.{domain} TXT "{verification_token}" + VerificationToken string `protobuf:"bytes,5,opt,name=verification_token,json=verificationToken,proto3" json:"verification_token,omitempty"` + // Verification token expiration time. + VerificationExpiresAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=verification_expires_at,json=verificationExpiresAt,proto3" json:"verification_expires_at,omitempty"` + // When the domain was verified. + VerifiedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=verified_at,json=verifiedAt,proto3" json:"verified_at,omitempty"` + // Output only. Creation timestamp. + CreateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EmailDomain) Reset() { + *x = EmailDomain{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EmailDomain) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmailDomain) ProtoMessage() {} + +func (x *EmailDomain) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmailDomain.ProtoReflect.Descriptor instead. +func (*EmailDomain) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{4} +} + +func (x *EmailDomain) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EmailDomain) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +func (x *EmailDomain) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *EmailDomain) GetVerificationStatus() DomainVerificationStatus { + if x != nil { + return x.VerificationStatus + } + return DomainVerificationStatus_DOMAIN_VERIFICATION_STATUS_UNSPECIFIED +} + +func (x *EmailDomain) GetVerificationToken() string { + if x != nil { + return x.VerificationToken + } + return "" +} + +func (x *EmailDomain) GetVerificationExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.VerificationExpiresAt + } + return nil +} + +func (x *EmailDomain) GetVerifiedAt() *timestamppb.Timestamp { + if x != nil { + return x.VerifiedAt + } + return nil +} + +func (x *EmailDomain) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +// Request message for CreateIdentityProvider. +type CreateIdentityProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Optional. The IdP ID to use. If empty, server generates one. + IdentityProviderId string `protobuf:"bytes,2,opt,name=identity_provider_id,json=identityProviderId,proto3" json:"identity_provider_id,omitempty"` + // Required. The identity provider to create. + IdentityProvider *IdentityProvider `protobuf:"bytes,3,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateIdentityProviderRequest) Reset() { + *x = CreateIdentityProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateIdentityProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateIdentityProviderRequest) ProtoMessage() {} + +func (x *CreateIdentityProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateIdentityProviderRequest.ProtoReflect.Descriptor instead. +func (*CreateIdentityProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateIdentityProviderRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateIdentityProviderRequest) GetIdentityProviderId() string { + if x != nil { + return x.IdentityProviderId + } + return "" +} + +func (x *CreateIdentityProviderRequest) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +// Response message for CreateIdentityProvider. +type CreateIdentityProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + IdentityProvider *IdentityProvider `protobuf:"bytes,1,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateIdentityProviderResponse) Reset() { + *x = CreateIdentityProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateIdentityProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateIdentityProviderResponse) ProtoMessage() {} + +func (x *CreateIdentityProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateIdentityProviderResponse.ProtoReflect.Descriptor instead. +func (*CreateIdentityProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{6} +} + +func (x *CreateIdentityProviderResponse) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +// Request message for GetIdentityProvider. +type GetIdentityProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Resource name of the identity provider. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIdentityProviderRequest) Reset() { + *x = GetIdentityProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIdentityProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIdentityProviderRequest) ProtoMessage() {} + +func (x *GetIdentityProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetIdentityProviderRequest.ProtoReflect.Descriptor instead. +func (*GetIdentityProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{7} +} + +func (x *GetIdentityProviderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetIdentityProvider. +type GetIdentityProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + IdentityProvider *IdentityProvider `protobuf:"bytes,1,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + // Output only. Number of users linked to this identity provider via SSO. + LinkedUsersCount int32 `protobuf:"varint,2,opt,name=linked_users_count,json=linkedUsersCount,proto3" json:"linked_users_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIdentityProviderResponse) Reset() { + *x = GetIdentityProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIdentityProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIdentityProviderResponse) ProtoMessage() {} + +func (x *GetIdentityProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetIdentityProviderResponse.ProtoReflect.Descriptor instead. +func (*GetIdentityProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{8} +} + +func (x *GetIdentityProviderResponse) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +func (x *GetIdentityProviderResponse) GetLinkedUsersCount() int32 { + if x != nil { + return x.LinkedUsersCount + } + return 0 +} + +// Request message for ListIdentityProviders. +type ListIdentityProvidersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of IdPs to return (max 100). + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter by enabled status. + FilterEnabled bool `protobuf:"varint,4,opt,name=filter_enabled,json=filterEnabled,proto3" json:"filter_enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIdentityProvidersRequest) Reset() { + *x = ListIdentityProvidersRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIdentityProvidersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIdentityProvidersRequest) ProtoMessage() {} + +func (x *ListIdentityProvidersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIdentityProvidersRequest.ProtoReflect.Descriptor instead. +func (*ListIdentityProvidersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{9} +} + +func (x *ListIdentityProvidersRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListIdentityProvidersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListIdentityProvidersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListIdentityProvidersRequest) GetFilterEnabled() bool { + if x != nil { + return x.FilterEnabled + } + return false +} + +// Response message for ListIdentityProviders. +type ListIdentityProvidersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + IdentityProviders []*IdentityProvider `protobuf:"bytes,1,rep,name=identity_providers,json=identityProviders,proto3" json:"identity_providers,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIdentityProvidersResponse) Reset() { + *x = ListIdentityProvidersResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIdentityProvidersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIdentityProvidersResponse) ProtoMessage() {} + +func (x *ListIdentityProvidersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIdentityProvidersResponse.ProtoReflect.Descriptor instead. +func (*ListIdentityProvidersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{10} +} + +func (x *ListIdentityProvidersResponse) GetIdentityProviders() []*IdentityProvider { + if x != nil { + return x.IdentityProviders + } + return nil +} + +func (x *ListIdentityProvidersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListIdentityProvidersResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateIdentityProvider. +type UpdateIdentityProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. The identity provider to update. + IdentityProvider *IdentityProvider `protobuf:"bytes,1,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + // Fields to update. If not specified, all non-empty fields are updated. + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIdentityProviderRequest) Reset() { + *x = UpdateIdentityProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIdentityProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIdentityProviderRequest) ProtoMessage() {} + +func (x *UpdateIdentityProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateIdentityProviderRequest.ProtoReflect.Descriptor instead. +func (*UpdateIdentityProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{11} +} + +func (x *UpdateIdentityProviderRequest) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +func (x *UpdateIdentityProviderRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateIdentityProvider. +type UpdateIdentityProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + IdentityProvider *IdentityProvider `protobuf:"bytes,1,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIdentityProviderResponse) Reset() { + *x = UpdateIdentityProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIdentityProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIdentityProviderResponse) ProtoMessage() {} + +func (x *UpdateIdentityProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateIdentityProviderResponse.ProtoReflect.Descriptor instead. +func (*UpdateIdentityProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateIdentityProviderResponse) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +// Request message for DeleteIdentityProvider. +type DeleteIdentityProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Resource name of the identity provider to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, also delete all associated domains and user identity links. + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteIdentityProviderRequest) Reset() { + *x = DeleteIdentityProviderRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteIdentityProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteIdentityProviderRequest) ProtoMessage() {} + +func (x *DeleteIdentityProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteIdentityProviderRequest.ProtoReflect.Descriptor instead. +func (*DeleteIdentityProviderRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{13} +} + +func (x *DeleteIdentityProviderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteIdentityProviderRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteIdentityProvider. +type DeleteIdentityProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteIdentityProviderResponse) Reset() { + *x = DeleteIdentityProviderResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteIdentityProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteIdentityProviderResponse) ProtoMessage() {} + +func (x *DeleteIdentityProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteIdentityProviderResponse.ProtoReflect.Descriptor instead. +func (*DeleteIdentityProviderResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{14} +} + +// Request message for AddDomain. +type AddDomainRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Parent identity provider. + // Format: `accounts/{account}/identity-providers/{idp}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Required. The email domain to add (e.g., "example.com"). + Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddDomainRequest) Reset() { + *x = AddDomainRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddDomainRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddDomainRequest) ProtoMessage() {} + +func (x *AddDomainRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddDomainRequest.ProtoReflect.Descriptor instead. +func (*AddDomainRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{15} +} + +func (x *AddDomainRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *AddDomainRequest) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +// Response message for AddDomain. +type AddDomainResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The created domain with verification instructions. + EmailDomain *EmailDomain `protobuf:"bytes,1,opt,name=email_domain,json=emailDomain,proto3" json:"email_domain,omitempty"` + // Instructions for DNS verification. + VerificationInstructions string `protobuf:"bytes,2,opt,name=verification_instructions,json=verificationInstructions,proto3" json:"verification_instructions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddDomainResponse) Reset() { + *x = AddDomainResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddDomainResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddDomainResponse) ProtoMessage() {} + +func (x *AddDomainResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddDomainResponse.ProtoReflect.Descriptor instead. +func (*AddDomainResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{16} +} + +func (x *AddDomainResponse) GetEmailDomain() *EmailDomain { + if x != nil { + return x.EmailDomain + } + return nil +} + +func (x *AddDomainResponse) GetVerificationInstructions() string { + if x != nil { + return x.VerificationInstructions + } + return "" +} + +// Request message for ListDomains. +type ListDomainsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Parent identity provider. + // Format: `accounts/{account}/identity-providers/{idp}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of domains to return. + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDomainsRequest) Reset() { + *x = ListDomainsRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDomainsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDomainsRequest) ProtoMessage() {} + +func (x *ListDomainsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDomainsRequest.ProtoReflect.Descriptor instead. +func (*ListDomainsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{17} +} + +func (x *ListDomainsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListDomainsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListDomainsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListDomains. +type ListDomainsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Domains []*EmailDomain `protobuf:"bytes,1,rep,name=domains,proto3" json:"domains,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDomainsResponse) Reset() { + *x = ListDomainsResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDomainsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDomainsResponse) ProtoMessage() {} + +func (x *ListDomainsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDomainsResponse.ProtoReflect.Descriptor instead. +func (*ListDomainsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{18} +} + +func (x *ListDomainsResponse) GetDomains() []*EmailDomain { + if x != nil { + return x.Domains + } + return nil +} + +func (x *ListDomainsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListDomainsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for RemoveDomain. +type RemoveDomainRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Resource name of the domain to remove. + // Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveDomainRequest) Reset() { + *x = RemoveDomainRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveDomainRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveDomainRequest) ProtoMessage() {} + +func (x *RemoveDomainRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveDomainRequest.ProtoReflect.Descriptor instead. +func (*RemoveDomainRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{19} +} + +func (x *RemoveDomainRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RemoveDomain. +type RemoveDomainResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveDomainResponse) Reset() { + *x = RemoveDomainResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveDomainResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveDomainResponse) ProtoMessage() {} + +func (x *RemoveDomainResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveDomainResponse.ProtoReflect.Descriptor instead. +func (*RemoveDomainResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{20} +} + +// Request message for VerifyDomain. +type VerifyDomainRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Resource name of the domain to verify. + // Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyDomainRequest) Reset() { + *x = VerifyDomainRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyDomainRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyDomainRequest) ProtoMessage() {} + +func (x *VerifyDomainRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyDomainRequest.ProtoReflect.Descriptor instead. +func (*VerifyDomainRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{21} +} + +func (x *VerifyDomainRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for VerifyDomain. +type VerifyDomainResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Updated domain with verification result. + EmailDomain *EmailDomain `protobuf:"bytes,1,opt,name=email_domain,json=emailDomain,proto3" json:"email_domain,omitempty"` + // Whether verification succeeded. + Verified bool `protobuf:"varint,2,opt,name=verified,proto3" json:"verified,omitempty"` + // Error message if verification failed. + ErrorMessage string `protobuf:"bytes,3,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyDomainResponse) Reset() { + *x = VerifyDomainResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyDomainResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyDomainResponse) ProtoMessage() {} + +func (x *VerifyDomainResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyDomainResponse.ProtoReflect.Descriptor instead. +func (*VerifyDomainResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{22} +} + +func (x *VerifyDomainResponse) GetEmailDomain() *EmailDomain { + if x != nil { + return x.EmailDomain + } + return nil +} + +func (x *VerifyDomainResponse) GetVerified() bool { + if x != nil { + return x.Verified + } + return false +} + +func (x *VerifyDomainResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +// Request message for LookupIdPByEmail. +type LookupIdPByEmailRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Required. The email address to look up. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LookupIdPByEmailRequest) Reset() { + *x = LookupIdPByEmailRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupIdPByEmailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupIdPByEmailRequest) ProtoMessage() {} + +func (x *LookupIdPByEmailRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupIdPByEmailRequest.ProtoReflect.Descriptor instead. +func (*LookupIdPByEmailRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{23} +} + +func (x *LookupIdPByEmailRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *LookupIdPByEmailRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +// Response message for LookupIdPByEmail. +type LookupIdPByEmailResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The identity provider for this email domain. + // Empty if no IdP is configured (user should use password login). + IdentityProvider *IdentityProvider `protobuf:"bytes,1,opt,name=identity_provider,json=identityProvider,proto3" json:"identity_provider,omitempty"` + // Whether an IdP was found for this email domain. + HasIdp bool `protobuf:"varint,2,opt,name=has_idp,json=hasIdp,proto3" json:"has_idp,omitempty"` + // The authorization URL to redirect the user to. + // Only set if has_idp is true. + AuthorizationUrl string `protobuf:"bytes,3,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + // Whether the user can also authenticate via password. + // True if the user exists and has a password set (e.g., super admins). + // When both has_idp and allow_password_login are true, UI should show both options. + AllowPasswordLogin bool `protobuf:"varint,4,opt,name=allow_password_login,json=allowPasswordLogin,proto3" json:"allow_password_login,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LookupIdPByEmailResponse) Reset() { + *x = LookupIdPByEmailResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupIdPByEmailResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupIdPByEmailResponse) ProtoMessage() {} + +func (x *LookupIdPByEmailResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupIdPByEmailResponse.ProtoReflect.Descriptor instead. +func (*LookupIdPByEmailResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{24} +} + +func (x *LookupIdPByEmailResponse) GetIdentityProvider() *IdentityProvider { + if x != nil { + return x.IdentityProvider + } + return nil +} + +func (x *LookupIdPByEmailResponse) GetHasIdp() bool { + if x != nil { + return x.HasIdp + } + return false +} + +func (x *LookupIdPByEmailResponse) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *LookupIdPByEmailResponse) GetAllowPasswordLogin() bool { + if x != nil { + return x.AllowPasswordLogin + } + return false +} + +// Request message for TestCredentials. +// Tests that the client_id and client_secret are valid by attempting +// a client credentials grant. No scopes are sent - we only validate credentials. +type TestCredentialsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required. The OIDC issuer URL. + IssuerUrl string `protobuf:"bytes,1,opt,name=issuer_url,json=issuerUrl,proto3" json:"issuer_url,omitempty"` + // Required. The OAuth2 client ID. + ClientId string `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // Required. The OAuth2 client secret. + ClientSecret string `protobuf:"bytes,3,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestCredentialsRequest) Reset() { + *x = TestCredentialsRequest{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestCredentialsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestCredentialsRequest) ProtoMessage() {} + +func (x *TestCredentialsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestCredentialsRequest.ProtoReflect.Descriptor instead. +func (*TestCredentialsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{25} +} + +func (x *TestCredentialsRequest) GetIssuerUrl() string { + if x != nil { + return x.IssuerUrl + } + return "" +} + +func (x *TestCredentialsRequest) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +func (x *TestCredentialsRequest) GetClientSecret() string { + if x != nil { + return x.ClientSecret + } + return "" +} + +// Response message for TestCredentials. +type TestCredentialsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether the test succeeded. + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + // Error message if the test failed (or success note if credentials valid). + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + // Decoded token claims as JSON. + // Contains standard claims (iss, sub, aud, exp, iat) and custom claims. + Claims map[string]string `protobuf:"bytes,5,rep,name=claims,proto3" json:"claims,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The raw access token (truncated for security). + // Shows first 10 and last 10 characters with ... in between. + AccessTokenPreview string `protobuf:"bytes,6,opt,name=access_token_preview,json=accessTokenPreview,proto3" json:"access_token_preview,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestCredentialsResponse) Reset() { + *x = TestCredentialsResponse{} + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestCredentialsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestCredentialsResponse) ProtoMessage() {} + +func (x *TestCredentialsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_sso_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestCredentialsResponse.ProtoReflect.Descriptor instead. +func (*TestCredentialsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP(), []int{26} +} + +func (x *TestCredentialsResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *TestCredentialsResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +func (x *TestCredentialsResponse) GetClaims() map[string]string { + if x != nil { + return x.Claims + } + return nil +} + +func (x *TestCredentialsResponse) GetAccessTokenPreview() string { + if x != nil { + return x.AccessTokenPreview + } + return "" +} + +var File_redpanda_api_aigateway_v1_sso_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_sso_proto_rawDesc = []byte{ + 0x0a, 0x23, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x73, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x08, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, + 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, + 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x53, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5b, 0x0a, 0x10, 0x6a, 0x69, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x49, + 0x54, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0f, 0x6a, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x46, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0a, 0x61, 0x75, + 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x58, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x67, 0xea, 0x41, 0x64, 0x0a, 0x27, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x39, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x7d, 0x22, 0xa0, 0x03, 0x0a, 0x12, 0x4f, 0x49, 0x44, 0x43, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x0a, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0x80, 0x10, 0x52, 0x09, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x0c, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, + 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x35, + 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, + 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, + 0x6f, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6a, 0x77, 0x6b, + 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x77, 0x6b, + 0x73, 0x55, 0x72, 0x69, 0x22, 0xec, 0x02, 0x0a, 0x0d, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x4d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x23, 0x0a, 0x0d, + 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x15, 0x4a, 0x49, 0x54, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xba, 0x48, 0x1b, 0x72, + 0x19, 0x52, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x06, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xd8, 0x04, 0x0a, 0x0b, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x25, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xfd, 0x01, 0x52, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x69, 0x0a, 0x13, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x12, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x12, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x57, 0x0a, 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x15, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, + 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x73, 0xea, + 0x41, 0x70, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x45, 0x6d, 0x61, 0x69, 0x6c, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x4a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x7d, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x7d, 0x22, 0xf5, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x14, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x5d, 0x0a, 0x11, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x7a, 0x0a, 0x1e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x2f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x29, 0x0a, 0x27, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x12, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd9, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, + 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x01, 0xba, + 0x48, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x22, 0xc2, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x11, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x11, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x7a, 0x0a, 0x1e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x29, 0x0a, 0x27, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x41, 0x64, + 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2f, + 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x29, 0x0a, 0x27, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, + 0x05, 0x10, 0x01, 0x18, 0xfd, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x9b, + 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, + 0x3b, 0x0a, 0x19, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x18, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xac, 0x01, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x2f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x29, 0x0a, 0x27, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x0c, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x55, 0x0a, 0x13, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x13, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2a, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7b, 0x0a, 0x17, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x49, 0x64, 0x50, 0x42, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xec, 0x01, 0x0a, 0x18, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, + 0x64, 0x50, 0x42, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x68, + 0x61, 0x73, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x61, + 0x73, 0x49, 0x64, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, + 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x22, 0xb4, 0x01, 0x0a, 0x16, 0x54, 0x65, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x0a, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0x80, + 0x10, 0x52, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x09, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x08, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0x80, 0x04, 0x52, 0x0c, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4a, 0x04, 0x08, 0x04, + 0x10, 0x05, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x22, 0xc1, 0x02, 0x0a, 0x17, 0x54, + 0x65, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x30, 0x0a, + 0x14, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x1a, + 0x39, 0x0a, 0x0b, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, + 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x2a, 0x5f, + 0x0a, 0x14, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, + 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, + 0x0a, 0x1b, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x01, 0x2a, + 0x69, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1b, 0x0a, + 0x17, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x55, + 0x54, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, + 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4a, 0x57, + 0x54, 0x5f, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x10, 0x02, 0x2a, 0xe9, 0x01, 0x0a, 0x10, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, 0x4d, 0x50, + 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, + 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x10, + 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, + 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x10, 0x02, 0x12, + 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, 0x4d, 0x50, + 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x03, 0x12, 0x1a, 0x0a, + 0x16, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, + 0x54, 0x45, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x55, 0x54, 0x48, 0x30, 0x10, 0x06, 0x2a, 0xe6, 0x01, 0x0a, 0x18, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x26, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x56, 0x45, + 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x26, 0x0a, 0x22, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x4f, 0x4d, 0x41, 0x49, + 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x4f, 0x4d, 0x41, 0x49, + 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x04, 0x32, + 0xd3, 0x10, 0x0a, 0x0a, 0x53, 0x53, 0x4f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xd4, + 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x11, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x2a, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x35, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xbe, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x12, 0xe6, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x51, 0x3a, 0x11, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x32, 0x3c, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x16, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x2a, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa7, + 0x01, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2b, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x3a, + 0x01, 0x2a, 0x22, 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, + 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0xaa, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, + 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0xad, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x2a, + 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, + 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0xbd, 0x01, 0x0a, + 0x10, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x64, 0x50, 0x42, 0x79, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x64, 0x50, 0x42, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x64, 0x50, 0x42, 0x79, 0x45, 0x6d, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x6c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x42, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0xab, 0x01, 0x0a, + 0x0f, 0x54, 0x65, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, + 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0xfd, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x53, 0x73, 0x6f, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, + 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, + 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_sso_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_sso_proto_rawDescData = file_redpanda_api_aigateway_v1_sso_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_sso_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_sso_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_sso_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_sso_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_sso_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_sso_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_redpanda_api_aigateway_v1_sso_proto_msgTypes = make([]protoimpl.MessageInfo, 30) +var file_redpanda_api_aigateway_v1_sso_proto_goTypes = []any{ + (IdentityProviderType)(0), // 0: redpanda.api.aigateway.v1.IdentityProviderType + (AuthMethod)(0), // 1: redpanda.api.aigateway.v1.AuthMethod + (ProviderTemplate)(0), // 2: redpanda.api.aigateway.v1.ProviderTemplate + (DomainVerificationStatus)(0), // 3: redpanda.api.aigateway.v1.DomainVerificationStatus + (*IdentityProvider)(nil), // 4: redpanda.api.aigateway.v1.IdentityProvider + (*OIDCProviderConfig)(nil), // 5: redpanda.api.aigateway.v1.OIDCProviderConfig + (*ClaimMappings)(nil), // 6: redpanda.api.aigateway.v1.ClaimMappings + (*JITProvisioningConfig)(nil), // 7: redpanda.api.aigateway.v1.JITProvisioningConfig + (*EmailDomain)(nil), // 8: redpanda.api.aigateway.v1.EmailDomain + (*CreateIdentityProviderRequest)(nil), // 9: redpanda.api.aigateway.v1.CreateIdentityProviderRequest + (*CreateIdentityProviderResponse)(nil), // 10: redpanda.api.aigateway.v1.CreateIdentityProviderResponse + (*GetIdentityProviderRequest)(nil), // 11: redpanda.api.aigateway.v1.GetIdentityProviderRequest + (*GetIdentityProviderResponse)(nil), // 12: redpanda.api.aigateway.v1.GetIdentityProviderResponse + (*ListIdentityProvidersRequest)(nil), // 13: redpanda.api.aigateway.v1.ListIdentityProvidersRequest + (*ListIdentityProvidersResponse)(nil), // 14: redpanda.api.aigateway.v1.ListIdentityProvidersResponse + (*UpdateIdentityProviderRequest)(nil), // 15: redpanda.api.aigateway.v1.UpdateIdentityProviderRequest + (*UpdateIdentityProviderResponse)(nil), // 16: redpanda.api.aigateway.v1.UpdateIdentityProviderResponse + (*DeleteIdentityProviderRequest)(nil), // 17: redpanda.api.aigateway.v1.DeleteIdentityProviderRequest + (*DeleteIdentityProviderResponse)(nil), // 18: redpanda.api.aigateway.v1.DeleteIdentityProviderResponse + (*AddDomainRequest)(nil), // 19: redpanda.api.aigateway.v1.AddDomainRequest + (*AddDomainResponse)(nil), // 20: redpanda.api.aigateway.v1.AddDomainResponse + (*ListDomainsRequest)(nil), // 21: redpanda.api.aigateway.v1.ListDomainsRequest + (*ListDomainsResponse)(nil), // 22: redpanda.api.aigateway.v1.ListDomainsResponse + (*RemoveDomainRequest)(nil), // 23: redpanda.api.aigateway.v1.RemoveDomainRequest + (*RemoveDomainResponse)(nil), // 24: redpanda.api.aigateway.v1.RemoveDomainResponse + (*VerifyDomainRequest)(nil), // 25: redpanda.api.aigateway.v1.VerifyDomainRequest + (*VerifyDomainResponse)(nil), // 26: redpanda.api.aigateway.v1.VerifyDomainResponse + (*LookupIdPByEmailRequest)(nil), // 27: redpanda.api.aigateway.v1.LookupIdPByEmailRequest + (*LookupIdPByEmailResponse)(nil), // 28: redpanda.api.aigateway.v1.LookupIdPByEmailResponse + (*TestCredentialsRequest)(nil), // 29: redpanda.api.aigateway.v1.TestCredentialsRequest + (*TestCredentialsResponse)(nil), // 30: redpanda.api.aigateway.v1.TestCredentialsResponse + nil, // 31: redpanda.api.aigateway.v1.IdentityProvider.MetadataEntry + nil, // 32: redpanda.api.aigateway.v1.ClaimMappings.CustomClaimsEntry + nil, // 33: redpanda.api.aigateway.v1.TestCredentialsResponse.ClaimsEntry + (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 35: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_sso_proto_depIdxs = []int32{ + 0, // 0: redpanda.api.aigateway.v1.IdentityProvider.type:type_name -> redpanda.api.aigateway.v1.IdentityProviderType + 5, // 1: redpanda.api.aigateway.v1.IdentityProvider.oidc_config:type_name -> redpanda.api.aigateway.v1.OIDCProviderConfig + 6, // 2: redpanda.api.aigateway.v1.IdentityProvider.claim_mappings:type_name -> redpanda.api.aigateway.v1.ClaimMappings + 7, // 3: redpanda.api.aigateway.v1.IdentityProvider.jit_provisioning:type_name -> redpanda.api.aigateway.v1.JITProvisioningConfig + 1, // 4: redpanda.api.aigateway.v1.IdentityProvider.auth_method:type_name -> redpanda.api.aigateway.v1.AuthMethod + 31, // 5: redpanda.api.aigateway.v1.IdentityProvider.metadata:type_name -> redpanda.api.aigateway.v1.IdentityProvider.MetadataEntry + 2, // 6: redpanda.api.aigateway.v1.IdentityProvider.provider_template:type_name -> redpanda.api.aigateway.v1.ProviderTemplate + 34, // 7: redpanda.api.aigateway.v1.IdentityProvider.create_time:type_name -> google.protobuf.Timestamp + 34, // 8: redpanda.api.aigateway.v1.IdentityProvider.update_time:type_name -> google.protobuf.Timestamp + 32, // 9: redpanda.api.aigateway.v1.ClaimMappings.custom_claims:type_name -> redpanda.api.aigateway.v1.ClaimMappings.CustomClaimsEntry + 3, // 10: redpanda.api.aigateway.v1.EmailDomain.verification_status:type_name -> redpanda.api.aigateway.v1.DomainVerificationStatus + 34, // 11: redpanda.api.aigateway.v1.EmailDomain.verification_expires_at:type_name -> google.protobuf.Timestamp + 34, // 12: redpanda.api.aigateway.v1.EmailDomain.verified_at:type_name -> google.protobuf.Timestamp + 34, // 13: redpanda.api.aigateway.v1.EmailDomain.create_time:type_name -> google.protobuf.Timestamp + 4, // 14: redpanda.api.aigateway.v1.CreateIdentityProviderRequest.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 4, // 15: redpanda.api.aigateway.v1.CreateIdentityProviderResponse.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 4, // 16: redpanda.api.aigateway.v1.GetIdentityProviderResponse.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 4, // 17: redpanda.api.aigateway.v1.ListIdentityProvidersResponse.identity_providers:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 4, // 18: redpanda.api.aigateway.v1.UpdateIdentityProviderRequest.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 35, // 19: redpanda.api.aigateway.v1.UpdateIdentityProviderRequest.update_mask:type_name -> google.protobuf.FieldMask + 4, // 20: redpanda.api.aigateway.v1.UpdateIdentityProviderResponse.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 8, // 21: redpanda.api.aigateway.v1.AddDomainResponse.email_domain:type_name -> redpanda.api.aigateway.v1.EmailDomain + 8, // 22: redpanda.api.aigateway.v1.ListDomainsResponse.domains:type_name -> redpanda.api.aigateway.v1.EmailDomain + 8, // 23: redpanda.api.aigateway.v1.VerifyDomainResponse.email_domain:type_name -> redpanda.api.aigateway.v1.EmailDomain + 4, // 24: redpanda.api.aigateway.v1.LookupIdPByEmailResponse.identity_provider:type_name -> redpanda.api.aigateway.v1.IdentityProvider + 33, // 25: redpanda.api.aigateway.v1.TestCredentialsResponse.claims:type_name -> redpanda.api.aigateway.v1.TestCredentialsResponse.ClaimsEntry + 9, // 26: redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider:input_type -> redpanda.api.aigateway.v1.CreateIdentityProviderRequest + 11, // 27: redpanda.api.aigateway.v1.SSOService.GetIdentityProvider:input_type -> redpanda.api.aigateway.v1.GetIdentityProviderRequest + 13, // 28: redpanda.api.aigateway.v1.SSOService.ListIdentityProviders:input_type -> redpanda.api.aigateway.v1.ListIdentityProvidersRequest + 15, // 29: redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider:input_type -> redpanda.api.aigateway.v1.UpdateIdentityProviderRequest + 17, // 30: redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider:input_type -> redpanda.api.aigateway.v1.DeleteIdentityProviderRequest + 19, // 31: redpanda.api.aigateway.v1.SSOService.AddDomain:input_type -> redpanda.api.aigateway.v1.AddDomainRequest + 21, // 32: redpanda.api.aigateway.v1.SSOService.ListDomains:input_type -> redpanda.api.aigateway.v1.ListDomainsRequest + 23, // 33: redpanda.api.aigateway.v1.SSOService.RemoveDomain:input_type -> redpanda.api.aigateway.v1.RemoveDomainRequest + 25, // 34: redpanda.api.aigateway.v1.SSOService.VerifyDomain:input_type -> redpanda.api.aigateway.v1.VerifyDomainRequest + 27, // 35: redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail:input_type -> redpanda.api.aigateway.v1.LookupIdPByEmailRequest + 29, // 36: redpanda.api.aigateway.v1.SSOService.TestCredentials:input_type -> redpanda.api.aigateway.v1.TestCredentialsRequest + 10, // 37: redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider:output_type -> redpanda.api.aigateway.v1.CreateIdentityProviderResponse + 12, // 38: redpanda.api.aigateway.v1.SSOService.GetIdentityProvider:output_type -> redpanda.api.aigateway.v1.GetIdentityProviderResponse + 14, // 39: redpanda.api.aigateway.v1.SSOService.ListIdentityProviders:output_type -> redpanda.api.aigateway.v1.ListIdentityProvidersResponse + 16, // 40: redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider:output_type -> redpanda.api.aigateway.v1.UpdateIdentityProviderResponse + 18, // 41: redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider:output_type -> redpanda.api.aigateway.v1.DeleteIdentityProviderResponse + 20, // 42: redpanda.api.aigateway.v1.SSOService.AddDomain:output_type -> redpanda.api.aigateway.v1.AddDomainResponse + 22, // 43: redpanda.api.aigateway.v1.SSOService.ListDomains:output_type -> redpanda.api.aigateway.v1.ListDomainsResponse + 24, // 44: redpanda.api.aigateway.v1.SSOService.RemoveDomain:output_type -> redpanda.api.aigateway.v1.RemoveDomainResponse + 26, // 45: redpanda.api.aigateway.v1.SSOService.VerifyDomain:output_type -> redpanda.api.aigateway.v1.VerifyDomainResponse + 28, // 46: redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail:output_type -> redpanda.api.aigateway.v1.LookupIdPByEmailResponse + 30, // 47: redpanda.api.aigateway.v1.SSOService.TestCredentials:output_type -> redpanda.api.aigateway.v1.TestCredentialsResponse + 37, // [37:48] is the sub-list for method output_type + 26, // [26:37] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_sso_proto_init() } +func file_redpanda_api_aigateway_v1_sso_proto_init() { + if File_redpanda_api_aigateway_v1_sso_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_sso_proto_rawDesc, + NumEnums: 4, + NumMessages: 30, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_sso_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_sso_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_sso_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_sso_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_sso_proto = out.File + file_redpanda_api_aigateway_v1_sso_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_sso_proto_goTypes = nil + file_redpanda_api_aigateway_v1_sso_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.gw.go new file mode 100644 index 0000000000..0f27337c3b --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso.pb.gw.go @@ -0,0 +1,1061 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/sso.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_SSOService_CreateIdentityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"identity_provider": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_SSOService_CreateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_CreateIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_CreateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_CreateIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateIdentityProvider(ctx, &protoReq) + return msg, metadata, err +} + +func request_SSOService_GetIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_GetIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetIdentityProvider(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SSOService_ListIdentityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SSOService_ListIdentityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListIdentityProvidersRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_ListIdentityProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListIdentityProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_ListIdentityProviders_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListIdentityProvidersRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_ListIdentityProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListIdentityProviders(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SSOService_UpdateIdentityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"identity_provider": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_SSOService_UpdateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.IdentityProvider); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["identity_provider.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "identity_provider.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "identity_provider.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "identity_provider.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_UpdateIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_UpdateIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.IdentityProvider); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.IdentityProvider); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["identity_provider.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "identity_provider.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "identity_provider.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "identity_provider.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_UpdateIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateIdentityProvider(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SSOService_DeleteIdentityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SSOService_DeleteIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_DeleteIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteIdentityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_DeleteIdentityProvider_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteIdentityProviderRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_DeleteIdentityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteIdentityProvider(ctx, &protoReq) + return msg, metadata, err +} + +func request_SSOService_AddDomain_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddDomainRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.AddDomain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_AddDomain_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddDomainRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.AddDomain(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SSOService_ListDomains_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SSOService_ListDomains_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDomainsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_ListDomains_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListDomains(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_ListDomains_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDomainsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_ListDomains_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListDomains(ctx, &protoReq) + return msg, metadata, err +} + +func request_SSOService_RemoveDomain_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveDomainRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RemoveDomain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_RemoveDomain_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveDomainRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RemoveDomain(ctx, &protoReq) + return msg, metadata, err +} + +func request_SSOService_VerifyDomain_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq VerifyDomainRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.VerifyDomain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_VerifyDomain_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq VerifyDomainRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.VerifyDomain(ctx, &protoReq) + return msg, metadata, err +} + +var filter_SSOService_LookupIdPByEmail_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_SSOService_LookupIdPByEmail_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LookupIdPByEmailRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_LookupIdPByEmail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.LookupIdPByEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_LookupIdPByEmail_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq LookupIdPByEmailRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SSOService_LookupIdPByEmail_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.LookupIdPByEmail(ctx, &protoReq) + return msg, metadata, err +} + +func request_SSOService_TestCredentials_0(ctx context.Context, marshaler runtime.Marshaler, client SSOServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq TestCredentialsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.TestCredentials(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_SSOService_TestCredentials_0(ctx context.Context, marshaler runtime.Marshaler, server SSOServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq TestCredentialsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.TestCredentials(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterSSOServiceHandlerServer registers the http handlers for service SSOService to "mux". +// UnaryRPC :call SSOServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSSOServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterSSOServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SSOServiceServer) error { + mux.Handle(http.MethodPost, pattern_SSOService_CreateIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/CreateIdentityProvider", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_CreateIdentityProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_CreateIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_GetIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/GetIdentityProvider", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_GetIdentityProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_GetIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_ListIdentityProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/ListIdentityProviders", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_ListIdentityProviders_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_ListIdentityProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SSOService_UpdateIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/UpdateIdentityProvider", runtime.WithHTTPPathPattern("/v1/{identity_provider.name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_UpdateIdentityProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_UpdateIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SSOService_DeleteIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/DeleteIdentityProvider", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_DeleteIdentityProvider_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_DeleteIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_AddDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/AddDomain", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/identity-providers/*}/domains")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_AddDomain_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_AddDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_ListDomains_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/ListDomains", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/identity-providers/*}/domains")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_ListDomains_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_ListDomains_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SSOService_RemoveDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/RemoveDomain", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*/domains/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_RemoveDomain_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_RemoveDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_VerifyDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/VerifyDomain", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*/domains/*}:verify")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_VerifyDomain_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_VerifyDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_LookupIdPByEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/LookupIdPByEmail", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers:lookupByEmail")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_LookupIdPByEmail_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_LookupIdPByEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_TestCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/TestCredentials", runtime.WithHTTPPathPattern("/v1/identity-providers:testCredentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SSOService_TestCredentials_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_TestCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterSSOServiceHandlerFromEndpoint is same as RegisterSSOServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSSOServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterSSOServiceHandler(ctx, mux, conn) +} + +// RegisterSSOServiceHandler registers the http handlers for service SSOService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSSOServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSSOServiceHandlerClient(ctx, mux, NewSSOServiceClient(conn)) +} + +// RegisterSSOServiceHandlerClient registers the http handlers for service SSOService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SSOServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SSOServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SSOServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterSSOServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SSOServiceClient) error { + mux.Handle(http.MethodPost, pattern_SSOService_CreateIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/CreateIdentityProvider", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_CreateIdentityProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_CreateIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_GetIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/GetIdentityProvider", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_GetIdentityProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_GetIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_ListIdentityProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/ListIdentityProviders", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_ListIdentityProviders_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_ListIdentityProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_SSOService_UpdateIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/UpdateIdentityProvider", runtime.WithHTTPPathPattern("/v1/{identity_provider.name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_UpdateIdentityProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_UpdateIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SSOService_DeleteIdentityProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/DeleteIdentityProvider", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_DeleteIdentityProvider_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_DeleteIdentityProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_AddDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/AddDomain", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/identity-providers/*}/domains")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_AddDomain_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_AddDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_ListDomains_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/ListDomains", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/identity-providers/*}/domains")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_ListDomains_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_ListDomains_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_SSOService_RemoveDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/RemoveDomain", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*/domains/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_RemoveDomain_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_RemoveDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_VerifyDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/VerifyDomain", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/identity-providers/*/domains/*}:verify")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_VerifyDomain_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_VerifyDomain_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_SSOService_LookupIdPByEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/LookupIdPByEmail", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/identity-providers:lookupByEmail")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_LookupIdPByEmail_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_LookupIdPByEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_SSOService_TestCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.SSOService/TestCredentials", runtime.WithHTTPPathPattern("/v1/identity-providers:testCredentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SSOService_TestCredentials_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_SSOService_TestCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_SSOService_CreateIdentityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "identity-providers"}, "")) + pattern_SSOService_GetIdentityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "identity-providers", "name"}, "")) + pattern_SSOService_ListIdentityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "identity-providers"}, "")) + pattern_SSOService_UpdateIdentityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "identity-providers", "identity_provider.name"}, "")) + pattern_SSOService_DeleteIdentityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "identity-providers", "name"}, "")) + pattern_SSOService_AddDomain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "identity-providers", "parent", "domains"}, "")) + pattern_SSOService_ListDomains_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "identity-providers", "parent", "domains"}, "")) + pattern_SSOService_RemoveDomain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "identity-providers", "domains", "name"}, "")) + pattern_SSOService_VerifyDomain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "identity-providers", "domains", "name"}, "verify")) + pattern_SSOService_LookupIdPByEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "identity-providers"}, "lookupByEmail")) + pattern_SSOService_TestCredentials_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "identity-providers"}, "testCredentials")) +) + +var ( + forward_SSOService_CreateIdentityProvider_0 = runtime.ForwardResponseMessage + forward_SSOService_GetIdentityProvider_0 = runtime.ForwardResponseMessage + forward_SSOService_ListIdentityProviders_0 = runtime.ForwardResponseMessage + forward_SSOService_UpdateIdentityProvider_0 = runtime.ForwardResponseMessage + forward_SSOService_DeleteIdentityProvider_0 = runtime.ForwardResponseMessage + forward_SSOService_AddDomain_0 = runtime.ForwardResponseMessage + forward_SSOService_ListDomains_0 = runtime.ForwardResponseMessage + forward_SSOService_RemoveDomain_0 = runtime.ForwardResponseMessage + forward_SSOService_VerifyDomain_0 = runtime.ForwardResponseMessage + forward_SSOService_LookupIdPByEmail_0 = runtime.ForwardResponseMessage + forward_SSOService_TestCredentials_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/sso_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso_grpc.pb.go new file mode 100644 index 0000000000..62af227b7b --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/sso_grpc.pb.go @@ -0,0 +1,544 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/sso.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + SSOService_CreateIdentityProvider_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/CreateIdentityProvider" + SSOService_GetIdentityProvider_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/GetIdentityProvider" + SSOService_ListIdentityProviders_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/ListIdentityProviders" + SSOService_UpdateIdentityProvider_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/UpdateIdentityProvider" + SSOService_DeleteIdentityProvider_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/DeleteIdentityProvider" + SSOService_AddDomain_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/AddDomain" + SSOService_ListDomains_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/ListDomains" + SSOService_RemoveDomain_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/RemoveDomain" + SSOService_VerifyDomain_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/VerifyDomain" + SSOService_LookupIdPByEmail_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/LookupIdPByEmail" + SSOService_TestCredentials_FullMethodName = "/redpanda.api.aigateway.v1.SSOService/TestCredentials" +) + +// SSOServiceClient is the client API for SSOService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// SSOService manages external identity providers for federated authentication. +// Identity providers allow users to authenticate via external OIDC providers (Google, Okta, etc.) +// while the gateway remains the central authentication authority. +// Resource name: accounts/{account_id}/identity-providers/{idp_id} +type SSOServiceClient interface { + // Creates a new identity provider within an account. + CreateIdentityProvider(ctx context.Context, in *CreateIdentityProviderRequest, opts ...grpc.CallOption) (*CreateIdentityProviderResponse, error) + // Gets an identity provider by name. + GetIdentityProvider(ctx context.Context, in *GetIdentityProviderRequest, opts ...grpc.CallOption) (*GetIdentityProviderResponse, error) + // Lists identity providers within an account. + ListIdentityProviders(ctx context.Context, in *ListIdentityProvidersRequest, opts ...grpc.CallOption) (*ListIdentityProvidersResponse, error) + // Updates an identity provider. + UpdateIdentityProvider(ctx context.Context, in *UpdateIdentityProviderRequest, opts ...grpc.CallOption) (*UpdateIdentityProviderResponse, error) + // Deletes an identity provider. + DeleteIdentityProvider(ctx context.Context, in *DeleteIdentityProviderRequest, opts ...grpc.CallOption) (*DeleteIdentityProviderResponse, error) + // Adds an email domain to an identity provider for Home Realm Discovery. + // The domain must be verified via DNS TXT record before it becomes active. + AddDomain(ctx context.Context, in *AddDomainRequest, opts ...grpc.CallOption) (*AddDomainResponse, error) + // Lists domains associated with an identity provider. + ListDomains(ctx context.Context, in *ListDomainsRequest, opts ...grpc.CallOption) (*ListDomainsResponse, error) + // Removes a domain from an identity provider. + RemoveDomain(ctx context.Context, in *RemoveDomainRequest, opts ...grpc.CallOption) (*RemoveDomainResponse, error) + // Initiates or retries domain verification via DNS TXT record. + VerifyDomain(ctx context.Context, in *VerifyDomainRequest, opts ...grpc.CallOption) (*VerifyDomainResponse, error) + // Looks up the identity provider for an email address based on domain. + // Used during login to determine which IdP to redirect to. + // Returns NOT_FOUND if no IdP is configured for the domain. + LookupIdPByEmail(ctx context.Context, in *LookupIdPByEmailRequest, opts ...grpc.CallOption) (*LookupIdPByEmailResponse, error) + // Tests OIDC credentials using the client credentials grant. + // Validates that the client_id and client_secret can obtain a token + // and returns the decoded token claims. + TestCredentials(ctx context.Context, in *TestCredentialsRequest, opts ...grpc.CallOption) (*TestCredentialsResponse, error) +} + +type sSOServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSSOServiceClient(cc grpc.ClientConnInterface) SSOServiceClient { + return &sSOServiceClient{cc} +} + +func (c *sSOServiceClient) CreateIdentityProvider(ctx context.Context, in *CreateIdentityProviderRequest, opts ...grpc.CallOption) (*CreateIdentityProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateIdentityProviderResponse) + err := c.cc.Invoke(ctx, SSOService_CreateIdentityProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) GetIdentityProvider(ctx context.Context, in *GetIdentityProviderRequest, opts ...grpc.CallOption) (*GetIdentityProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetIdentityProviderResponse) + err := c.cc.Invoke(ctx, SSOService_GetIdentityProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) ListIdentityProviders(ctx context.Context, in *ListIdentityProvidersRequest, opts ...grpc.CallOption) (*ListIdentityProvidersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListIdentityProvidersResponse) + err := c.cc.Invoke(ctx, SSOService_ListIdentityProviders_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) UpdateIdentityProvider(ctx context.Context, in *UpdateIdentityProviderRequest, opts ...grpc.CallOption) (*UpdateIdentityProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateIdentityProviderResponse) + err := c.cc.Invoke(ctx, SSOService_UpdateIdentityProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) DeleteIdentityProvider(ctx context.Context, in *DeleteIdentityProviderRequest, opts ...grpc.CallOption) (*DeleteIdentityProviderResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteIdentityProviderResponse) + err := c.cc.Invoke(ctx, SSOService_DeleteIdentityProvider_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) AddDomain(ctx context.Context, in *AddDomainRequest, opts ...grpc.CallOption) (*AddDomainResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AddDomainResponse) + err := c.cc.Invoke(ctx, SSOService_AddDomain_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) ListDomains(ctx context.Context, in *ListDomainsRequest, opts ...grpc.CallOption) (*ListDomainsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListDomainsResponse) + err := c.cc.Invoke(ctx, SSOService_ListDomains_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) RemoveDomain(ctx context.Context, in *RemoveDomainRequest, opts ...grpc.CallOption) (*RemoveDomainResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RemoveDomainResponse) + err := c.cc.Invoke(ctx, SSOService_RemoveDomain_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) VerifyDomain(ctx context.Context, in *VerifyDomainRequest, opts ...grpc.CallOption) (*VerifyDomainResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(VerifyDomainResponse) + err := c.cc.Invoke(ctx, SSOService_VerifyDomain_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) LookupIdPByEmail(ctx context.Context, in *LookupIdPByEmailRequest, opts ...grpc.CallOption) (*LookupIdPByEmailResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(LookupIdPByEmailResponse) + err := c.cc.Invoke(ctx, SSOService_LookupIdPByEmail_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sSOServiceClient) TestCredentials(ctx context.Context, in *TestCredentialsRequest, opts ...grpc.CallOption) (*TestCredentialsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(TestCredentialsResponse) + err := c.cc.Invoke(ctx, SSOService_TestCredentials_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SSOServiceServer is the server API for SSOService service. +// All implementations must embed UnimplementedSSOServiceServer +// for forward compatibility. +// +// SSOService manages external identity providers for federated authentication. +// Identity providers allow users to authenticate via external OIDC providers (Google, Okta, etc.) +// while the gateway remains the central authentication authority. +// Resource name: accounts/{account_id}/identity-providers/{idp_id} +type SSOServiceServer interface { + // Creates a new identity provider within an account. + CreateIdentityProvider(context.Context, *CreateIdentityProviderRequest) (*CreateIdentityProviderResponse, error) + // Gets an identity provider by name. + GetIdentityProvider(context.Context, *GetIdentityProviderRequest) (*GetIdentityProviderResponse, error) + // Lists identity providers within an account. + ListIdentityProviders(context.Context, *ListIdentityProvidersRequest) (*ListIdentityProvidersResponse, error) + // Updates an identity provider. + UpdateIdentityProvider(context.Context, *UpdateIdentityProviderRequest) (*UpdateIdentityProviderResponse, error) + // Deletes an identity provider. + DeleteIdentityProvider(context.Context, *DeleteIdentityProviderRequest) (*DeleteIdentityProviderResponse, error) + // Adds an email domain to an identity provider for Home Realm Discovery. + // The domain must be verified via DNS TXT record before it becomes active. + AddDomain(context.Context, *AddDomainRequest) (*AddDomainResponse, error) + // Lists domains associated with an identity provider. + ListDomains(context.Context, *ListDomainsRequest) (*ListDomainsResponse, error) + // Removes a domain from an identity provider. + RemoveDomain(context.Context, *RemoveDomainRequest) (*RemoveDomainResponse, error) + // Initiates or retries domain verification via DNS TXT record. + VerifyDomain(context.Context, *VerifyDomainRequest) (*VerifyDomainResponse, error) + // Looks up the identity provider for an email address based on domain. + // Used during login to determine which IdP to redirect to. + // Returns NOT_FOUND if no IdP is configured for the domain. + LookupIdPByEmail(context.Context, *LookupIdPByEmailRequest) (*LookupIdPByEmailResponse, error) + // Tests OIDC credentials using the client credentials grant. + // Validates that the client_id and client_secret can obtain a token + // and returns the decoded token claims. + TestCredentials(context.Context, *TestCredentialsRequest) (*TestCredentialsResponse, error) + mustEmbedUnimplementedSSOServiceServer() +} + +// UnimplementedSSOServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedSSOServiceServer struct{} + +func (UnimplementedSSOServiceServer) CreateIdentityProvider(context.Context, *CreateIdentityProviderRequest) (*CreateIdentityProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateIdentityProvider not implemented") +} +func (UnimplementedSSOServiceServer) GetIdentityProvider(context.Context, *GetIdentityProviderRequest) (*GetIdentityProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIdentityProvider not implemented") +} +func (UnimplementedSSOServiceServer) ListIdentityProviders(context.Context, *ListIdentityProvidersRequest) (*ListIdentityProvidersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListIdentityProviders not implemented") +} +func (UnimplementedSSOServiceServer) UpdateIdentityProvider(context.Context, *UpdateIdentityProviderRequest) (*UpdateIdentityProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateIdentityProvider not implemented") +} +func (UnimplementedSSOServiceServer) DeleteIdentityProvider(context.Context, *DeleteIdentityProviderRequest) (*DeleteIdentityProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteIdentityProvider not implemented") +} +func (UnimplementedSSOServiceServer) AddDomain(context.Context, *AddDomainRequest) (*AddDomainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddDomain not implemented") +} +func (UnimplementedSSOServiceServer) ListDomains(context.Context, *ListDomainsRequest) (*ListDomainsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDomains not implemented") +} +func (UnimplementedSSOServiceServer) RemoveDomain(context.Context, *RemoveDomainRequest) (*RemoveDomainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveDomain not implemented") +} +func (UnimplementedSSOServiceServer) VerifyDomain(context.Context, *VerifyDomainRequest) (*VerifyDomainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyDomain not implemented") +} +func (UnimplementedSSOServiceServer) LookupIdPByEmail(context.Context, *LookupIdPByEmailRequest) (*LookupIdPByEmailResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LookupIdPByEmail not implemented") +} +func (UnimplementedSSOServiceServer) TestCredentials(context.Context, *TestCredentialsRequest) (*TestCredentialsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TestCredentials not implemented") +} +func (UnimplementedSSOServiceServer) mustEmbedUnimplementedSSOServiceServer() {} +func (UnimplementedSSOServiceServer) testEmbeddedByValue() {} + +// UnsafeSSOServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SSOServiceServer will +// result in compilation errors. +type UnsafeSSOServiceServer interface { + mustEmbedUnimplementedSSOServiceServer() +} + +func RegisterSSOServiceServer(s grpc.ServiceRegistrar, srv SSOServiceServer) { + // If the following call pancis, it indicates UnimplementedSSOServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&SSOService_ServiceDesc, srv) +} + +func _SSOService_CreateIdentityProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateIdentityProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).CreateIdentityProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_CreateIdentityProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).CreateIdentityProvider(ctx, req.(*CreateIdentityProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_GetIdentityProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetIdentityProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).GetIdentityProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_GetIdentityProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).GetIdentityProvider(ctx, req.(*GetIdentityProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_ListIdentityProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListIdentityProvidersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).ListIdentityProviders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_ListIdentityProviders_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).ListIdentityProviders(ctx, req.(*ListIdentityProvidersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_UpdateIdentityProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateIdentityProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).UpdateIdentityProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_UpdateIdentityProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).UpdateIdentityProvider(ctx, req.(*UpdateIdentityProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_DeleteIdentityProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteIdentityProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).DeleteIdentityProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_DeleteIdentityProvider_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).DeleteIdentityProvider(ctx, req.(*DeleteIdentityProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_AddDomain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddDomainRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).AddDomain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_AddDomain_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).AddDomain(ctx, req.(*AddDomainRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_ListDomains_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListDomainsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).ListDomains(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_ListDomains_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).ListDomains(ctx, req.(*ListDomainsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_RemoveDomain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveDomainRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).RemoveDomain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_RemoveDomain_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).RemoveDomain(ctx, req.(*RemoveDomainRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_VerifyDomain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VerifyDomainRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).VerifyDomain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_VerifyDomain_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).VerifyDomain(ctx, req.(*VerifyDomainRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_LookupIdPByEmail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LookupIdPByEmailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).LookupIdPByEmail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_LookupIdPByEmail_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).LookupIdPByEmail(ctx, req.(*LookupIdPByEmailRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SSOService_TestCredentials_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TestCredentialsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SSOServiceServer).TestCredentials(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SSOService_TestCredentials_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SSOServiceServer).TestCredentials(ctx, req.(*TestCredentialsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SSOService_ServiceDesc is the grpc.ServiceDesc for SSOService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SSOService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.SSOService", + HandlerType: (*SSOServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateIdentityProvider", + Handler: _SSOService_CreateIdentityProvider_Handler, + }, + { + MethodName: "GetIdentityProvider", + Handler: _SSOService_GetIdentityProvider_Handler, + }, + { + MethodName: "ListIdentityProviders", + Handler: _SSOService_ListIdentityProviders_Handler, + }, + { + MethodName: "UpdateIdentityProvider", + Handler: _SSOService_UpdateIdentityProvider_Handler, + }, + { + MethodName: "DeleteIdentityProvider", + Handler: _SSOService_DeleteIdentityProvider_Handler, + }, + { + MethodName: "AddDomain", + Handler: _SSOService_AddDomain_Handler, + }, + { + MethodName: "ListDomains", + Handler: _SSOService_ListDomains_Handler, + }, + { + MethodName: "RemoveDomain", + Handler: _SSOService_RemoveDomain_Handler, + }, + { + MethodName: "VerifyDomain", + Handler: _SSOService_VerifyDomain_Handler, + }, + { + MethodName: "LookupIdPByEmail", + Handler: _SSOService_LookupIdPByEmail_Handler, + }, + { + MethodName: "TestCredentials", + Handler: _SSOService_TestCredentials_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/sso.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.go new file mode 100644 index 0000000000..36998bffe6 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.go @@ -0,0 +1,1819 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/team.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// TeamRole defines the role a user can have in a team. +type TeamRole int32 + +const ( + TeamRole_TEAM_ROLE_UNSPECIFIED TeamRole = 0 + // Full team management permissions + TeamRole_TEAM_ROLE_ADMIN TeamRole = 1 + // Standard team member permissions + TeamRole_TEAM_ROLE_MEMBER TeamRole = 2 + // Read-only access + TeamRole_TEAM_ROLE_VIEWER TeamRole = 3 +) + +// Enum value maps for TeamRole. +var ( + TeamRole_name = map[int32]string{ + 0: "TEAM_ROLE_UNSPECIFIED", + 1: "TEAM_ROLE_ADMIN", + 2: "TEAM_ROLE_MEMBER", + 3: "TEAM_ROLE_VIEWER", + } + TeamRole_value = map[string]int32{ + "TEAM_ROLE_UNSPECIFIED": 0, + "TEAM_ROLE_ADMIN": 1, + "TEAM_ROLE_MEMBER": 2, + "TEAM_ROLE_VIEWER": 3, + } +) + +func (x TeamRole) Enum() *TeamRole { + p := new(TeamRole) + *p = x + return p +} + +func (x TeamRole) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TeamRole) Descriptor() protoreflect.EnumDescriptor { + return file_redpanda_api_aigateway_v1_team_proto_enumTypes[0].Descriptor() +} + +func (TeamRole) Type() protoreflect.EnumType { + return &file_redpanda_api_aigateway_v1_team_proto_enumTypes[0] +} + +func (x TeamRole) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TeamRole.Descriptor instead. +func (TeamRole) EnumDescriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{0} +} + +// Team represents a group of users within an organization. +// Teams are used for access control and collaboration. +type Team struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/organizations/{organization}/teams/{team}` + // Team ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name (must be unique within organization) + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Whether this team is active + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,8,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,9,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Team) Reset() { + *x = Team{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Team) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Team) ProtoMessage() {} + +func (x *Team) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Team.ProtoReflect.Descriptor instead. +func (*Team) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{0} +} + +func (x *Team) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Team) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Team) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Team) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Team) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Team) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Team) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Team) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Team) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// TeamMembership represents a user's membership in a team. +type TeamMembership struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/organizations/{organization}/teams/{team}/members/{membership}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Reference to the user. + // Format: `accounts/{account}/organizations/{organization}/users/{user}` + User string `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + // Role in the team: admin, member, viewer + Role TeamRole `protobuf:"varint,3,opt,name=role,proto3,enum=redpanda.api.aigateway.v1.TeamRole" json:"role,omitempty"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,5,opt,name=creator,proto3" json:"creator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TeamMembership) Reset() { + *x = TeamMembership{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TeamMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamMembership) ProtoMessage() {} + +func (x *TeamMembership) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamMembership.ProtoReflect.Descriptor instead. +func (*TeamMembership) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{1} +} + +func (x *TeamMembership) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *TeamMembership) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *TeamMembership) GetRole() TeamRole { + if x != nil { + return x.Role + } + return TeamRole_TEAM_ROLE_UNSPECIFIED +} + +func (x *TeamMembership) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *TeamMembership) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +// Request message for CreateTeam RPC. +type CreateTeamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + // Format: `accounts/{account}/organizations/{organization}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The team ID to use. If empty, server generates one. + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Required: The team resource to create. + Team *Team `protobuf:"bytes,3,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateTeamRequest) Reset() { + *x = CreateTeamRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateTeamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTeamRequest) ProtoMessage() {} + +func (x *CreateTeamRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTeamRequest.ProtoReflect.Descriptor instead. +func (*CreateTeamRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateTeamRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateTeamRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateTeamRequest) GetTeam() *Team { + if x != nil { + return x.Team + } + return nil +} + +// Response message for CreateTeam RPC. +type CreateTeamResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Team *Team `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateTeamResponse) Reset() { + *x = CreateTeamResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateTeamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTeamResponse) ProtoMessage() {} + +func (x *CreateTeamResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTeamResponse.ProtoReflect.Descriptor instead. +func (*CreateTeamResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateTeamResponse) GetTeam() *Team { + if x != nil { + return x.Team + } + return nil +} + +// Request message for GetTeam RPC. +type GetTeamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the team. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTeamRequest) Reset() { + *x = GetTeamRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTeamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamRequest) ProtoMessage() {} + +func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTeamRequest.ProtoReflect.Descriptor instead. +func (*GetTeamRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{4} +} + +func (x *GetTeamRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetTeam RPC. +type GetTeamResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Team *Team `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTeamResponse) Reset() { + *x = GetTeamResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTeamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamResponse) ProtoMessage() {} + +func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTeamResponse.ProtoReflect.Descriptor instead. +func (*GetTeamResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{5} +} + +func (x *GetTeamResponse) GetTeam() *Team { + if x != nil { + return x.Team + } + return nil +} + +// Request message for ListTeams RPC. +type ListTeamsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of teams to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListTeams call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamsRequest) Reset() { + *x = ListTeamsRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamsRequest) ProtoMessage() {} + +func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamsRequest.ProtoReflect.Descriptor instead. +func (*ListTeamsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{6} +} + +func (x *ListTeamsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListTeamsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListTeamsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListTeamsRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListTeamsRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListTeams RPC. +type ListTeamsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of teams + Teams []*Team `protobuf:"bytes,1,rep,name=teams,proto3" json:"teams,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching teams + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamsResponse) Reset() { + *x = ListTeamsResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamsResponse) ProtoMessage() {} + +func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamsResponse.ProtoReflect.Descriptor instead. +func (*ListTeamsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{7} +} + +func (x *ListTeamsResponse) GetTeams() []*Team { + if x != nil { + return x.Teams + } + return nil +} + +func (x *ListTeamsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListTeamsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateTeam RPC. +type UpdateTeamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The team resource to update. + Team *Team `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + // The fields to update. + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateTeamRequest) Reset() { + *x = UpdateTeamRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateTeamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTeamRequest) ProtoMessage() {} + +func (x *UpdateTeamRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTeamRequest.ProtoReflect.Descriptor instead. +func (*UpdateTeamRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateTeamRequest) GetTeam() *Team { + if x != nil { + return x.Team + } + return nil +} + +func (x *UpdateTeamRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateTeam RPC. +type UpdateTeamResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Team *Team `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateTeamResponse) Reset() { + *x = UpdateTeamResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateTeamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTeamResponse) ProtoMessage() {} + +func (x *UpdateTeamResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTeamResponse.ProtoReflect.Descriptor instead. +func (*UpdateTeamResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateTeamResponse) GetTeam() *Team { + if x != nil { + return x.Team + } + return nil +} + +// Request message for DeleteTeam RPC. +type DeleteTeamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the team to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all memberships + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteTeamRequest) Reset() { + *x = DeleteTeamRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteTeamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteTeamRequest) ProtoMessage() {} + +func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteTeamRequest.ProtoReflect.Descriptor instead. +func (*DeleteTeamRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteTeamRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteTeamRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteTeam RPC. +type DeleteTeamResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteTeamResponse) Reset() { + *x = DeleteTeamResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteTeamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteTeamResponse) ProtoMessage() {} + +func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteTeamResponse.ProtoReflect.Descriptor instead. +func (*DeleteTeamResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{11} +} + +// Request message for AddTeamMember RPC. +type AddTeamMemberRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent team. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Required: User to add. + // Format: `accounts/{account}/organizations/{organization}/users/{user}` + User string `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + // Required: Role for the membership + Role TeamRole `protobuf:"varint,3,opt,name=role,proto3,enum=redpanda.api.aigateway.v1.TeamRole" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddTeamMemberRequest) Reset() { + *x = AddTeamMemberRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddTeamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddTeamMemberRequest) ProtoMessage() {} + +func (x *AddTeamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddTeamMemberRequest.ProtoReflect.Descriptor instead. +func (*AddTeamMemberRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{12} +} + +func (x *AddTeamMemberRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *AddTeamMemberRequest) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *AddTeamMemberRequest) GetRole() TeamRole { + if x != nil { + return x.Role + } + return TeamRole_TEAM_ROLE_UNSPECIFIED +} + +// Response message for AddTeamMember RPC. +type AddTeamMemberResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Membership *TeamMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddTeamMemberResponse) Reset() { + *x = AddTeamMemberResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddTeamMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddTeamMemberResponse) ProtoMessage() {} + +func (x *AddTeamMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddTeamMemberResponse.ProtoReflect.Descriptor instead. +func (*AddTeamMemberResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{13} +} + +func (x *AddTeamMemberResponse) GetMembership() *TeamMembership { + if x != nil { + return x.Membership + } + return nil +} + +// Request message for GetTeamMember RPC. +type GetTeamMemberRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the membership. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTeamMemberRequest) Reset() { + *x = GetTeamMemberRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTeamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamMemberRequest) ProtoMessage() {} + +func (x *GetTeamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTeamMemberRequest.ProtoReflect.Descriptor instead. +func (*GetTeamMemberRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{14} +} + +func (x *GetTeamMemberRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetTeamMember RPC. +type GetTeamMemberResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Membership *TeamMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTeamMemberResponse) Reset() { + *x = GetTeamMemberResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTeamMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamMemberResponse) ProtoMessage() {} + +func (x *GetTeamMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTeamMemberResponse.ProtoReflect.Descriptor instead. +func (*GetTeamMemberResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{15} +} + +func (x *GetTeamMemberResponse) GetMembership() *TeamMembership { + if x != nil { + return x.Membership + } + return nil +} + +// Request message for ListTeamMembers RPC. +type ListTeamMembersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent team. + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of members to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListTeamMembers call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamMembersRequest) Reset() { + *x = ListTeamMembersRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamMembersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamMembersRequest) ProtoMessage() {} + +func (x *ListTeamMembersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamMembersRequest.ProtoReflect.Descriptor instead. +func (*ListTeamMembersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{16} +} + +func (x *ListTeamMembersRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListTeamMembersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListTeamMembersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListTeamMembers RPC. +type ListTeamMembersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of memberships + Memberships []*TeamMembership `protobuf:"bytes,1,rep,name=memberships,proto3" json:"memberships,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTeamMembersResponse) Reset() { + *x = ListTeamMembersResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTeamMembersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamMembersResponse) ProtoMessage() {} + +func (x *ListTeamMembersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamMembersResponse.ProtoReflect.Descriptor instead. +func (*ListTeamMembersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{17} +} + +func (x *ListTeamMembersResponse) GetMemberships() []*TeamMembership { + if x != nil { + return x.Memberships + } + return nil +} + +func (x *ListTeamMembersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListTeamMembersResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateTeamMember RPC. +type UpdateTeamMemberRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The membership to update. + Membership *TeamMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + // The fields to update (only role is updatable) + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateTeamMemberRequest) Reset() { + *x = UpdateTeamMemberRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateTeamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTeamMemberRequest) ProtoMessage() {} + +func (x *UpdateTeamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTeamMemberRequest.ProtoReflect.Descriptor instead. +func (*UpdateTeamMemberRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{18} +} + +func (x *UpdateTeamMemberRequest) GetMembership() *TeamMembership { + if x != nil { + return x.Membership + } + return nil +} + +func (x *UpdateTeamMemberRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateTeamMember RPC. +type UpdateTeamMemberResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Membership *TeamMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateTeamMemberResponse) Reset() { + *x = UpdateTeamMemberResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateTeamMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTeamMemberResponse) ProtoMessage() {} + +func (x *UpdateTeamMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTeamMemberResponse.ProtoReflect.Descriptor instead. +func (*UpdateTeamMemberResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{19} +} + +func (x *UpdateTeamMemberResponse) GetMembership() *TeamMembership { + if x != nil { + return x.Membership + } + return nil +} + +// Request message for RemoveTeamMember RPC. +type RemoveTeamMemberRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the membership to remove. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveTeamMemberRequest) Reset() { + *x = RemoveTeamMemberRequest{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveTeamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveTeamMemberRequest) ProtoMessage() {} + +func (x *RemoveTeamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveTeamMemberRequest.ProtoReflect.Descriptor instead. +func (*RemoveTeamMemberRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{20} +} + +func (x *RemoveTeamMemberRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RemoveTeamMember RPC. +type RemoveTeamMemberResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveTeamMemberResponse) Reset() { + *x = RemoveTeamMemberResponse{} + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveTeamMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveTeamMemberResponse) ProtoMessage() {} + +func (x *RemoveTeamMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_team_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveTeamMemberResponse.ProtoReflect.Descriptor instead. +func (*RemoveTeamMemberResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP(), []int{21} +} + +var File_redpanda_api_aigateway_v1_team_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_team_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x65, 0x61, 0x6d, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x04, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x3a, 0x5e, 0xea, 0x41, 0x5b, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x3c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x7b, 0x74, 0x65, + 0x61, 0x6d, 0x7d, 0x22, 0x80, 0x03, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, + 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x7d, 0xea, 0x41, 0x7a, 0x0a, 0x25, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x12, 0x51, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x61, 0x6d, + 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x7d, 0x22, 0xb0, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x38, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x49, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x22, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0xe4, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, + 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x91, + 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x65, + 0x61, 0x6d, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x49, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, + 0x67, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xca, + 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, + 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3c, 0x0a, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x62, 0x0a, 0x15, 0x41, + 0x64, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, + 0x59, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0xa5, + 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, + 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, + 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xad, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x49, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, + 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x5c, 0x0a, 0x17, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x66, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, + 0x65, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, + 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, + 0x01, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, + 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x45, 0x41, 0x4d, 0x5f, + 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x45, 0x52, 0x10, 0x03, 0x32, 0x93, 0x0e, + 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa6, 0x01, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x35, 0x3a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, + 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x12, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0x9d, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x2b, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, + 0x12, 0xab, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x32, 0x32, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x74, 0x65, 0x61, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa0, + 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2f, 0x2a, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, + 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x01, + 0x2a, 0x22, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, + 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xb3, 0x01, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, + 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xb9, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, + 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xca, 0x01, 0x0a, + 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x47, 0x3a, 0x01, 0x2a, 0x32, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x10, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x32, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x2a, + 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x42, 0xfe, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, + 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, + 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_team_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_team_proto_rawDescData = file_redpanda_api_aigateway_v1_team_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_team_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_team_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_team_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_team_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_team_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_team_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_redpanda_api_aigateway_v1_team_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_redpanda_api_aigateway_v1_team_proto_goTypes = []any{ + (TeamRole)(0), // 0: redpanda.api.aigateway.v1.TeamRole + (*Team)(nil), // 1: redpanda.api.aigateway.v1.Team + (*TeamMembership)(nil), // 2: redpanda.api.aigateway.v1.TeamMembership + (*CreateTeamRequest)(nil), // 3: redpanda.api.aigateway.v1.CreateTeamRequest + (*CreateTeamResponse)(nil), // 4: redpanda.api.aigateway.v1.CreateTeamResponse + (*GetTeamRequest)(nil), // 5: redpanda.api.aigateway.v1.GetTeamRequest + (*GetTeamResponse)(nil), // 6: redpanda.api.aigateway.v1.GetTeamResponse + (*ListTeamsRequest)(nil), // 7: redpanda.api.aigateway.v1.ListTeamsRequest + (*ListTeamsResponse)(nil), // 8: redpanda.api.aigateway.v1.ListTeamsResponse + (*UpdateTeamRequest)(nil), // 9: redpanda.api.aigateway.v1.UpdateTeamRequest + (*UpdateTeamResponse)(nil), // 10: redpanda.api.aigateway.v1.UpdateTeamResponse + (*DeleteTeamRequest)(nil), // 11: redpanda.api.aigateway.v1.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 12: redpanda.api.aigateway.v1.DeleteTeamResponse + (*AddTeamMemberRequest)(nil), // 13: redpanda.api.aigateway.v1.AddTeamMemberRequest + (*AddTeamMemberResponse)(nil), // 14: redpanda.api.aigateway.v1.AddTeamMemberResponse + (*GetTeamMemberRequest)(nil), // 15: redpanda.api.aigateway.v1.GetTeamMemberRequest + (*GetTeamMemberResponse)(nil), // 16: redpanda.api.aigateway.v1.GetTeamMemberResponse + (*ListTeamMembersRequest)(nil), // 17: redpanda.api.aigateway.v1.ListTeamMembersRequest + (*ListTeamMembersResponse)(nil), // 18: redpanda.api.aigateway.v1.ListTeamMembersResponse + (*UpdateTeamMemberRequest)(nil), // 19: redpanda.api.aigateway.v1.UpdateTeamMemberRequest + (*UpdateTeamMemberResponse)(nil), // 20: redpanda.api.aigateway.v1.UpdateTeamMemberResponse + (*RemoveTeamMemberRequest)(nil), // 21: redpanda.api.aigateway.v1.RemoveTeamMemberRequest + (*RemoveTeamMemberResponse)(nil), // 22: redpanda.api.aigateway.v1.RemoveTeamMemberResponse + nil, // 23: redpanda.api.aigateway.v1.Team.MetadataEntry + (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 25: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_team_proto_depIdxs = []int32{ + 23, // 0: redpanda.api.aigateway.v1.Team.metadata:type_name -> redpanda.api.aigateway.v1.Team.MetadataEntry + 24, // 1: redpanda.api.aigateway.v1.Team.create_time:type_name -> google.protobuf.Timestamp + 24, // 2: redpanda.api.aigateway.v1.Team.update_time:type_name -> google.protobuf.Timestamp + 0, // 3: redpanda.api.aigateway.v1.TeamMembership.role:type_name -> redpanda.api.aigateway.v1.TeamRole + 24, // 4: redpanda.api.aigateway.v1.TeamMembership.create_time:type_name -> google.protobuf.Timestamp + 1, // 5: redpanda.api.aigateway.v1.CreateTeamRequest.team:type_name -> redpanda.api.aigateway.v1.Team + 1, // 6: redpanda.api.aigateway.v1.CreateTeamResponse.team:type_name -> redpanda.api.aigateway.v1.Team + 1, // 7: redpanda.api.aigateway.v1.GetTeamResponse.team:type_name -> redpanda.api.aigateway.v1.Team + 1, // 8: redpanda.api.aigateway.v1.ListTeamsResponse.teams:type_name -> redpanda.api.aigateway.v1.Team + 1, // 9: redpanda.api.aigateway.v1.UpdateTeamRequest.team:type_name -> redpanda.api.aigateway.v1.Team + 25, // 10: redpanda.api.aigateway.v1.UpdateTeamRequest.update_mask:type_name -> google.protobuf.FieldMask + 1, // 11: redpanda.api.aigateway.v1.UpdateTeamResponse.team:type_name -> redpanda.api.aigateway.v1.Team + 0, // 12: redpanda.api.aigateway.v1.AddTeamMemberRequest.role:type_name -> redpanda.api.aigateway.v1.TeamRole + 2, // 13: redpanda.api.aigateway.v1.AddTeamMemberResponse.membership:type_name -> redpanda.api.aigateway.v1.TeamMembership + 2, // 14: redpanda.api.aigateway.v1.GetTeamMemberResponse.membership:type_name -> redpanda.api.aigateway.v1.TeamMembership + 2, // 15: redpanda.api.aigateway.v1.ListTeamMembersResponse.memberships:type_name -> redpanda.api.aigateway.v1.TeamMembership + 2, // 16: redpanda.api.aigateway.v1.UpdateTeamMemberRequest.membership:type_name -> redpanda.api.aigateway.v1.TeamMembership + 25, // 17: redpanda.api.aigateway.v1.UpdateTeamMemberRequest.update_mask:type_name -> google.protobuf.FieldMask + 2, // 18: redpanda.api.aigateway.v1.UpdateTeamMemberResponse.membership:type_name -> redpanda.api.aigateway.v1.TeamMembership + 3, // 19: redpanda.api.aigateway.v1.TeamService.CreateTeam:input_type -> redpanda.api.aigateway.v1.CreateTeamRequest + 5, // 20: redpanda.api.aigateway.v1.TeamService.GetTeam:input_type -> redpanda.api.aigateway.v1.GetTeamRequest + 7, // 21: redpanda.api.aigateway.v1.TeamService.ListTeams:input_type -> redpanda.api.aigateway.v1.ListTeamsRequest + 9, // 22: redpanda.api.aigateway.v1.TeamService.UpdateTeam:input_type -> redpanda.api.aigateway.v1.UpdateTeamRequest + 11, // 23: redpanda.api.aigateway.v1.TeamService.DeleteTeam:input_type -> redpanda.api.aigateway.v1.DeleteTeamRequest + 13, // 24: redpanda.api.aigateway.v1.TeamService.AddTeamMember:input_type -> redpanda.api.aigateway.v1.AddTeamMemberRequest + 15, // 25: redpanda.api.aigateway.v1.TeamService.GetTeamMember:input_type -> redpanda.api.aigateway.v1.GetTeamMemberRequest + 17, // 26: redpanda.api.aigateway.v1.TeamService.ListTeamMembers:input_type -> redpanda.api.aigateway.v1.ListTeamMembersRequest + 19, // 27: redpanda.api.aigateway.v1.TeamService.UpdateTeamMember:input_type -> redpanda.api.aigateway.v1.UpdateTeamMemberRequest + 21, // 28: redpanda.api.aigateway.v1.TeamService.RemoveTeamMember:input_type -> redpanda.api.aigateway.v1.RemoveTeamMemberRequest + 4, // 29: redpanda.api.aigateway.v1.TeamService.CreateTeam:output_type -> redpanda.api.aigateway.v1.CreateTeamResponse + 6, // 30: redpanda.api.aigateway.v1.TeamService.GetTeam:output_type -> redpanda.api.aigateway.v1.GetTeamResponse + 8, // 31: redpanda.api.aigateway.v1.TeamService.ListTeams:output_type -> redpanda.api.aigateway.v1.ListTeamsResponse + 10, // 32: redpanda.api.aigateway.v1.TeamService.UpdateTeam:output_type -> redpanda.api.aigateway.v1.UpdateTeamResponse + 12, // 33: redpanda.api.aigateway.v1.TeamService.DeleteTeam:output_type -> redpanda.api.aigateway.v1.DeleteTeamResponse + 14, // 34: redpanda.api.aigateway.v1.TeamService.AddTeamMember:output_type -> redpanda.api.aigateway.v1.AddTeamMemberResponse + 16, // 35: redpanda.api.aigateway.v1.TeamService.GetTeamMember:output_type -> redpanda.api.aigateway.v1.GetTeamMemberResponse + 18, // 36: redpanda.api.aigateway.v1.TeamService.ListTeamMembers:output_type -> redpanda.api.aigateway.v1.ListTeamMembersResponse + 20, // 37: redpanda.api.aigateway.v1.TeamService.UpdateTeamMember:output_type -> redpanda.api.aigateway.v1.UpdateTeamMemberResponse + 22, // 38: redpanda.api.aigateway.v1.TeamService.RemoveTeamMember:output_type -> redpanda.api.aigateway.v1.RemoveTeamMemberResponse + 29, // [29:39] is the sub-list for method output_type + 19, // [19:29] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_team_proto_init() } +func file_redpanda_api_aigateway_v1_team_proto_init() { + if File_redpanda_api_aigateway_v1_team_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_team_proto_rawDesc, + NumEnums: 1, + NumMessages: 23, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_team_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_team_proto_depIdxs, + EnumInfos: file_redpanda_api_aigateway_v1_team_proto_enumTypes, + MessageInfos: file_redpanda_api_aigateway_v1_team_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_team_proto = out.File + file_redpanda_api_aigateway_v1_team_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_team_proto_goTypes = nil + file_redpanda_api_aigateway_v1_team_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.gw.go new file mode 100644 index 0000000000..f37ee50ce0 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/team.pb.gw.go @@ -0,0 +1,987 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/team.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_TeamService_CreateTeam_0 = &utilities.DoubleArray{Encoding: map[string]int{"team": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_TeamService_CreateTeam_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateTeamRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Team); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_CreateTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateTeam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_CreateTeam_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateTeamRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Team); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_CreateTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateTeam(ctx, &protoReq) + return msg, metadata, err +} + +func request_TeamService_GetTeam_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTeamRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetTeam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_GetTeam_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTeamRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetTeam(ctx, &protoReq) + return msg, metadata, err +} + +var filter_TeamService_ListTeams_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_TeamService_ListTeams_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_ListTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListTeams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_ListTeams_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_ListTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListTeams(ctx, &protoReq) + return msg, metadata, err +} + +var filter_TeamService_UpdateTeam_0 = &utilities.DoubleArray{Encoding: map[string]int{"team": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_TeamService_UpdateTeam_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateTeamRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Team); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Team); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["team.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "team.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "team.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "team.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_UpdateTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateTeam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_UpdateTeam_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateTeamRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Team); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Team); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["team.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "team.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "team.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "team.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_UpdateTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateTeam(ctx, &protoReq) + return msg, metadata, err +} + +var filter_TeamService_DeleteTeam_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_TeamService_DeleteTeam_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteTeamRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_DeleteTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteTeam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_DeleteTeam_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteTeamRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_DeleteTeam_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteTeam(ctx, &protoReq) + return msg, metadata, err +} + +func request_TeamService_AddTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.AddTeamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_AddTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.AddTeamMember(ctx, &protoReq) + return msg, metadata, err +} + +func request_TeamService_GetTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetTeamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_GetTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetTeamMember(ctx, &protoReq) + return msg, metadata, err +} + +var filter_TeamService_ListTeamMembers_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_TeamService_ListTeamMembers_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamMembersRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_ListTeamMembers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListTeamMembers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_ListTeamMembers_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListTeamMembersRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TeamService_ListTeamMembers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListTeamMembers(ctx, &protoReq) + return msg, metadata, err +} + +func request_TeamService_UpdateTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["membership.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "membership.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "membership.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "membership.name", err) + } + msg, err := client.UpdateTeamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_UpdateTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["membership.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "membership.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "membership.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "membership.name", err) + } + msg, err := server.UpdateTeamMember(ctx, &protoReq) + return msg, metadata, err +} + +func request_TeamService_RemoveTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, client TeamServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RemoveTeamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_TeamService_RemoveTeamMember_0(ctx context.Context, marshaler runtime.Marshaler, server TeamServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveTeamMemberRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RemoveTeamMember(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterTeamServiceHandlerServer registers the http handlers for service TeamService to "mux". +// UnaryRPC :call TeamServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterTeamServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterTeamServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server TeamServiceServer) error { + mux.Handle(http.MethodPost, pattern_TeamService_CreateTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/CreateTeam", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_CreateTeam_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_CreateTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_GetTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/GetTeam", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_GetTeam_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_GetTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_ListTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/ListTeams", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_ListTeams_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_ListTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_TeamService_UpdateTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/UpdateTeam", runtime.WithHTTPPathPattern("/v1/{team.name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_UpdateTeam_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_UpdateTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_TeamService_DeleteTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/DeleteTeam", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_DeleteTeam_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_DeleteTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_TeamService_AddTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/AddTeamMember", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*/teams/*}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_AddTeamMember_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_AddTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_GetTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/GetTeamMember", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_GetTeamMember_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_GetTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_ListTeamMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/ListTeamMembers", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*/teams/*}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_ListTeamMembers_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_ListTeamMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_TeamService_UpdateTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/UpdateTeamMember", runtime.WithHTTPPathPattern("/v1/{membership.name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_UpdateTeamMember_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_UpdateTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_TeamService_RemoveTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/RemoveTeamMember", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TeamService_RemoveTeamMember_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_RemoveTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterTeamServiceHandlerFromEndpoint is same as RegisterTeamServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterTeamServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterTeamServiceHandler(ctx, mux, conn) +} + +// RegisterTeamServiceHandler registers the http handlers for service TeamService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterTeamServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterTeamServiceHandlerClient(ctx, mux, NewTeamServiceClient(conn)) +} + +// RegisterTeamServiceHandlerClient registers the http handlers for service TeamService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "TeamServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "TeamServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "TeamServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterTeamServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client TeamServiceClient) error { + mux.Handle(http.MethodPost, pattern_TeamService_CreateTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/CreateTeam", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_CreateTeam_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_CreateTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_GetTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/GetTeam", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_GetTeam_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_GetTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_ListTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/ListTeams", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_ListTeams_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_ListTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_TeamService_UpdateTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/UpdateTeam", runtime.WithHTTPPathPattern("/v1/{team.name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_UpdateTeam_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_UpdateTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_TeamService_DeleteTeam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/DeleteTeam", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_DeleteTeam_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_DeleteTeam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_TeamService_AddTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/AddTeamMember", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*/teams/*}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_AddTeamMember_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_AddTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_GetTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/GetTeamMember", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_GetTeamMember_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_GetTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_TeamService_ListTeamMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/ListTeamMembers", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*/teams/*}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_ListTeamMembers_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_ListTeamMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_TeamService_UpdateTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/UpdateTeamMember", runtime.WithHTTPPathPattern("/v1/{membership.name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_UpdateTeamMember_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_UpdateTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_TeamService_RemoveTeamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.TeamService/RemoveTeamMember", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/teams/*/members/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TeamService_RemoveTeamMember_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_TeamService_RemoveTeamMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_TeamService_CreateTeam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "teams"}, "")) + pattern_TeamService_GetTeam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "teams", "name"}, "")) + pattern_TeamService_ListTeams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "teams"}, "")) + pattern_TeamService_UpdateTeam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "teams", "team.name"}, "")) + pattern_TeamService_DeleteTeam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "teams", "name"}, "")) + pattern_TeamService_AddTeamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "accounts", "organizations", "teams", "parent", "members"}, "")) + pattern_TeamService_GetTeamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 2, 4, 1, 0, 4, 8, 5, 5}, []string{"v1", "accounts", "organizations", "teams", "members", "name"}, "")) + pattern_TeamService_ListTeamMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "accounts", "organizations", "teams", "parent", "members"}, "")) + pattern_TeamService_UpdateTeamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 2, 4, 1, 0, 4, 8, 5, 5}, []string{"v1", "accounts", "organizations", "teams", "members", "membership.name"}, "")) + pattern_TeamService_RemoveTeamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 2, 4, 1, 0, 4, 8, 5, 5}, []string{"v1", "accounts", "organizations", "teams", "members", "name"}, "")) +) + +var ( + forward_TeamService_CreateTeam_0 = runtime.ForwardResponseMessage + forward_TeamService_GetTeam_0 = runtime.ForwardResponseMessage + forward_TeamService_ListTeams_0 = runtime.ForwardResponseMessage + forward_TeamService_UpdateTeam_0 = runtime.ForwardResponseMessage + forward_TeamService_DeleteTeam_0 = runtime.ForwardResponseMessage + forward_TeamService_AddTeamMember_0 = runtime.ForwardResponseMessage + forward_TeamService_GetTeamMember_0 = runtime.ForwardResponseMessage + forward_TeamService_ListTeamMembers_0 = runtime.ForwardResponseMessage + forward_TeamService_UpdateTeamMember_0 = runtime.ForwardResponseMessage + forward_TeamService_RemoveTeamMember_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/team_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/team_grpc.pb.go new file mode 100644 index 0000000000..327c974c3c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/team_grpc.pb.go @@ -0,0 +1,492 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/team.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + TeamService_CreateTeam_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/CreateTeam" + TeamService_GetTeam_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/GetTeam" + TeamService_ListTeams_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/ListTeams" + TeamService_UpdateTeam_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/UpdateTeam" + TeamService_DeleteTeam_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/DeleteTeam" + TeamService_AddTeamMember_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/AddTeamMember" + TeamService_GetTeamMember_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/GetTeamMember" + TeamService_ListTeamMembers_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/ListTeamMembers" + TeamService_UpdateTeamMember_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/UpdateTeamMember" + TeamService_RemoveTeamMember_FullMethodName = "/redpanda.api.aigateway.v1.TeamService/RemoveTeamMember" +) + +// TeamServiceClient is the client API for TeamService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// TeamService manages teams within organizations. +// A team is a group of users for access control and collaboration. +// Resource name: accounts/{account_id}/organizations/{organization_id}/teams/{team_id} +type TeamServiceClient interface { + // Creates a new team within an organization. + CreateTeam(ctx context.Context, in *CreateTeamRequest, opts ...grpc.CallOption) (*CreateTeamResponse, error) + // Gets a team by name. + GetTeam(ctx context.Context, in *GetTeamRequest, opts ...grpc.CallOption) (*GetTeamResponse, error) + // Lists teams within an organization. + ListTeams(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) + // Updates a team. + UpdateTeam(ctx context.Context, in *UpdateTeamRequest, opts ...grpc.CallOption) (*UpdateTeamResponse, error) + // Deletes a team. + DeleteTeam(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) + // Adds a user to a team. + AddTeamMember(ctx context.Context, in *AddTeamMemberRequest, opts ...grpc.CallOption) (*AddTeamMemberResponse, error) + // Gets a team membership. + GetTeamMember(ctx context.Context, in *GetTeamMemberRequest, opts ...grpc.CallOption) (*GetTeamMemberResponse, error) + // Lists members of a team. + ListTeamMembers(ctx context.Context, in *ListTeamMembersRequest, opts ...grpc.CallOption) (*ListTeamMembersResponse, error) + // Updates a team member's role. + UpdateTeamMember(ctx context.Context, in *UpdateTeamMemberRequest, opts ...grpc.CallOption) (*UpdateTeamMemberResponse, error) + // Removes a user from a team. + RemoveTeamMember(ctx context.Context, in *RemoveTeamMemberRequest, opts ...grpc.CallOption) (*RemoveTeamMemberResponse, error) +} + +type teamServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewTeamServiceClient(cc grpc.ClientConnInterface) TeamServiceClient { + return &teamServiceClient{cc} +} + +func (c *teamServiceClient) CreateTeam(ctx context.Context, in *CreateTeamRequest, opts ...grpc.CallOption) (*CreateTeamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateTeamResponse) + err := c.cc.Invoke(ctx, TeamService_CreateTeam_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) GetTeam(ctx context.Context, in *GetTeamRequest, opts ...grpc.CallOption) (*GetTeamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetTeamResponse) + err := c.cc.Invoke(ctx, TeamService_GetTeam_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) ListTeams(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListTeamsResponse) + err := c.cc.Invoke(ctx, TeamService_ListTeams_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) UpdateTeam(ctx context.Context, in *UpdateTeamRequest, opts ...grpc.CallOption) (*UpdateTeamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateTeamResponse) + err := c.cc.Invoke(ctx, TeamService_UpdateTeam_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) DeleteTeam(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteTeamResponse) + err := c.cc.Invoke(ctx, TeamService_DeleteTeam_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) AddTeamMember(ctx context.Context, in *AddTeamMemberRequest, opts ...grpc.CallOption) (*AddTeamMemberResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AddTeamMemberResponse) + err := c.cc.Invoke(ctx, TeamService_AddTeamMember_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) GetTeamMember(ctx context.Context, in *GetTeamMemberRequest, opts ...grpc.CallOption) (*GetTeamMemberResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetTeamMemberResponse) + err := c.cc.Invoke(ctx, TeamService_GetTeamMember_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) ListTeamMembers(ctx context.Context, in *ListTeamMembersRequest, opts ...grpc.CallOption) (*ListTeamMembersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListTeamMembersResponse) + err := c.cc.Invoke(ctx, TeamService_ListTeamMembers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) UpdateTeamMember(ctx context.Context, in *UpdateTeamMemberRequest, opts ...grpc.CallOption) (*UpdateTeamMemberResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateTeamMemberResponse) + err := c.cc.Invoke(ctx, TeamService_UpdateTeamMember_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamServiceClient) RemoveTeamMember(ctx context.Context, in *RemoveTeamMemberRequest, opts ...grpc.CallOption) (*RemoveTeamMemberResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RemoveTeamMemberResponse) + err := c.cc.Invoke(ctx, TeamService_RemoveTeamMember_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// TeamServiceServer is the server API for TeamService service. +// All implementations must embed UnimplementedTeamServiceServer +// for forward compatibility. +// +// TeamService manages teams within organizations. +// A team is a group of users for access control and collaboration. +// Resource name: accounts/{account_id}/organizations/{organization_id}/teams/{team_id} +type TeamServiceServer interface { + // Creates a new team within an organization. + CreateTeam(context.Context, *CreateTeamRequest) (*CreateTeamResponse, error) + // Gets a team by name. + GetTeam(context.Context, *GetTeamRequest) (*GetTeamResponse, error) + // Lists teams within an organization. + ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) + // Updates a team. + UpdateTeam(context.Context, *UpdateTeamRequest) (*UpdateTeamResponse, error) + // Deletes a team. + DeleteTeam(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) + // Adds a user to a team. + AddTeamMember(context.Context, *AddTeamMemberRequest) (*AddTeamMemberResponse, error) + // Gets a team membership. + GetTeamMember(context.Context, *GetTeamMemberRequest) (*GetTeamMemberResponse, error) + // Lists members of a team. + ListTeamMembers(context.Context, *ListTeamMembersRequest) (*ListTeamMembersResponse, error) + // Updates a team member's role. + UpdateTeamMember(context.Context, *UpdateTeamMemberRequest) (*UpdateTeamMemberResponse, error) + // Removes a user from a team. + RemoveTeamMember(context.Context, *RemoveTeamMemberRequest) (*RemoveTeamMemberResponse, error) + mustEmbedUnimplementedTeamServiceServer() +} + +// UnimplementedTeamServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedTeamServiceServer struct{} + +func (UnimplementedTeamServiceServer) CreateTeam(context.Context, *CreateTeamRequest) (*CreateTeamResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateTeam not implemented") +} +func (UnimplementedTeamServiceServer) GetTeam(context.Context, *GetTeamRequest) (*GetTeamResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTeam not implemented") +} +func (UnimplementedTeamServiceServer) ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTeams not implemented") +} +func (UnimplementedTeamServiceServer) UpdateTeam(context.Context, *UpdateTeamRequest) (*UpdateTeamResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateTeam not implemented") +} +func (UnimplementedTeamServiceServer) DeleteTeam(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteTeam not implemented") +} +func (UnimplementedTeamServiceServer) AddTeamMember(context.Context, *AddTeamMemberRequest) (*AddTeamMemberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTeamMember not implemented") +} +func (UnimplementedTeamServiceServer) GetTeamMember(context.Context, *GetTeamMemberRequest) (*GetTeamMemberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTeamMember not implemented") +} +func (UnimplementedTeamServiceServer) ListTeamMembers(context.Context, *ListTeamMembersRequest) (*ListTeamMembersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTeamMembers not implemented") +} +func (UnimplementedTeamServiceServer) UpdateTeamMember(context.Context, *UpdateTeamMemberRequest) (*UpdateTeamMemberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateTeamMember not implemented") +} +func (UnimplementedTeamServiceServer) RemoveTeamMember(context.Context, *RemoveTeamMemberRequest) (*RemoveTeamMemberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveTeamMember not implemented") +} +func (UnimplementedTeamServiceServer) mustEmbedUnimplementedTeamServiceServer() {} +func (UnimplementedTeamServiceServer) testEmbeddedByValue() {} + +// UnsafeTeamServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to TeamServiceServer will +// result in compilation errors. +type UnsafeTeamServiceServer interface { + mustEmbedUnimplementedTeamServiceServer() +} + +func RegisterTeamServiceServer(s grpc.ServiceRegistrar, srv TeamServiceServer) { + // If the following call pancis, it indicates UnimplementedTeamServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&TeamService_ServiceDesc, srv) +} + +func _TeamService_CreateTeam_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateTeamRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).CreateTeam(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_CreateTeam_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).CreateTeam(ctx, req.(*CreateTeamRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_GetTeam_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTeamRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).GetTeam(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_GetTeam_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).GetTeam(ctx, req.(*GetTeamRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_ListTeams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListTeamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).ListTeams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_ListTeams_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).ListTeams(ctx, req.(*ListTeamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_UpdateTeam_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateTeamRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).UpdateTeam(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_UpdateTeam_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).UpdateTeam(ctx, req.(*UpdateTeamRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_DeleteTeam_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteTeamRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).DeleteTeam(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_DeleteTeam_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).DeleteTeam(ctx, req.(*DeleteTeamRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_AddTeamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddTeamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).AddTeamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_AddTeamMember_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).AddTeamMember(ctx, req.(*AddTeamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_GetTeamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTeamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).GetTeamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_GetTeamMember_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).GetTeamMember(ctx, req.(*GetTeamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_ListTeamMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListTeamMembersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).ListTeamMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_ListTeamMembers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).ListTeamMembers(ctx, req.(*ListTeamMembersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_UpdateTeamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateTeamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).UpdateTeamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_UpdateTeamMember_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).UpdateTeamMember(ctx, req.(*UpdateTeamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TeamService_RemoveTeamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveTeamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServiceServer).RemoveTeamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TeamService_RemoveTeamMember_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServiceServer).RemoveTeamMember(ctx, req.(*RemoveTeamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// TeamService_ServiceDesc is the grpc.ServiceDesc for TeamService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var TeamService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.TeamService", + HandlerType: (*TeamServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateTeam", + Handler: _TeamService_CreateTeam_Handler, + }, + { + MethodName: "GetTeam", + Handler: _TeamService_GetTeam_Handler, + }, + { + MethodName: "ListTeams", + Handler: _TeamService_ListTeams_Handler, + }, + { + MethodName: "UpdateTeam", + Handler: _TeamService_UpdateTeam_Handler, + }, + { + MethodName: "DeleteTeam", + Handler: _TeamService_DeleteTeam_Handler, + }, + { + MethodName: "AddTeamMember", + Handler: _TeamService_AddTeamMember_Handler, + }, + { + MethodName: "GetTeamMember", + Handler: _TeamService_GetTeamMember_Handler, + }, + { + MethodName: "ListTeamMembers", + Handler: _TeamService_ListTeamMembers_Handler, + }, + { + MethodName: "UpdateTeamMember", + Handler: _TeamService_UpdateTeamMember_Handler, + }, + { + MethodName: "RemoveTeamMember", + Handler: _TeamService_RemoveTeamMember_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/team.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.go new file mode 100644 index 0000000000..82c9f59d28 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.go @@ -0,0 +1,2429 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/user.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// User represents an individual user account within an account. +// Users can be members of multiple organizations within their account. +type User struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/users/{user}` + // User ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Required: Email address (must be unique within account) + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // Human-readable display name + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional: OIDC subject claim for auto-provisioning + // When set, this user can be automatically matched to OIDC tokens + OidcSubject string `protobuf:"bytes,4,opt,name=oidc_subject,json=oidcSubject,proto3" json:"oidc_subject,omitempty"` + // Whether this user is active + Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Last login timestamp + LastLoginTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_login_time,json=lastLoginTime,proto3" json:"last_login_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,10,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,11,opt,name=updater,proto3" json:"updater,omitempty"` + // Optional: Default organization context for UI + // Format: `accounts/{account}/organizations/{organization}` + // When set, this organization is pre-selected in the UI organization switcher + DefaultOrganization string `protobuf:"bytes,12,opt,name=default_organization,json=defaultOrganization,proto3" json:"default_organization,omitempty"` + // Optional: Default workspace context for UI + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + // When set, this workspace is pre-selected when navigating to workspace-scoped pages + DefaultWorkspace string `protobuf:"bytes,13,opt,name=default_workspace,json=defaultWorkspace,proto3" json:"default_workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *User) Reset() { + *x = User{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{0} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *User) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *User) GetOidcSubject() string { + if x != nil { + return x.OidcSubject + } + return "" +} + +func (x *User) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *User) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *User) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *User) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *User) GetLastLoginTime() *timestamppb.Timestamp { + if x != nil { + return x.LastLoginTime + } + return nil +} + +func (x *User) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *User) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +func (x *User) GetDefaultOrganization() string { + if x != nil { + return x.DefaultOrganization + } + return "" +} + +func (x *User) GetDefaultWorkspace() string { + if x != nil { + return x.DefaultWorkspace + } + return "" +} + +// OrganizationMembership represents a user's membership in an organization. +type OrganizationMembership struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/users/{user}/organizations/{organization}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Reference to the organization. + // Format: `accounts/{account}/organizations/{organization}` + Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` + // Organization display name (for convenience) + OrganizationDisplayName string `protobuf:"bytes,3,opt,name=organization_display_name,json=organizationDisplayName,proto3" json:"organization_display_name,omitempty"` + // User's role in the organization: admin, member, viewer + Role string `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` + // When the user joined the organization + JoinTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=join_time,json=joinTime,proto3" json:"join_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OrganizationMembership) Reset() { + *x = OrganizationMembership{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OrganizationMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrganizationMembership) ProtoMessage() {} + +func (x *OrganizationMembership) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OrganizationMembership.ProtoReflect.Descriptor instead. +func (*OrganizationMembership) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{1} +} + +func (x *OrganizationMembership) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OrganizationMembership) GetOrganization() string { + if x != nil { + return x.Organization + } + return "" +} + +func (x *OrganizationMembership) GetOrganizationDisplayName() string { + if x != nil { + return x.OrganizationDisplayName + } + return "" +} + +func (x *OrganizationMembership) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *OrganizationMembership) GetJoinTime() *timestamppb.Timestamp { + if x != nil { + return x.JoinTime + } + return nil +} + +// Request message for CreateUser RPC. +type CreateUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent account. + // Format: `accounts/{account}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The user ID to use. If empty, server generates one. + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Required: The user resource to create. + User *User `protobuf:"bytes,3,opt,name=user,proto3" json:"user,omitempty"` + // Optional: Initial organization membership. + // If provided, the user is added to this organization with the specified role. + // Format: `accounts/{account}/organizations/{organization}` + InitialOrganization string `protobuf:"bytes,4,opt,name=initial_organization,json=initialOrganization,proto3" json:"initial_organization,omitempty"` + // Role for the initial organization membership (default: "member") + InitialOrganizationRole string `protobuf:"bytes,5,opt,name=initial_organization_role,json=initialOrganizationRole,proto3" json:"initial_organization_role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateUserRequest) Reset() { + *x = CreateUserRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateUserRequest) ProtoMessage() {} + +func (x *CreateUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateUserRequest.ProtoReflect.Descriptor instead. +func (*CreateUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateUserRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateUserRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *CreateUserRequest) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *CreateUserRequest) GetInitialOrganization() string { + if x != nil { + return x.InitialOrganization + } + return "" +} + +func (x *CreateUserRequest) GetInitialOrganizationRole() string { + if x != nil { + return x.InitialOrganizationRole + } + return "" +} + +// Response message for CreateUser RPC. +type CreateUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The created user. + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + // The personal access token (JWT) for this user. + // This is shown only once at creation time. The user can later reveal it + // via RevealPersonalToken (requires password re-authentication). + // Use as: Authorization: Bearer + PersonalAccessToken string `protobuf:"bytes,2,opt,name=personal_access_token,json=personalAccessToken,proto3" json:"personal_access_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateUserResponse) Reset() { + *x = CreateUserResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateUserResponse) ProtoMessage() {} + +func (x *CreateUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateUserResponse.ProtoReflect.Descriptor instead. +func (*CreateUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateUserResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *CreateUserResponse) GetPersonalAccessToken() string { + if x != nil { + return x.PersonalAccessToken + } + return "" +} + +// Request message for GetUser RPC. +type GetUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the user. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetUserRequest) Reset() { + *x = GetUserRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUserRequest) ProtoMessage() {} + +func (x *GetUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead. +func (*GetUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{4} +} + +func (x *GetUserRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetUser RPC. +type GetUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetUserResponse) Reset() { + *x = GetUserResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUserResponse) ProtoMessage() {} + +func (x *GetUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead. +func (*GetUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{5} +} + +func (x *GetUserResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +// Request message for ListUsers RPC. +type ListUsersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent account. + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of users to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListUsers call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + // Examples: + // + // enabled == true + // email.endsWith("@example.com") + // oidc_subject != "" + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUsersRequest) Reset() { + *x = ListUsersRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUsersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUsersRequest) ProtoMessage() {} + +func (x *ListUsersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUsersRequest.ProtoReflect.Descriptor instead. +func (*ListUsersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{6} +} + +func (x *ListUsersRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListUsersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListUsersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListUsersRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListUsersRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListUsers RPC. +type ListUsersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of users + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching users + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUsersResponse) Reset() { + *x = ListUsersResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUsersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUsersResponse) ProtoMessage() {} + +func (x *ListUsersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUsersResponse.ProtoReflect.Descriptor instead. +func (*ListUsersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{7} +} + +func (x *ListUsersResponse) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +func (x *ListUsersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListUsersResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateUser RPC. +type UpdateUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The user resource to update. + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + // The fields to update. + // Allowed fields: email, display_name, oidc_subject, enabled, metadata, default_organization, default_workspace + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateUserRequest) Reset() { + *x = UpdateUserRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserRequest) ProtoMessage() {} + +func (x *UpdateUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserRequest.ProtoReflect.Descriptor instead. +func (*UpdateUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateUserRequest) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *UpdateUserRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateUser RPC. +type UpdateUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateUserResponse) Reset() { + *x = UpdateUserResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserResponse) ProtoMessage() {} + +func (x *UpdateUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserResponse.ProtoReflect.Descriptor instead. +func (*UpdateUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateUserResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +// Request message for DeleteUser RPC. +type DeleteUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the user to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all memberships (organization and team) + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteUserRequest) Reset() { + *x = DeleteUserRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteUserRequest) ProtoMessage() {} + +func (x *DeleteUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteUserRequest.ProtoReflect.Descriptor instead. +func (*DeleteUserRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteUserRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteUserRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteUser RPC. +type DeleteUserResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteUserResponse) Reset() { + *x = DeleteUserResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteUserResponse) ProtoMessage() {} + +func (x *DeleteUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteUserResponse.ProtoReflect.Descriptor instead. +func (*DeleteUserResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{11} +} + +// Request message for ListUserOrganizations RPC. +type ListUserOrganizationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent user. + // Format: `accounts/{account}/users/{user}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of memberships to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserOrganizationsRequest) Reset() { + *x = ListUserOrganizationsRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserOrganizationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserOrganizationsRequest) ProtoMessage() {} + +func (x *ListUserOrganizationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUserOrganizationsRequest.ProtoReflect.Descriptor instead. +func (*ListUserOrganizationsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{12} +} + +func (x *ListUserOrganizationsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListUserOrganizationsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListUserOrganizationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListUserOrganizations RPC. +type ListUserOrganizationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Organization memberships for this user + Memberships []*OrganizationMembership `protobuf:"bytes,1,rep,name=memberships,proto3" json:"memberships,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserOrganizationsResponse) Reset() { + *x = ListUserOrganizationsResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserOrganizationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserOrganizationsResponse) ProtoMessage() {} + +func (x *ListUserOrganizationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUserOrganizationsResponse.ProtoReflect.Descriptor instead. +func (*ListUserOrganizationsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{13} +} + +func (x *ListUserOrganizationsResponse) GetMemberships() []*OrganizationMembership { + if x != nil { + return x.Memberships + } + return nil +} + +func (x *ListUserOrganizationsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListUserOrganizationsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for AddUserToOrganization RPC. +type AddUserToOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent user. + // Format: `accounts/{account}/users/{user}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Required: The organization to add the user to. + // Format: `accounts/{account}/organizations/{organization}` + Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` + // Role for the membership: admin, member, viewer (default: "member") + Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddUserToOrganizationRequest) Reset() { + *x = AddUserToOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddUserToOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddUserToOrganizationRequest) ProtoMessage() {} + +func (x *AddUserToOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddUserToOrganizationRequest.ProtoReflect.Descriptor instead. +func (*AddUserToOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{14} +} + +func (x *AddUserToOrganizationRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *AddUserToOrganizationRequest) GetOrganization() string { + if x != nil { + return x.Organization + } + return "" +} + +func (x *AddUserToOrganizationRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +// Response message for AddUserToOrganization RPC. +type AddUserToOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Membership *OrganizationMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddUserToOrganizationResponse) Reset() { + *x = AddUserToOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddUserToOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddUserToOrganizationResponse) ProtoMessage() {} + +func (x *AddUserToOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddUserToOrganizationResponse.ProtoReflect.Descriptor instead. +func (*AddUserToOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{15} +} + +func (x *AddUserToOrganizationResponse) GetMembership() *OrganizationMembership { + if x != nil { + return x.Membership + } + return nil +} + +// Request message for UpdateUserOrganizationRole RPC. +type UpdateUserOrganizationRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Resource name of the membership. + // Format: `accounts/{account}/users/{user}/organizations/{organization}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Required: New role for the membership: admin, member, viewer + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateUserOrganizationRoleRequest) Reset() { + *x = UpdateUserOrganizationRoleRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateUserOrganizationRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserOrganizationRoleRequest) ProtoMessage() {} + +func (x *UpdateUserOrganizationRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserOrganizationRoleRequest.ProtoReflect.Descriptor instead. +func (*UpdateUserOrganizationRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{16} +} + +func (x *UpdateUserOrganizationRoleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateUserOrganizationRoleRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +// Response message for UpdateUserOrganizationRole RPC. +type UpdateUserOrganizationRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Membership *OrganizationMembership `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateUserOrganizationRoleResponse) Reset() { + *x = UpdateUserOrganizationRoleResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateUserOrganizationRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserOrganizationRoleResponse) ProtoMessage() {} + +func (x *UpdateUserOrganizationRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserOrganizationRoleResponse.ProtoReflect.Descriptor instead. +func (*UpdateUserOrganizationRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{17} +} + +func (x *UpdateUserOrganizationRoleResponse) GetMembership() *OrganizationMembership { + if x != nil { + return x.Membership + } + return nil +} + +// Request message for RemoveUserFromOrganization RPC. +type RemoveUserFromOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Resource name of the membership to remove. + // Format: `accounts/{account}/users/{user}/organizations/{organization}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveUserFromOrganizationRequest) Reset() { + *x = RemoveUserFromOrganizationRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveUserFromOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveUserFromOrganizationRequest) ProtoMessage() {} + +func (x *RemoveUserFromOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveUserFromOrganizationRequest.ProtoReflect.Descriptor instead. +func (*RemoveUserFromOrganizationRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{18} +} + +func (x *RemoveUserFromOrganizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RemoveUserFromOrganization RPC. +type RemoveUserFromOrganizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveUserFromOrganizationResponse) Reset() { + *x = RemoveUserFromOrganizationResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveUserFromOrganizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveUserFromOrganizationResponse) ProtoMessage() {} + +func (x *RemoveUserFromOrganizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveUserFromOrganizationResponse.ProtoReflect.Descriptor instead. +func (*RemoveUserFromOrganizationResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{19} +} + +// Request message for ListUserTeams RPC. +type ListUserTeamsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent user. + // Format: `accounts/{account}/users/{user}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of teams to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserTeamsRequest) Reset() { + *x = ListUserTeamsRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserTeamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserTeamsRequest) ProtoMessage() {} + +func (x *ListUserTeamsRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUserTeamsRequest.ProtoReflect.Descriptor instead. +func (*ListUserTeamsRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{20} +} + +func (x *ListUserTeamsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListUserTeamsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListUserTeamsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// Response message for ListUserTeams RPC. +type ListUserTeamsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Team memberships for this user + Memberships []*UserTeamMembership `protobuf:"bytes,1,rep,name=memberships,proto3" json:"memberships,omitempty"` + // Token for next page + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserTeamsResponse) Reset() { + *x = ListUserTeamsResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserTeamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserTeamsResponse) ProtoMessage() {} + +func (x *ListUserTeamsResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUserTeamsResponse.ProtoReflect.Descriptor instead. +func (*ListUserTeamsResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{21} +} + +func (x *ListUserTeamsResponse) GetMemberships() []*UserTeamMembership { + if x != nil { + return x.Memberships + } + return nil +} + +func (x *ListUserTeamsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListUserTeamsResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// UserTeamMembership represents a user's membership from the user's perspective. +// Includes team details for convenience. +type UserTeamMembership struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Reference to the team. + // Format: `accounts/{account}/organizations/{organization}/teams/{team}` + Team string `protobuf:"bytes,1,opt,name=team,proto3" json:"team,omitempty"` + // Team display name (for convenience) + TeamDisplayName string `protobuf:"bytes,2,opt,name=team_display_name,json=teamDisplayName,proto3" json:"team_display_name,omitempty"` + // User's role in the team + Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` + // When the user joined the team + JoinTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=join_time,json=joinTime,proto3" json:"join_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UserTeamMembership) Reset() { + *x = UserTeamMembership{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UserTeamMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserTeamMembership) ProtoMessage() {} + +func (x *UserTeamMembership) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserTeamMembership.ProtoReflect.Descriptor instead. +func (*UserTeamMembership) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{22} +} + +func (x *UserTeamMembership) GetTeam() string { + if x != nil { + return x.Team + } + return "" +} + +func (x *UserTeamMembership) GetTeamDisplayName() string { + if x != nil { + return x.TeamDisplayName + } + return "" +} + +func (x *UserTeamMembership) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +func (x *UserTeamMembership) GetJoinTime() *timestamppb.Timestamp { + if x != nil { + return x.JoinTime + } + return nil +} + +// Request message for GetPersonalTokenInfo RPC. +type GetPersonalTokenInfoRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the user. + // Format: `accounts/{account}/users/{user}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPersonalTokenInfoRequest) Reset() { + *x = GetPersonalTokenInfoRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPersonalTokenInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPersonalTokenInfoRequest) ProtoMessage() {} + +func (x *GetPersonalTokenInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPersonalTokenInfoRequest.ProtoReflect.Descriptor instead. +func (*GetPersonalTokenInfoRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{23} +} + +func (x *GetPersonalTokenInfoRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetPersonalTokenInfo RPC. +type GetPersonalTokenInfoResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Truncated token ID for display (e.g., "...abc12345") + // This is the last 8 characters of the JWT ID (jti claim). + TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + // When the token was last rotated. + LastRotatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_rotated_at,json=lastRotatedAt,proto3" json:"last_rotated_at,omitempty"` + // When the token expires and needs rotation. + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // Rotation period in days (admin-configurable). + RotationDays int32 `protobuf:"varint,4,opt,name=rotation_days,json=rotationDays,proto3" json:"rotation_days,omitempty"` + // Whether the token is currently enabled. + Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPersonalTokenInfoResponse) Reset() { + *x = GetPersonalTokenInfoResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPersonalTokenInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPersonalTokenInfoResponse) ProtoMessage() {} + +func (x *GetPersonalTokenInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPersonalTokenInfoResponse.ProtoReflect.Descriptor instead. +func (*GetPersonalTokenInfoResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{24} +} + +func (x *GetPersonalTokenInfoResponse) GetTokenId() string { + if x != nil { + return x.TokenId + } + return "" +} + +func (x *GetPersonalTokenInfoResponse) GetLastRotatedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastRotatedAt + } + return nil +} + +func (x *GetPersonalTokenInfoResponse) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *GetPersonalTokenInfoResponse) GetRotationDays() int32 { + if x != nil { + return x.RotationDays + } + return 0 +} + +func (x *GetPersonalTokenInfoResponse) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +// Request message for RotatePersonalToken RPC. +type RotatePersonalTokenRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the user. + // Format: `accounts/{account}/users/{user}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotatePersonalTokenRequest) Reset() { + *x = RotatePersonalTokenRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotatePersonalTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotatePersonalTokenRequest) ProtoMessage() {} + +func (x *RotatePersonalTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotatePersonalTokenRequest.ProtoReflect.Descriptor instead. +func (*RotatePersonalTokenRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{25} +} + +func (x *RotatePersonalTokenRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for RotatePersonalToken RPC. +type RotatePersonalTokenResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The new personal access token (JWT). + // This is shown only once. Store it securely. + // Use as: Authorization: Bearer + PersonalAccessToken string `protobuf:"bytes,1,opt,name=personal_access_token,json=personalAccessToken,proto3" json:"personal_access_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotatePersonalTokenResponse) Reset() { + *x = RotatePersonalTokenResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotatePersonalTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotatePersonalTokenResponse) ProtoMessage() {} + +func (x *RotatePersonalTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RotatePersonalTokenResponse.ProtoReflect.Descriptor instead. +func (*RotatePersonalTokenResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{26} +} + +func (x *RotatePersonalTokenResponse) GetPersonalAccessToken() string { + if x != nil { + return x.PersonalAccessToken + } + return "" +} + +// Request message for RevealPersonalToken RPC. +type RevealPersonalTokenRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the user. + // Format: `accounts/{account}/users/{user}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // User's password for re-authentication. + // Required to reveal the token for security. + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevealPersonalTokenRequest) Reset() { + *x = RevealPersonalTokenRequest{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevealPersonalTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevealPersonalTokenRequest) ProtoMessage() {} + +func (x *RevealPersonalTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevealPersonalTokenRequest.ProtoReflect.Descriptor instead. +func (*RevealPersonalTokenRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{27} +} + +func (x *RevealPersonalTokenRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RevealPersonalTokenRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +// Response message for RevealPersonalToken RPC. +type RevealPersonalTokenResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The full personal access token (JWT). + // Use as: Authorization: Bearer + PersonalAccessToken string `protobuf:"bytes,1,opt,name=personal_access_token,json=personalAccessToken,proto3" json:"personal_access_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevealPersonalTokenResponse) Reset() { + *x = RevealPersonalTokenResponse{} + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevealPersonalTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevealPersonalTokenResponse) ProtoMessage() {} + +func (x *RevealPersonalTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_user_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevealPersonalTokenResponse.ProtoReflect.Descriptor instead. +func (*RevealPersonalTokenResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP(), []int{28} +} + +func (x *RevealPersonalTokenResponse) GetPersonalAccessToken() string { + if x != nil { + return x.PersonalAccessToken + } + return "" +} + +var File_redpanda_api_aigateway_v1_user_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_user_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x06, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x60, + 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x6f, 0x69, + 0x64, 0x63, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x53, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, + 0x41, 0x01, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x41, 0xea, 0x41, 0x3e, 0x0a, 0x1b, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x7d, 0x22, 0xa8, 0x03, 0x0a, 0x16, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, + 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, + 0x0a, 0x19, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x17, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1f, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x19, 0x72, 0x17, 0x52, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x06, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x3a, 0x70, 0xea, 0x41, 0x6d, 0x0a, 0x2d, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x3c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x7d, 0x22, 0xcc, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x14, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x6f, 0x6c, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x37, 0x0a, 0x15, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x13, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, + 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0xdf, 0x01, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, + 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, + 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x91, 0x01, + 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, + 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, + 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x73, 0x6b, 0x22, 0x49, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x67, + 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x01, + 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, + 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, + 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbb, 0x01, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, + 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x1c, 0x41, 0x64, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, + 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, + 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x1b, 0x72, 0x19, + 0x52, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x06, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x00, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, + 0x72, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x51, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x22, 0xa3, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, + 0x2d, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x1f, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x19, 0x72, 0x17, 0x52, 0x05, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x76, 0x69, 0x65, + 0x77, 0x65, 0x72, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x77, 0x0a, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x51, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x22, 0x6e, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, 0x07, 0x28, 0x00, + 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaf, + 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x0b, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0xa1, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x61, 0x6d, 0x44, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x6a, + 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x56, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, + 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xf7, 0x01, 0x0a, + 0x1c, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x1a, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x56, 0x0a, + 0x1b, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x15, + 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, + 0x52, 0x13, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7d, 0x0a, 0x1a, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x50, + 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x56, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x13, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, + 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xaf, 0x12, 0x0a, + 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x96, 0x01, 0x0a, + 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, + 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, + 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, + 0x8d, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, + 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x9b, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x2c, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x90, 0x01, + 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1f, 0x2a, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xc1, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xc4, 0x01, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd3, 0x01, 0x0a, 0x1a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x3c, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, + 0x01, 0x2a, 0x32, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, + 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x7d, 0x12, 0xd0, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x2a, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa1, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x65, 0x61, 0x6d, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, + 0x2a, 0x7d, 0x2f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x12, 0xbd, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, + 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, + 0x61, 0x6c, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0xc1, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, + 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x33, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x2d, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x12, 0xc4, 0x01, 0x0a, + 0x13, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x70, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x72, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0xfe, + 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, + 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, + 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, + 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_user_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_user_proto_rawDescData = file_redpanda_api_aigateway_v1_user_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_user_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_user_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_user_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_user_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 30) +var file_redpanda_api_aigateway_v1_user_proto_goTypes = []any{ + (*User)(nil), // 0: redpanda.api.aigateway.v1.User + (*OrganizationMembership)(nil), // 1: redpanda.api.aigateway.v1.OrganizationMembership + (*CreateUserRequest)(nil), // 2: redpanda.api.aigateway.v1.CreateUserRequest + (*CreateUserResponse)(nil), // 3: redpanda.api.aigateway.v1.CreateUserResponse + (*GetUserRequest)(nil), // 4: redpanda.api.aigateway.v1.GetUserRequest + (*GetUserResponse)(nil), // 5: redpanda.api.aigateway.v1.GetUserResponse + (*ListUsersRequest)(nil), // 6: redpanda.api.aigateway.v1.ListUsersRequest + (*ListUsersResponse)(nil), // 7: redpanda.api.aigateway.v1.ListUsersResponse + (*UpdateUserRequest)(nil), // 8: redpanda.api.aigateway.v1.UpdateUserRequest + (*UpdateUserResponse)(nil), // 9: redpanda.api.aigateway.v1.UpdateUserResponse + (*DeleteUserRequest)(nil), // 10: redpanda.api.aigateway.v1.DeleteUserRequest + (*DeleteUserResponse)(nil), // 11: redpanda.api.aigateway.v1.DeleteUserResponse + (*ListUserOrganizationsRequest)(nil), // 12: redpanda.api.aigateway.v1.ListUserOrganizationsRequest + (*ListUserOrganizationsResponse)(nil), // 13: redpanda.api.aigateway.v1.ListUserOrganizationsResponse + (*AddUserToOrganizationRequest)(nil), // 14: redpanda.api.aigateway.v1.AddUserToOrganizationRequest + (*AddUserToOrganizationResponse)(nil), // 15: redpanda.api.aigateway.v1.AddUserToOrganizationResponse + (*UpdateUserOrganizationRoleRequest)(nil), // 16: redpanda.api.aigateway.v1.UpdateUserOrganizationRoleRequest + (*UpdateUserOrganizationRoleResponse)(nil), // 17: redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse + (*RemoveUserFromOrganizationRequest)(nil), // 18: redpanda.api.aigateway.v1.RemoveUserFromOrganizationRequest + (*RemoveUserFromOrganizationResponse)(nil), // 19: redpanda.api.aigateway.v1.RemoveUserFromOrganizationResponse + (*ListUserTeamsRequest)(nil), // 20: redpanda.api.aigateway.v1.ListUserTeamsRequest + (*ListUserTeamsResponse)(nil), // 21: redpanda.api.aigateway.v1.ListUserTeamsResponse + (*UserTeamMembership)(nil), // 22: redpanda.api.aigateway.v1.UserTeamMembership + (*GetPersonalTokenInfoRequest)(nil), // 23: redpanda.api.aigateway.v1.GetPersonalTokenInfoRequest + (*GetPersonalTokenInfoResponse)(nil), // 24: redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse + (*RotatePersonalTokenRequest)(nil), // 25: redpanda.api.aigateway.v1.RotatePersonalTokenRequest + (*RotatePersonalTokenResponse)(nil), // 26: redpanda.api.aigateway.v1.RotatePersonalTokenResponse + (*RevealPersonalTokenRequest)(nil), // 27: redpanda.api.aigateway.v1.RevealPersonalTokenRequest + (*RevealPersonalTokenResponse)(nil), // 28: redpanda.api.aigateway.v1.RevealPersonalTokenResponse + nil, // 29: redpanda.api.aigateway.v1.User.MetadataEntry + (*timestamppb.Timestamp)(nil), // 30: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 31: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_user_proto_depIdxs = []int32{ + 29, // 0: redpanda.api.aigateway.v1.User.metadata:type_name -> redpanda.api.aigateway.v1.User.MetadataEntry + 30, // 1: redpanda.api.aigateway.v1.User.create_time:type_name -> google.protobuf.Timestamp + 30, // 2: redpanda.api.aigateway.v1.User.update_time:type_name -> google.protobuf.Timestamp + 30, // 3: redpanda.api.aigateway.v1.User.last_login_time:type_name -> google.protobuf.Timestamp + 30, // 4: redpanda.api.aigateway.v1.OrganizationMembership.join_time:type_name -> google.protobuf.Timestamp + 0, // 5: redpanda.api.aigateway.v1.CreateUserRequest.user:type_name -> redpanda.api.aigateway.v1.User + 0, // 6: redpanda.api.aigateway.v1.CreateUserResponse.user:type_name -> redpanda.api.aigateway.v1.User + 0, // 7: redpanda.api.aigateway.v1.GetUserResponse.user:type_name -> redpanda.api.aigateway.v1.User + 0, // 8: redpanda.api.aigateway.v1.ListUsersResponse.users:type_name -> redpanda.api.aigateway.v1.User + 0, // 9: redpanda.api.aigateway.v1.UpdateUserRequest.user:type_name -> redpanda.api.aigateway.v1.User + 31, // 10: redpanda.api.aigateway.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 11: redpanda.api.aigateway.v1.UpdateUserResponse.user:type_name -> redpanda.api.aigateway.v1.User + 1, // 12: redpanda.api.aigateway.v1.ListUserOrganizationsResponse.memberships:type_name -> redpanda.api.aigateway.v1.OrganizationMembership + 1, // 13: redpanda.api.aigateway.v1.AddUserToOrganizationResponse.membership:type_name -> redpanda.api.aigateway.v1.OrganizationMembership + 1, // 14: redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse.membership:type_name -> redpanda.api.aigateway.v1.OrganizationMembership + 22, // 15: redpanda.api.aigateway.v1.ListUserTeamsResponse.memberships:type_name -> redpanda.api.aigateway.v1.UserTeamMembership + 30, // 16: redpanda.api.aigateway.v1.UserTeamMembership.join_time:type_name -> google.protobuf.Timestamp + 30, // 17: redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse.last_rotated_at:type_name -> google.protobuf.Timestamp + 30, // 18: redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse.expires_at:type_name -> google.protobuf.Timestamp + 2, // 19: redpanda.api.aigateway.v1.UserService.CreateUser:input_type -> redpanda.api.aigateway.v1.CreateUserRequest + 4, // 20: redpanda.api.aigateway.v1.UserService.GetUser:input_type -> redpanda.api.aigateway.v1.GetUserRequest + 6, // 21: redpanda.api.aigateway.v1.UserService.ListUsers:input_type -> redpanda.api.aigateway.v1.ListUsersRequest + 8, // 22: redpanda.api.aigateway.v1.UserService.UpdateUser:input_type -> redpanda.api.aigateway.v1.UpdateUserRequest + 10, // 23: redpanda.api.aigateway.v1.UserService.DeleteUser:input_type -> redpanda.api.aigateway.v1.DeleteUserRequest + 12, // 24: redpanda.api.aigateway.v1.UserService.ListUserOrganizations:input_type -> redpanda.api.aigateway.v1.ListUserOrganizationsRequest + 14, // 25: redpanda.api.aigateway.v1.UserService.AddUserToOrganization:input_type -> redpanda.api.aigateway.v1.AddUserToOrganizationRequest + 16, // 26: redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole:input_type -> redpanda.api.aigateway.v1.UpdateUserOrganizationRoleRequest + 18, // 27: redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization:input_type -> redpanda.api.aigateway.v1.RemoveUserFromOrganizationRequest + 20, // 28: redpanda.api.aigateway.v1.UserService.ListUserTeams:input_type -> redpanda.api.aigateway.v1.ListUserTeamsRequest + 23, // 29: redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo:input_type -> redpanda.api.aigateway.v1.GetPersonalTokenInfoRequest + 25, // 30: redpanda.api.aigateway.v1.UserService.RotatePersonalToken:input_type -> redpanda.api.aigateway.v1.RotatePersonalTokenRequest + 27, // 31: redpanda.api.aigateway.v1.UserService.RevealPersonalToken:input_type -> redpanda.api.aigateway.v1.RevealPersonalTokenRequest + 3, // 32: redpanda.api.aigateway.v1.UserService.CreateUser:output_type -> redpanda.api.aigateway.v1.CreateUserResponse + 5, // 33: redpanda.api.aigateway.v1.UserService.GetUser:output_type -> redpanda.api.aigateway.v1.GetUserResponse + 7, // 34: redpanda.api.aigateway.v1.UserService.ListUsers:output_type -> redpanda.api.aigateway.v1.ListUsersResponse + 9, // 35: redpanda.api.aigateway.v1.UserService.UpdateUser:output_type -> redpanda.api.aigateway.v1.UpdateUserResponse + 11, // 36: redpanda.api.aigateway.v1.UserService.DeleteUser:output_type -> redpanda.api.aigateway.v1.DeleteUserResponse + 13, // 37: redpanda.api.aigateway.v1.UserService.ListUserOrganizations:output_type -> redpanda.api.aigateway.v1.ListUserOrganizationsResponse + 15, // 38: redpanda.api.aigateway.v1.UserService.AddUserToOrganization:output_type -> redpanda.api.aigateway.v1.AddUserToOrganizationResponse + 17, // 39: redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole:output_type -> redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse + 19, // 40: redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization:output_type -> redpanda.api.aigateway.v1.RemoveUserFromOrganizationResponse + 21, // 41: redpanda.api.aigateway.v1.UserService.ListUserTeams:output_type -> redpanda.api.aigateway.v1.ListUserTeamsResponse + 24, // 42: redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo:output_type -> redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse + 26, // 43: redpanda.api.aigateway.v1.UserService.RotatePersonalToken:output_type -> redpanda.api.aigateway.v1.RotatePersonalTokenResponse + 28, // 44: redpanda.api.aigateway.v1.UserService.RevealPersonalToken:output_type -> redpanda.api.aigateway.v1.RevealPersonalTokenResponse + 32, // [32:45] is the sub-list for method output_type + 19, // [19:32] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_user_proto_init() } +func file_redpanda_api_aigateway_v1_user_proto_init() { + if File_redpanda_api_aigateway_v1_user_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_user_proto_rawDesc, + NumEnums: 0, + NumMessages: 30, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_user_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_user_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_user_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_user_proto = out.File + file_redpanda_api_aigateway_v1_user_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_user_proto_goTypes = nil + file_redpanda_api_aigateway_v1_user_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.gw.go new file mode 100644 index 0000000000..b7804dea8c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/user.pb.gw.go @@ -0,0 +1,1241 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/user.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_UserService_CreateUser_0 = &utilities.DoubleArray{Encoding: map[string]int{"user": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_UserService_CreateUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateUserRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.User); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_CreateUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_CreateUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateUserRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.User); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_CreateUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateUser(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetUser(ctx, &protoReq) + return msg, metadata, err +} + +var filter_UserService_ListUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_UserService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUsersRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUsersRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListUsers(ctx, &protoReq) + return msg, metadata, err +} + +var filter_UserService_UpdateUser_0 = &utilities.DoubleArray{Encoding: map[string]int{"user": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_UserService_UpdateUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateUserRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.User); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.User); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["user.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "user.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_UpdateUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_UpdateUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateUserRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.User); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.User); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["user.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "user.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_UpdateUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateUser(ctx, &protoReq) + return msg, metadata, err +} + +var filter_UserService_DeleteUser_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_UserService_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteUserRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_DeleteUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteUserRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_DeleteUser_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteUser(ctx, &protoReq) + return msg, metadata, err +} + +var filter_UserService_ListUserOrganizations_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_UserService_ListUserOrganizations_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUserOrganizationsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUserOrganizations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListUserOrganizations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_ListUserOrganizations_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUserOrganizationsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUserOrganizations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListUserOrganizations(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_AddUserToOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddUserToOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := client.AddUserToOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_AddUserToOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq AddUserToOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + msg, err := server.AddUserToOrganization(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_UpdateUserOrganizationRole_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateUserOrganizationRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.UpdateUserOrganizationRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_UpdateUserOrganizationRole_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateUserOrganizationRoleRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.UpdateUserOrganizationRole(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_RemoveUserFromOrganization_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveUserFromOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RemoveUserFromOrganization(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_RemoveUserFromOrganization_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RemoveUserFromOrganizationRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RemoveUserFromOrganization(ctx, &protoReq) + return msg, metadata, err +} + +var filter_UserService_ListUserTeams_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_UserService_ListUserTeams_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUserTeamsRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUserTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListUserTeams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_ListUserTeams_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListUserTeamsRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ListUserTeams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListUserTeams(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_GetPersonalTokenInfo_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPersonalTokenInfoRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetPersonalTokenInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_GetPersonalTokenInfo_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetPersonalTokenInfoRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetPersonalTokenInfo(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_RotatePersonalToken_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotatePersonalTokenRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RotatePersonalToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_RotatePersonalToken_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RotatePersonalTokenRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RotatePersonalToken(ctx, &protoReq) + return msg, metadata, err +} + +func request_UserService_RevealPersonalToken_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RevealPersonalTokenRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.RevealPersonalToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_UserService_RevealPersonalToken_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq RevealPersonalTokenRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.RevealPersonalToken(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux". +// UnaryRPC :call UserServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterUserServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server UserServiceServer) error { + mux.Handle(http.MethodPost, pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/users")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_CreateUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_GetUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUsers", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/users")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_ListUsers_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_UserService_UpdateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/UpdateUser", runtime.WithHTTPPathPattern("/v1/{user.name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_UpdateUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_DeleteUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUserOrganizations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUserOrganizations", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_ListUserOrganizations_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUserOrganizations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_AddUserToOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/AddUserToOrganization", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_AddUserToOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_AddUserToOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_UserService_UpdateUserOrganizationRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/UpdateUserOrganizationRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_UpdateUserOrganizationRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_UpdateUserOrganizationRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_UserService_RemoveUserFromOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RemoveUserFromOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_RemoveUserFromOrganization_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RemoveUserFromOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUserTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUserTeams", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_ListUserTeams_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUserTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_GetPersonalTokenInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/GetPersonalTokenInfo", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_GetPersonalTokenInfo_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_GetPersonalTokenInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_RotatePersonalToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RotatePersonalToken", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token:rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_RotatePersonalToken_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RotatePersonalToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_RevealPersonalToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RevealPersonalToken", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token:reveal")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_RevealPersonalToken_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RevealPersonalToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterUserServiceHandlerFromEndpoint is same as RegisterUserServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterUserServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterUserServiceHandler(ctx, mux, conn) +} + +// RegisterUserServiceHandler registers the http handlers for service UserService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterUserServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterUserServiceHandlerClient(ctx, mux, NewUserServiceClient(conn)) +} + +// RegisterUserServiceHandlerClient registers the http handlers for service UserService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "UserServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "UserServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "UserServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client UserServiceClient) error { + mux.Handle(http.MethodPost, pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/users")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_CreateUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_GetUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUsers", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*}/users")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_ListUsers_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_UserService_UpdateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/UpdateUser", runtime.WithHTTPPathPattern("/v1/{user.name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_UpdateUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_DeleteUser_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUserOrganizations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUserOrganizations", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_ListUserOrganizations_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUserOrganizations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_AddUserToOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/AddUserToOrganization", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/organizations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_AddUserToOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_AddUserToOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_UserService_UpdateUserOrganizationRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/UpdateUserOrganizationRole", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_UpdateUserOrganizationRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_UpdateUserOrganizationRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_UserService_RemoveUserFromOrganization_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RemoveUserFromOrganization", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*/organizations/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_RemoveUserFromOrganization_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RemoveUserFromOrganization_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListUserTeams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/ListUserTeams", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/users/*}/teams")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_ListUserTeams_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListUserTeams_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_GetPersonalTokenInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/GetPersonalTokenInfo", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_GetPersonalTokenInfo_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_GetPersonalTokenInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_RotatePersonalToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RotatePersonalToken", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token:rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_RotatePersonalToken_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RotatePersonalToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_RevealPersonalToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.UserService/RevealPersonalToken", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/users/*}/personal-token:reveal")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_UserService_RevealPersonalToken_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_RevealPersonalToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_UserService_CreateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "users"}, "")) + pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "users", "name"}, "")) + pattern_UserService_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "accounts", "parent", "users"}, "")) + pattern_UserService_UpdateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "users", "user.name"}, "")) + pattern_UserService_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "accounts", "users", "name"}, "")) + pattern_UserService_ListUserOrganizations_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "parent", "organizations"}, "")) + pattern_UserService_AddUserToOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "parent", "organizations"}, "")) + pattern_UserService_UpdateUserOrganizationRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "users", "organizations", "name"}, "")) + pattern_UserService_RemoveUserFromOrganization_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "users", "organizations", "name"}, "")) + pattern_UserService_ListUserTeams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "parent", "teams"}, "")) + pattern_UserService_GetPersonalTokenInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "name", "personal-token"}, "")) + pattern_UserService_RotatePersonalToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "name", "personal-token"}, "rotate")) + pattern_UserService_RevealPersonalToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "users", "name", "personal-token"}, "reveal")) +) + +var ( + forward_UserService_CreateUser_0 = runtime.ForwardResponseMessage + forward_UserService_GetUser_0 = runtime.ForwardResponseMessage + forward_UserService_ListUsers_0 = runtime.ForwardResponseMessage + forward_UserService_UpdateUser_0 = runtime.ForwardResponseMessage + forward_UserService_DeleteUser_0 = runtime.ForwardResponseMessage + forward_UserService_ListUserOrganizations_0 = runtime.ForwardResponseMessage + forward_UserService_AddUserToOrganization_0 = runtime.ForwardResponseMessage + forward_UserService_UpdateUserOrganizationRole_0 = runtime.ForwardResponseMessage + forward_UserService_RemoveUserFromOrganization_0 = runtime.ForwardResponseMessage + forward_UserService_ListUserTeams_0 = runtime.ForwardResponseMessage + forward_UserService_GetPersonalTokenInfo_0 = runtime.ForwardResponseMessage + forward_UserService_RotatePersonalToken_0 = runtime.ForwardResponseMessage + forward_UserService_RevealPersonalToken_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/user_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/user_grpc.pb.go new file mode 100644 index 0000000000..94186ead67 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/user_grpc.pb.go @@ -0,0 +1,620 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/user.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + UserService_CreateUser_FullMethodName = "/redpanda.api.aigateway.v1.UserService/CreateUser" + UserService_GetUser_FullMethodName = "/redpanda.api.aigateway.v1.UserService/GetUser" + UserService_ListUsers_FullMethodName = "/redpanda.api.aigateway.v1.UserService/ListUsers" + UserService_UpdateUser_FullMethodName = "/redpanda.api.aigateway.v1.UserService/UpdateUser" + UserService_DeleteUser_FullMethodName = "/redpanda.api.aigateway.v1.UserService/DeleteUser" + UserService_ListUserOrganizations_FullMethodName = "/redpanda.api.aigateway.v1.UserService/ListUserOrganizations" + UserService_AddUserToOrganization_FullMethodName = "/redpanda.api.aigateway.v1.UserService/AddUserToOrganization" + UserService_UpdateUserOrganizationRole_FullMethodName = "/redpanda.api.aigateway.v1.UserService/UpdateUserOrganizationRole" + UserService_RemoveUserFromOrganization_FullMethodName = "/redpanda.api.aigateway.v1.UserService/RemoveUserFromOrganization" + UserService_ListUserTeams_FullMethodName = "/redpanda.api.aigateway.v1.UserService/ListUserTeams" + UserService_GetPersonalTokenInfo_FullMethodName = "/redpanda.api.aigateway.v1.UserService/GetPersonalTokenInfo" + UserService_RotatePersonalToken_FullMethodName = "/redpanda.api.aigateway.v1.UserService/RotatePersonalToken" + UserService_RevealPersonalToken_FullMethodName = "/redpanda.api.aigateway.v1.UserService/RevealPersonalToken" +) + +// UserServiceClient is the client API for UserService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// UserService manages users within accounts. +// Users represent individual accounts that can authenticate and access resources. +// Users belong to accounts and have memberships in organizations. +// Resource name: accounts/{account_id}/users/{user_id} +type UserServiceClient interface { + // Creates a new user within an account. + CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) + // Gets a user by name. + GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) + // Lists users within an account. + ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error) + // Updates a user. + UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*UpdateUserResponse, error) + // Deletes a user. + DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*DeleteUserResponse, error) + // Lists organizations that a user belongs to. + ListUserOrganizations(ctx context.Context, in *ListUserOrganizationsRequest, opts ...grpc.CallOption) (*ListUserOrganizationsResponse, error) + // Adds a user to an organization. + AddUserToOrganization(ctx context.Context, in *AddUserToOrganizationRequest, opts ...grpc.CallOption) (*AddUserToOrganizationResponse, error) + // Updates a user's role in an organization. + UpdateUserOrganizationRole(ctx context.Context, in *UpdateUserOrganizationRoleRequest, opts ...grpc.CallOption) (*UpdateUserOrganizationRoleResponse, error) + // Removes a user from an organization. + RemoveUserFromOrganization(ctx context.Context, in *RemoveUserFromOrganizationRequest, opts ...grpc.CallOption) (*RemoveUserFromOrganizationResponse, error) + // Lists teams that a user belongs to. + ListUserTeams(ctx context.Context, in *ListUserTeamsRequest, opts ...grpc.CallOption) (*ListUserTeamsResponse, error) + // Gets information about a user's personal access token (non-secret info only). + GetPersonalTokenInfo(ctx context.Context, in *GetPersonalTokenInfoRequest, opts ...grpc.CallOption) (*GetPersonalTokenInfoResponse, error) + // Rotates a user's personal access token. + // The old token is invalidated and a new one is generated. + // The new token is returned only once and should be stored securely. + RotatePersonalToken(ctx context.Context, in *RotatePersonalTokenRequest, opts ...grpc.CallOption) (*RotatePersonalTokenResponse, error) + // Reveals the user's personal access token. + // Requires re-authentication with the user's password for security. + RevealPersonalToken(ctx context.Context, in *RevealPersonalTokenRequest, opts ...grpc.CallOption) (*RevealPersonalTokenResponse, error) +} + +type userServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient { + return &userServiceClient{cc} +} + +func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateUserResponse) + err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetUserResponse) + err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListUsersResponse) + err := c.cc.Invoke(ctx, UserService_ListUsers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*UpdateUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateUserResponse) + err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*DeleteUserResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteUserResponse) + err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ListUserOrganizations(ctx context.Context, in *ListUserOrganizationsRequest, opts ...grpc.CallOption) (*ListUserOrganizationsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListUserOrganizationsResponse) + err := c.cc.Invoke(ctx, UserService_ListUserOrganizations_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) AddUserToOrganization(ctx context.Context, in *AddUserToOrganizationRequest, opts ...grpc.CallOption) (*AddUserToOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AddUserToOrganizationResponse) + err := c.cc.Invoke(ctx, UserService_AddUserToOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) UpdateUserOrganizationRole(ctx context.Context, in *UpdateUserOrganizationRoleRequest, opts ...grpc.CallOption) (*UpdateUserOrganizationRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateUserOrganizationRoleResponse) + err := c.cc.Invoke(ctx, UserService_UpdateUserOrganizationRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) RemoveUserFromOrganization(ctx context.Context, in *RemoveUserFromOrganizationRequest, opts ...grpc.CallOption) (*RemoveUserFromOrganizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RemoveUserFromOrganizationResponse) + err := c.cc.Invoke(ctx, UserService_RemoveUserFromOrganization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ListUserTeams(ctx context.Context, in *ListUserTeamsRequest, opts ...grpc.CallOption) (*ListUserTeamsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListUserTeamsResponse) + err := c.cc.Invoke(ctx, UserService_ListUserTeams_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) GetPersonalTokenInfo(ctx context.Context, in *GetPersonalTokenInfoRequest, opts ...grpc.CallOption) (*GetPersonalTokenInfoResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetPersonalTokenInfoResponse) + err := c.cc.Invoke(ctx, UserService_GetPersonalTokenInfo_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) RotatePersonalToken(ctx context.Context, in *RotatePersonalTokenRequest, opts ...grpc.CallOption) (*RotatePersonalTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RotatePersonalTokenResponse) + err := c.cc.Invoke(ctx, UserService_RotatePersonalToken_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) RevealPersonalToken(ctx context.Context, in *RevealPersonalTokenRequest, opts ...grpc.CallOption) (*RevealPersonalTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RevealPersonalTokenResponse) + err := c.cc.Invoke(ctx, UserService_RevealPersonalToken_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UserServiceServer is the server API for UserService service. +// All implementations must embed UnimplementedUserServiceServer +// for forward compatibility. +// +// UserService manages users within accounts. +// Users represent individual accounts that can authenticate and access resources. +// Users belong to accounts and have memberships in organizations. +// Resource name: accounts/{account_id}/users/{user_id} +type UserServiceServer interface { + // Creates a new user within an account. + CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error) + // Gets a user by name. + GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) + // Lists users within an account. + ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error) + // Updates a user. + UpdateUser(context.Context, *UpdateUserRequest) (*UpdateUserResponse, error) + // Deletes a user. + DeleteUser(context.Context, *DeleteUserRequest) (*DeleteUserResponse, error) + // Lists organizations that a user belongs to. + ListUserOrganizations(context.Context, *ListUserOrganizationsRequest) (*ListUserOrganizationsResponse, error) + // Adds a user to an organization. + AddUserToOrganization(context.Context, *AddUserToOrganizationRequest) (*AddUserToOrganizationResponse, error) + // Updates a user's role in an organization. + UpdateUserOrganizationRole(context.Context, *UpdateUserOrganizationRoleRequest) (*UpdateUserOrganizationRoleResponse, error) + // Removes a user from an organization. + RemoveUserFromOrganization(context.Context, *RemoveUserFromOrganizationRequest) (*RemoveUserFromOrganizationResponse, error) + // Lists teams that a user belongs to. + ListUserTeams(context.Context, *ListUserTeamsRequest) (*ListUserTeamsResponse, error) + // Gets information about a user's personal access token (non-secret info only). + GetPersonalTokenInfo(context.Context, *GetPersonalTokenInfoRequest) (*GetPersonalTokenInfoResponse, error) + // Rotates a user's personal access token. + // The old token is invalidated and a new one is generated. + // The new token is returned only once and should be stored securely. + RotatePersonalToken(context.Context, *RotatePersonalTokenRequest) (*RotatePersonalTokenResponse, error) + // Reveals the user's personal access token. + // Requires re-authentication with the user's password for security. + RevealPersonalToken(context.Context, *RevealPersonalTokenRequest) (*RevealPersonalTokenResponse, error) + mustEmbedUnimplementedUserServiceServer() +} + +// UnimplementedUserServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedUserServiceServer struct{} + +func (UnimplementedUserServiceServer) CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") +} +func (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") +} +func (UnimplementedUserServiceServer) ListUsers(context.Context, *ListUsersRequest) (*ListUsersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") +} +func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserRequest) (*UpdateUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") +} +func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteUserRequest) (*DeleteUserResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") +} +func (UnimplementedUserServiceServer) ListUserOrganizations(context.Context, *ListUserOrganizationsRequest) (*ListUserOrganizationsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUserOrganizations not implemented") +} +func (UnimplementedUserServiceServer) AddUserToOrganization(context.Context, *AddUserToOrganizationRequest) (*AddUserToOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddUserToOrganization not implemented") +} +func (UnimplementedUserServiceServer) UpdateUserOrganizationRole(context.Context, *UpdateUserOrganizationRoleRequest) (*UpdateUserOrganizationRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUserOrganizationRole not implemented") +} +func (UnimplementedUserServiceServer) RemoveUserFromOrganization(context.Context, *RemoveUserFromOrganizationRequest) (*RemoveUserFromOrganizationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveUserFromOrganization not implemented") +} +func (UnimplementedUserServiceServer) ListUserTeams(context.Context, *ListUserTeamsRequest) (*ListUserTeamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUserTeams not implemented") +} +func (UnimplementedUserServiceServer) GetPersonalTokenInfo(context.Context, *GetPersonalTokenInfoRequest) (*GetPersonalTokenInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPersonalTokenInfo not implemented") +} +func (UnimplementedUserServiceServer) RotatePersonalToken(context.Context, *RotatePersonalTokenRequest) (*RotatePersonalTokenResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotatePersonalToken not implemented") +} +func (UnimplementedUserServiceServer) RevealPersonalToken(context.Context, *RevealPersonalTokenRequest) (*RevealPersonalTokenResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevealPersonalToken not implemented") +} +func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} +func (UnimplementedUserServiceServer) testEmbeddedByValue() {} + +// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to UserServiceServer will +// result in compilation errors. +type UnsafeUserServiceServer interface { + mustEmbedUnimplementedUserServiceServer() +} + +func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) { + // If the following call pancis, it indicates UnimplementedUserServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&UserService_ServiceDesc, srv) +} + +func _UserService_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).CreateUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_CreateUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).CreateUser(ctx, req.(*CreateUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).GetUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_GetUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ListUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUsersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_ListUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUsers(ctx, req.(*ListUsersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).UpdateUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_UpdateUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteUserRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).DeleteUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_DeleteUser_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteUserRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ListUserOrganizations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUserOrganizationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUserOrganizations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_ListUserOrganizations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUserOrganizations(ctx, req.(*ListUserOrganizationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_AddUserToOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddUserToOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).AddUserToOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_AddUserToOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).AddUserToOrganization(ctx, req.(*AddUserToOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_UpdateUserOrganizationRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateUserOrganizationRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).UpdateUserOrganizationRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_UpdateUserOrganizationRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).UpdateUserOrganizationRole(ctx, req.(*UpdateUserOrganizationRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_RemoveUserFromOrganization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveUserFromOrganizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).RemoveUserFromOrganization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_RemoveUserFromOrganization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).RemoveUserFromOrganization(ctx, req.(*RemoveUserFromOrganizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ListUserTeams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUserTeamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUserTeams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_ListUserTeams_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUserTeams(ctx, req.(*ListUserTeamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_GetPersonalTokenInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPersonalTokenInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).GetPersonalTokenInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_GetPersonalTokenInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).GetPersonalTokenInfo(ctx, req.(*GetPersonalTokenInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_RotatePersonalToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RotatePersonalTokenRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).RotatePersonalToken(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_RotatePersonalToken_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).RotatePersonalToken(ctx, req.(*RotatePersonalTokenRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_RevealPersonalToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RevealPersonalTokenRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).RevealPersonalToken(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_RevealPersonalToken_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).RevealPersonalToken(ctx, req.(*RevealPersonalTokenRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var UserService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.UserService", + HandlerType: (*UserServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateUser", + Handler: _UserService_CreateUser_Handler, + }, + { + MethodName: "GetUser", + Handler: _UserService_GetUser_Handler, + }, + { + MethodName: "ListUsers", + Handler: _UserService_ListUsers_Handler, + }, + { + MethodName: "UpdateUser", + Handler: _UserService_UpdateUser_Handler, + }, + { + MethodName: "DeleteUser", + Handler: _UserService_DeleteUser_Handler, + }, + { + MethodName: "ListUserOrganizations", + Handler: _UserService_ListUserOrganizations_Handler, + }, + { + MethodName: "AddUserToOrganization", + Handler: _UserService_AddUserToOrganization_Handler, + }, + { + MethodName: "UpdateUserOrganizationRole", + Handler: _UserService_UpdateUserOrganizationRole_Handler, + }, + { + MethodName: "RemoveUserFromOrganization", + Handler: _UserService_RemoveUserFromOrganization_Handler, + }, + { + MethodName: "ListUserTeams", + Handler: _UserService_ListUserTeams_Handler, + }, + { + MethodName: "GetPersonalTokenInfo", + Handler: _UserService_GetPersonalTokenInfo_Handler, + }, + { + MethodName: "RotatePersonalToken", + Handler: _UserService_RotatePersonalToken_Handler, + }, + { + MethodName: "RevealPersonalToken", + Handler: _UserService_RevealPersonalToken_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/user.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.go new file mode 100644 index 0000000000..8c2d3a439d --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.go @@ -0,0 +1,735 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/visual_metadata.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Request message for GetVisualMetadata RPC. +type GetVisualMetadataRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Gateway name (e.g., "my-gateway") + GatewayName string `protobuf:"bytes,1,opt,name=gateway_name,json=gatewayName,proto3" json:"gateway_name,omitempty"` + // Optional: User ID for user-specific layout. + // If not provided, returns the shared/default layout. + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetVisualMetadataRequest) Reset() { + *x = GetVisualMetadataRequest{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetVisualMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVisualMetadataRequest) ProtoMessage() {} + +func (x *GetVisualMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVisualMetadataRequest.ProtoReflect.Descriptor instead. +func (*GetVisualMetadataRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{0} +} + +func (x *GetVisualMetadataRequest) GetGatewayName() string { + if x != nil { + return x.GatewayName + } + return "" +} + +func (x *GetVisualMetadataRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +// Response message for GetVisualMetadata RPC. +type GetVisualMetadataResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The visual metadata, or null if none exists. + VisualMetadata *VisualMetadata `protobuf:"bytes,1,opt,name=visual_metadata,json=visualMetadata,proto3" json:"visual_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetVisualMetadataResponse) Reset() { + *x = GetVisualMetadataResponse{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetVisualMetadataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVisualMetadataResponse) ProtoMessage() {} + +func (x *GetVisualMetadataResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVisualMetadataResponse.ProtoReflect.Descriptor instead. +func (*GetVisualMetadataResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{1} +} + +func (x *GetVisualMetadataResponse) GetVisualMetadata() *VisualMetadata { + if x != nil { + return x.VisualMetadata + } + return nil +} + +// Request message for SaveVisualMetadata RPC. +type SaveVisualMetadataRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Gateway name (e.g., "my-gateway") + GatewayName string `protobuf:"bytes,1,opt,name=gateway_name,json=gatewayName,proto3" json:"gateway_name,omitempty"` + // Optional: User ID for user-specific layout. + // If not provided, saves as shared/default layout. + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Required: Node positions as JSON object mapping node IDs to {x, y}. + // Example: {"rate-limit-default": {"x": 100, "y": 200}} + NodePositions *structpb.Struct `protobuf:"bytes,3,opt,name=node_positions,json=nodePositions,proto3" json:"node_positions,omitempty"` + // Required: Viewport state with x, y offset and zoom level. + Viewport *Viewport `protobuf:"bytes,4,opt,name=viewport,proto3" json:"viewport,omitempty"` + // Optional: Additional UI settings (minimap visible, etc.) + UiSettings *structpb.Struct `protobuf:"bytes,5,opt,name=ui_settings,json=uiSettings,proto3" json:"ui_settings,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveVisualMetadataRequest) Reset() { + *x = SaveVisualMetadataRequest{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveVisualMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveVisualMetadataRequest) ProtoMessage() {} + +func (x *SaveVisualMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SaveVisualMetadataRequest.ProtoReflect.Descriptor instead. +func (*SaveVisualMetadataRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{2} +} + +func (x *SaveVisualMetadataRequest) GetGatewayName() string { + if x != nil { + return x.GatewayName + } + return "" +} + +func (x *SaveVisualMetadataRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *SaveVisualMetadataRequest) GetNodePositions() *structpb.Struct { + if x != nil { + return x.NodePositions + } + return nil +} + +func (x *SaveVisualMetadataRequest) GetViewport() *Viewport { + if x != nil { + return x.Viewport + } + return nil +} + +func (x *SaveVisualMetadataRequest) GetUiSettings() *structpb.Struct { + if x != nil { + return x.UiSettings + } + return nil +} + +// Response message for SaveVisualMetadata RPC. +type SaveVisualMetadataResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + VisualMetadata *VisualMetadata `protobuf:"bytes,1,opt,name=visual_metadata,json=visualMetadata,proto3" json:"visual_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveVisualMetadataResponse) Reset() { + *x = SaveVisualMetadataResponse{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveVisualMetadataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveVisualMetadataResponse) ProtoMessage() {} + +func (x *SaveVisualMetadataResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SaveVisualMetadataResponse.ProtoReflect.Descriptor instead. +func (*SaveVisualMetadataResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{3} +} + +func (x *SaveVisualMetadataResponse) GetVisualMetadata() *VisualMetadata { + if x != nil { + return x.VisualMetadata + } + return nil +} + +// Request message for DeleteVisualMetadata RPC. +type DeleteVisualMetadataRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Gateway name (e.g., "my-gateway") + GatewayName string `protobuf:"bytes,1,opt,name=gateway_name,json=gatewayName,proto3" json:"gateway_name,omitempty"` + // Optional: User ID for user-specific layout. + // If not provided, deletes the shared/default layout. + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteVisualMetadataRequest) Reset() { + *x = DeleteVisualMetadataRequest{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteVisualMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteVisualMetadataRequest) ProtoMessage() {} + +func (x *DeleteVisualMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteVisualMetadataRequest.ProtoReflect.Descriptor instead. +func (*DeleteVisualMetadataRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{4} +} + +func (x *DeleteVisualMetadataRequest) GetGatewayName() string { + if x != nil { + return x.GatewayName + } + return "" +} + +func (x *DeleteVisualMetadataRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +// Response message for DeleteVisualMetadata RPC. +type DeleteVisualMetadataResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteVisualMetadataResponse) Reset() { + *x = DeleteVisualMetadataResponse{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteVisualMetadataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteVisualMetadataResponse) ProtoMessage() {} + +func (x *DeleteVisualMetadataResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteVisualMetadataResponse.ProtoReflect.Descriptor instead. +func (*DeleteVisualMetadataResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{5} +} + +// VisualMetadata represents the visual editor state for a gateway. +type VisualMetadata struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Gateway name this metadata belongs to. + GatewayName string `protobuf:"bytes,1,opt,name=gateway_name,json=gatewayName,proto3" json:"gateway_name,omitempty"` + // User ID if this is a user-specific layout, empty for shared layout. + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Node positions as JSON object mapping node IDs to {x, y} coordinates. + NodePositions *structpb.Struct `protobuf:"bytes,3,opt,name=node_positions,json=nodePositions,proto3" json:"node_positions,omitempty"` + // Viewport state. + Viewport *Viewport `protobuf:"bytes,4,opt,name=viewport,proto3" json:"viewport,omitempty"` + // Additional UI settings. + UiSettings *structpb.Struct `protobuf:"bytes,5,opt,name=ui_settings,json=uiSettings,proto3" json:"ui_settings,omitempty"` + // Timestamps. + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VisualMetadata) Reset() { + *x = VisualMetadata{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VisualMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VisualMetadata) ProtoMessage() {} + +func (x *VisualMetadata) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VisualMetadata.ProtoReflect.Descriptor instead. +func (*VisualMetadata) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{6} +} + +func (x *VisualMetadata) GetGatewayName() string { + if x != nil { + return x.GatewayName + } + return "" +} + +func (x *VisualMetadata) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *VisualMetadata) GetNodePositions() *structpb.Struct { + if x != nil { + return x.NodePositions + } + return nil +} + +func (x *VisualMetadata) GetViewport() *Viewport { + if x != nil { + return x.Viewport + } + return nil +} + +func (x *VisualMetadata) GetUiSettings() *structpb.Struct { + if x != nil { + return x.UiSettings + } + return nil +} + +func (x *VisualMetadata) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *VisualMetadata) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +// Viewport represents the visual editor viewport state. +type Viewport struct { + state protoimpl.MessageState `protogen:"open.v1"` + // X offset of the viewport. + X float64 `protobuf:"fixed64,1,opt,name=x,proto3" json:"x,omitempty"` + // Y offset of the viewport. + Y float64 `protobuf:"fixed64,2,opt,name=y,proto3" json:"y,omitempty"` + // Zoom level (1.0 = 100%). + Zoom float64 `protobuf:"fixed64,3,opt,name=zoom,proto3" json:"zoom,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Viewport) Reset() { + *x = Viewport{} + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Viewport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Viewport) ProtoMessage() {} + +func (x *Viewport) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Viewport.ProtoReflect.Descriptor instead. +func (*Viewport) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP(), []int{7} +} + +func (x *Viewport) GetX() float64 { + if x != nil { + return x.X + } + return 0 +} + +func (x *Viewport) GetY() float64 { + if x != nil { + return x.Y + } + return 0 +} + +func (x *Viewport) GetZoom() float64 { + if x != nil { + return x.Zoom + } + return 0 +} + +var File_redpanda_api_aigateway_v1_visual_metadata_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDesc = []byte{ + 0x0a, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x69, 0x73, 0x75, + 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x5b, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x26, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, + 0x0f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x0e, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0xa1, 0x02, 0x0a, 0x19, 0x53, 0x61, 0x76, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x26, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x75, + 0x69, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x75, 0x69, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x70, 0x0a, 0x1a, 0x53, 0x61, 0x76, 0x65, 0x56, 0x69, 0x73, + 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x02, 0x0a, 0x0e, 0x56, 0x69, 0x73, 0x75, + 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x08, 0x76, + 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x75, 0x69, 0x5f, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x75, 0x69, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x56, 0x69, 0x65, 0x77, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x01, + 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x01, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x7a, + 0x6f, 0x6f, 0x6d, 0x32, 0xe3, 0x04, 0x0a, 0x15, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb3, 0x01, + 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0xb9, 0x01, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x56, 0x69, 0x73, 0x75, + 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, + 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, + 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, + 0x01, 0x2a, 0x1a, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, + 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2d, 0x2a, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, + 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x76, + 0x69, 0x73, 0x75, 0x61, 0x6c, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x19, + 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x88, 0x02, 0x0a, 0x1d, 0x63, 0x6f, + 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x56, 0x69, 0x73, + 0x75, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x76, + 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, + 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescData = file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_redpanda_api_aigateway_v1_visual_metadata_proto_goTypes = []any{ + (*GetVisualMetadataRequest)(nil), // 0: redpanda.api.aigateway.v1.GetVisualMetadataRequest + (*GetVisualMetadataResponse)(nil), // 1: redpanda.api.aigateway.v1.GetVisualMetadataResponse + (*SaveVisualMetadataRequest)(nil), // 2: redpanda.api.aigateway.v1.SaveVisualMetadataRequest + (*SaveVisualMetadataResponse)(nil), // 3: redpanda.api.aigateway.v1.SaveVisualMetadataResponse + (*DeleteVisualMetadataRequest)(nil), // 4: redpanda.api.aigateway.v1.DeleteVisualMetadataRequest + (*DeleteVisualMetadataResponse)(nil), // 5: redpanda.api.aigateway.v1.DeleteVisualMetadataResponse + (*VisualMetadata)(nil), // 6: redpanda.api.aigateway.v1.VisualMetadata + (*Viewport)(nil), // 7: redpanda.api.aigateway.v1.Viewport + (*structpb.Struct)(nil), // 8: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp +} +var file_redpanda_api_aigateway_v1_visual_metadata_proto_depIdxs = []int32{ + 6, // 0: redpanda.api.aigateway.v1.GetVisualMetadataResponse.visual_metadata:type_name -> redpanda.api.aigateway.v1.VisualMetadata + 8, // 1: redpanda.api.aigateway.v1.SaveVisualMetadataRequest.node_positions:type_name -> google.protobuf.Struct + 7, // 2: redpanda.api.aigateway.v1.SaveVisualMetadataRequest.viewport:type_name -> redpanda.api.aigateway.v1.Viewport + 8, // 3: redpanda.api.aigateway.v1.SaveVisualMetadataRequest.ui_settings:type_name -> google.protobuf.Struct + 6, // 4: redpanda.api.aigateway.v1.SaveVisualMetadataResponse.visual_metadata:type_name -> redpanda.api.aigateway.v1.VisualMetadata + 8, // 5: redpanda.api.aigateway.v1.VisualMetadata.node_positions:type_name -> google.protobuf.Struct + 7, // 6: redpanda.api.aigateway.v1.VisualMetadata.viewport:type_name -> redpanda.api.aigateway.v1.Viewport + 8, // 7: redpanda.api.aigateway.v1.VisualMetadata.ui_settings:type_name -> google.protobuf.Struct + 9, // 8: redpanda.api.aigateway.v1.VisualMetadata.created_at:type_name -> google.protobuf.Timestamp + 9, // 9: redpanda.api.aigateway.v1.VisualMetadata.updated_at:type_name -> google.protobuf.Timestamp + 0, // 10: redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata:input_type -> redpanda.api.aigateway.v1.GetVisualMetadataRequest + 2, // 11: redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata:input_type -> redpanda.api.aigateway.v1.SaveVisualMetadataRequest + 4, // 12: redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata:input_type -> redpanda.api.aigateway.v1.DeleteVisualMetadataRequest + 1, // 13: redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata:output_type -> redpanda.api.aigateway.v1.GetVisualMetadataResponse + 3, // 14: redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata:output_type -> redpanda.api.aigateway.v1.SaveVisualMetadataResponse + 5, // 15: redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata:output_type -> redpanda.api.aigateway.v1.DeleteVisualMetadataResponse + 13, // [13:16] is the sub-list for method output_type + 10, // [10:13] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_visual_metadata_proto_init() } +func file_redpanda_api_aigateway_v1_visual_metadata_proto_init() { + if File_redpanda_api_aigateway_v1_visual_metadata_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_visual_metadata_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_visual_metadata_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_visual_metadata_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_visual_metadata_proto = out.File + file_redpanda_api_aigateway_v1_visual_metadata_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_visual_metadata_proto_goTypes = nil + file_redpanda_api_aigateway_v1_visual_metadata_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.gw.go new file mode 100644 index 0000000000..9bd24ccd69 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata.pb.gw.go @@ -0,0 +1,359 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/visual_metadata.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_VisualMetadataService_GetVisualMetadata_0 = &utilities.DoubleArray{Encoding: map[string]int{"gateway_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_VisualMetadataService_GetVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, client VisualMetadataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_VisualMetadataService_GetVisualMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetVisualMetadata(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_VisualMetadataService_GetVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, server VisualMetadataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_VisualMetadataService_GetVisualMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetVisualMetadata(ctx, &protoReq) + return msg, metadata, err +} + +func request_VisualMetadataService_SaveVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, client VisualMetadataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SaveVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + msg, err := client.SaveVisualMetadata(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_VisualMetadataService_SaveVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, server VisualMetadataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SaveVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + msg, err := server.SaveVisualMetadata(ctx, &protoReq) + return msg, metadata, err +} + +var filter_VisualMetadataService_DeleteVisualMetadata_0 = &utilities.DoubleArray{Encoding: map[string]int{"gateway_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_VisualMetadataService_DeleteVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, client VisualMetadataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_VisualMetadataService_DeleteVisualMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteVisualMetadata(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_VisualMetadataService_DeleteVisualMetadata_0(ctx context.Context, marshaler runtime.Marshaler, server VisualMetadataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteVisualMetadataRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["gateway_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gateway_name") + } + protoReq.GatewayName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gateway_name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_VisualMetadataService_DeleteVisualMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteVisualMetadata(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterVisualMetadataServiceHandlerServer registers the http handlers for service VisualMetadataService to "mux". +// UnaryRPC :call VisualMetadataServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterVisualMetadataServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterVisualMetadataServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server VisualMetadataServiceServer) error { + mux.Handle(http.MethodGet, pattern_VisualMetadataService_GetVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/GetVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_VisualMetadataService_GetVisualMetadata_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_GetVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_VisualMetadataService_SaveVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/SaveVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_VisualMetadataService_SaveVisualMetadata_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_SaveVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_VisualMetadataService_DeleteVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/DeleteVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_VisualMetadataService_DeleteVisualMetadata_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_DeleteVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterVisualMetadataServiceHandlerFromEndpoint is same as RegisterVisualMetadataServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterVisualMetadataServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterVisualMetadataServiceHandler(ctx, mux, conn) +} + +// RegisterVisualMetadataServiceHandler registers the http handlers for service VisualMetadataService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterVisualMetadataServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterVisualMetadataServiceHandlerClient(ctx, mux, NewVisualMetadataServiceClient(conn)) +} + +// RegisterVisualMetadataServiceHandlerClient registers the http handlers for service VisualMetadataService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "VisualMetadataServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "VisualMetadataServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "VisualMetadataServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterVisualMetadataServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client VisualMetadataServiceClient) error { + mux.Handle(http.MethodGet, pattern_VisualMetadataService_GetVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/GetVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_VisualMetadataService_GetVisualMetadata_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_GetVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPut, pattern_VisualMetadataService_SaveVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/SaveVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_VisualMetadataService_SaveVisualMetadata_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_SaveVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_VisualMetadataService_DeleteVisualMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.VisualMetadataService/DeleteVisualMetadata", runtime.WithHTTPPathPattern("/v1/gateways/{gateway_name}/visual-metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_VisualMetadataService_DeleteVisualMetadata_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_VisualMetadataService_DeleteVisualMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_VisualMetadataService_GetVisualMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1", "gateways", "gateway_name", "visual-metadata"}, "")) + pattern_VisualMetadataService_SaveVisualMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1", "gateways", "gateway_name", "visual-metadata"}, "")) + pattern_VisualMetadataService_DeleteVisualMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1", "gateways", "gateway_name", "visual-metadata"}, "")) +) + +var ( + forward_VisualMetadataService_GetVisualMetadata_0 = runtime.ForwardResponseMessage + forward_VisualMetadataService_SaveVisualMetadata_0 = runtime.ForwardResponseMessage + forward_VisualMetadataService_DeleteVisualMetadata_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata_grpc.pb.go new file mode 100644 index 0000000000..4be2351252 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/visual_metadata_grpc.pb.go @@ -0,0 +1,214 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/visual_metadata.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + VisualMetadataService_GetVisualMetadata_FullMethodName = "/redpanda.api.aigateway.v1.VisualMetadataService/GetVisualMetadata" + VisualMetadataService_SaveVisualMetadata_FullMethodName = "/redpanda.api.aigateway.v1.VisualMetadataService/SaveVisualMetadata" + VisualMetadataService_DeleteVisualMetadata_FullMethodName = "/redpanda.api.aigateway.v1.VisualMetadataService/DeleteVisualMetadata" +) + +// VisualMetadataServiceClient is the client API for VisualMetadataService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// VisualMetadataService manages UI-specific visual editor state. +// This is purely a UI concern and is kept separate from gateway configuration. +// Stores node positions, viewport state, and UI preferences for the visual editor. +type VisualMetadataServiceClient interface { + // Gets visual metadata for a gateway (optionally for a specific user). + GetVisualMetadata(ctx context.Context, in *GetVisualMetadataRequest, opts ...grpc.CallOption) (*GetVisualMetadataResponse, error) + // Creates or updates visual metadata for a gateway. + // Uses upsert semantics - creates if not exists, updates if exists. + SaveVisualMetadata(ctx context.Context, in *SaveVisualMetadataRequest, opts ...grpc.CallOption) (*SaveVisualMetadataResponse, error) + // Deletes visual metadata for a gateway. + DeleteVisualMetadata(ctx context.Context, in *DeleteVisualMetadataRequest, opts ...grpc.CallOption) (*DeleteVisualMetadataResponse, error) +} + +type visualMetadataServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewVisualMetadataServiceClient(cc grpc.ClientConnInterface) VisualMetadataServiceClient { + return &visualMetadataServiceClient{cc} +} + +func (c *visualMetadataServiceClient) GetVisualMetadata(ctx context.Context, in *GetVisualMetadataRequest, opts ...grpc.CallOption) (*GetVisualMetadataResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetVisualMetadataResponse) + err := c.cc.Invoke(ctx, VisualMetadataService_GetVisualMetadata_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *visualMetadataServiceClient) SaveVisualMetadata(ctx context.Context, in *SaveVisualMetadataRequest, opts ...grpc.CallOption) (*SaveVisualMetadataResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SaveVisualMetadataResponse) + err := c.cc.Invoke(ctx, VisualMetadataService_SaveVisualMetadata_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *visualMetadataServiceClient) DeleteVisualMetadata(ctx context.Context, in *DeleteVisualMetadataRequest, opts ...grpc.CallOption) (*DeleteVisualMetadataResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteVisualMetadataResponse) + err := c.cc.Invoke(ctx, VisualMetadataService_DeleteVisualMetadata_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// VisualMetadataServiceServer is the server API for VisualMetadataService service. +// All implementations must embed UnimplementedVisualMetadataServiceServer +// for forward compatibility. +// +// VisualMetadataService manages UI-specific visual editor state. +// This is purely a UI concern and is kept separate from gateway configuration. +// Stores node positions, viewport state, and UI preferences for the visual editor. +type VisualMetadataServiceServer interface { + // Gets visual metadata for a gateway (optionally for a specific user). + GetVisualMetadata(context.Context, *GetVisualMetadataRequest) (*GetVisualMetadataResponse, error) + // Creates or updates visual metadata for a gateway. + // Uses upsert semantics - creates if not exists, updates if exists. + SaveVisualMetadata(context.Context, *SaveVisualMetadataRequest) (*SaveVisualMetadataResponse, error) + // Deletes visual metadata for a gateway. + DeleteVisualMetadata(context.Context, *DeleteVisualMetadataRequest) (*DeleteVisualMetadataResponse, error) + mustEmbedUnimplementedVisualMetadataServiceServer() +} + +// UnimplementedVisualMetadataServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedVisualMetadataServiceServer struct{} + +func (UnimplementedVisualMetadataServiceServer) GetVisualMetadata(context.Context, *GetVisualMetadataRequest) (*GetVisualMetadataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVisualMetadata not implemented") +} +func (UnimplementedVisualMetadataServiceServer) SaveVisualMetadata(context.Context, *SaveVisualMetadataRequest) (*SaveVisualMetadataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SaveVisualMetadata not implemented") +} +func (UnimplementedVisualMetadataServiceServer) DeleteVisualMetadata(context.Context, *DeleteVisualMetadataRequest) (*DeleteVisualMetadataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteVisualMetadata not implemented") +} +func (UnimplementedVisualMetadataServiceServer) mustEmbedUnimplementedVisualMetadataServiceServer() {} +func (UnimplementedVisualMetadataServiceServer) testEmbeddedByValue() {} + +// UnsafeVisualMetadataServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to VisualMetadataServiceServer will +// result in compilation errors. +type UnsafeVisualMetadataServiceServer interface { + mustEmbedUnimplementedVisualMetadataServiceServer() +} + +func RegisterVisualMetadataServiceServer(s grpc.ServiceRegistrar, srv VisualMetadataServiceServer) { + // If the following call pancis, it indicates UnimplementedVisualMetadataServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&VisualMetadataService_ServiceDesc, srv) +} + +func _VisualMetadataService_GetVisualMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetVisualMetadataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VisualMetadataServiceServer).GetVisualMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: VisualMetadataService_GetVisualMetadata_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VisualMetadataServiceServer).GetVisualMetadata(ctx, req.(*GetVisualMetadataRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VisualMetadataService_SaveVisualMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SaveVisualMetadataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VisualMetadataServiceServer).SaveVisualMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: VisualMetadataService_SaveVisualMetadata_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VisualMetadataServiceServer).SaveVisualMetadata(ctx, req.(*SaveVisualMetadataRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VisualMetadataService_DeleteVisualMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteVisualMetadataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VisualMetadataServiceServer).DeleteVisualMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: VisualMetadataService_DeleteVisualMetadata_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VisualMetadataServiceServer).DeleteVisualMetadata(ctx, req.(*DeleteVisualMetadataRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// VisualMetadataService_ServiceDesc is the grpc.ServiceDesc for VisualMetadataService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var VisualMetadataService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.VisualMetadataService", + HandlerType: (*VisualMetadataServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetVisualMetadata", + Handler: _VisualMetadataService_GetVisualMetadata_Handler, + }, + { + MethodName: "SaveVisualMetadata", + Handler: _VisualMetadataService_SaveVisualMetadata_Handler, + }, + { + MethodName: "DeleteVisualMetadata", + Handler: _VisualMetadataService_DeleteVisualMetadata_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/visual_metadata.proto", +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.go new file mode 100644 index 0000000000..d69b7e9301 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.go @@ -0,0 +1,991 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/aigateway/v1/workspace.proto + +package aigatewayv1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Workspace represents a grouping for gateways within an organization. +// Each gateway belongs to exactly one workspace. +type Workspace struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name. Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + // Workspace ID is a globally unique, sortable identifier (XID). + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Human-readable display name (must be unique within organization) + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Optional description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Whether this workspace is active + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Metadata for arbitrary key-value pairs + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Output only. Creation timestamp + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Output only. Last update timestamp + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Output only. Creator (API key or OIDC subject) + Creator string `protobuf:"bytes,8,opt,name=creator,proto3" json:"creator,omitempty"` + // Output only. Last updater (API key or OIDC subject) + Updater string `protobuf:"bytes,9,opt,name=updater,proto3" json:"updater,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Workspace) Reset() { + *x = Workspace{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Workspace) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Workspace) ProtoMessage() {} + +func (x *Workspace) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Workspace.ProtoReflect.Descriptor instead. +func (*Workspace) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{0} +} + +func (x *Workspace) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Workspace) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Workspace) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Workspace) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Workspace) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Workspace) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *Workspace) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *Workspace) GetCreator() string { + if x != nil { + return x.Creator + } + return "" +} + +func (x *Workspace) GetUpdater() string { + if x != nil { + return x.Updater + } + return "" +} + +// Request message for CreateWorkspace RPC. +type CreateWorkspaceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + // Format: `accounts/{account}/organizations/{organization}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The workspace ID to use. If empty, server generates one. + // Must be a valid XID if provided. + WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + // Required: The workspace resource to create. + Workspace *Workspace `protobuf:"bytes,3,opt,name=workspace,proto3" json:"workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateWorkspaceRequest) Reset() { + *x = CreateWorkspaceRequest{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateWorkspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkspaceRequest) ProtoMessage() {} + +func (x *CreateWorkspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateWorkspaceRequest.ProtoReflect.Descriptor instead. +func (*CreateWorkspaceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateWorkspaceRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateWorkspaceRequest) GetWorkspaceId() string { + if x != nil { + return x.WorkspaceId + } + return "" +} + +func (x *CreateWorkspaceRequest) GetWorkspace() *Workspace { + if x != nil { + return x.Workspace + } + return nil +} + +// Response message for CreateWorkspace RPC. +type CreateWorkspaceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Workspace *Workspace `protobuf:"bytes,1,opt,name=workspace,proto3" json:"workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateWorkspaceResponse) Reset() { + *x = CreateWorkspaceResponse{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateWorkspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkspaceResponse) ProtoMessage() {} + +func (x *CreateWorkspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateWorkspaceResponse.ProtoReflect.Descriptor instead. +func (*CreateWorkspaceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateWorkspaceResponse) GetWorkspace() *Workspace { + if x != nil { + return x.Workspace + } + return nil +} + +// Request message for GetWorkspace RPC. +type GetWorkspaceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the workspace. + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetWorkspaceRequest) Reset() { + *x = GetWorkspaceRequest{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetWorkspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkspaceRequest) ProtoMessage() {} + +func (x *GetWorkspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWorkspaceRequest.ProtoReflect.Descriptor instead. +func (*GetWorkspaceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{3} +} + +func (x *GetWorkspaceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Response message for GetWorkspace RPC. +type GetWorkspaceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Workspace *Workspace `protobuf:"bytes,1,opt,name=workspace,proto3" json:"workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetWorkspaceResponse) Reset() { + *x = GetWorkspaceResponse{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetWorkspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkspaceResponse) ProtoMessage() {} + +func (x *GetWorkspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWorkspaceResponse.ProtoReflect.Descriptor instead. +func (*GetWorkspaceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{4} +} + +func (x *GetWorkspaceResponse) GetWorkspace() *Workspace { + if x != nil { + return x.Workspace + } + return nil +} + +// Request message for ListWorkspaces RPC. +type ListWorkspacesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: Parent organization. + // Format: `accounts/{account}/organizations/{organization}` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // Maximum number of workspaces to return (max 1000) + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Page token from a previous ListWorkspaces call + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // Filter expression (CEL syntax) + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` + // Comma-separated list of fields to order by + OrderBy string `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListWorkspacesRequest) Reset() { + *x = ListWorkspacesRequest{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListWorkspacesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkspacesRequest) ProtoMessage() {} + +func (x *ListWorkspacesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkspacesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkspacesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{5} +} + +func (x *ListWorkspacesRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListWorkspacesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListWorkspacesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListWorkspacesRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ListWorkspacesRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response message for ListWorkspaces RPC. +type ListWorkspacesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The list of workspaces + Workspaces []*Workspace `protobuf:"bytes,1,rep,name=workspaces,proto3" json:"workspaces,omitempty"` + // Token for next page (empty if no more pages) + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Total count of matching workspaces + TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListWorkspacesResponse) Reset() { + *x = ListWorkspacesResponse{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListWorkspacesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkspacesResponse) ProtoMessage() {} + +func (x *ListWorkspacesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkspacesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkspacesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{6} +} + +func (x *ListWorkspacesResponse) GetWorkspaces() []*Workspace { + if x != nil { + return x.Workspaces + } + return nil +} + +func (x *ListWorkspacesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListWorkspacesResponse) GetTotalSize() int32 { + if x != nil { + return x.TotalSize + } + return 0 +} + +// Request message for UpdateWorkspace RPC. +type UpdateWorkspaceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required: The workspace resource to update. + Workspace *Workspace `protobuf:"bytes,1,opt,name=workspace,proto3" json:"workspace,omitempty"` + // The fields to update. + // Allowed fields: display_name, description, enabled, metadata + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateWorkspaceRequest) Reset() { + *x = UpdateWorkspaceRequest{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateWorkspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkspaceRequest) ProtoMessage() {} + +func (x *UpdateWorkspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateWorkspaceRequest.ProtoReflect.Descriptor instead. +func (*UpdateWorkspaceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{7} +} + +func (x *UpdateWorkspaceRequest) GetWorkspace() *Workspace { + if x != nil { + return x.Workspace + } + return nil +} + +func (x *UpdateWorkspaceRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +// Response message for UpdateWorkspace RPC. +type UpdateWorkspaceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Workspace *Workspace `protobuf:"bytes,1,opt,name=workspace,proto3" json:"workspace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateWorkspaceResponse) Reset() { + *x = UpdateWorkspaceResponse{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateWorkspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkspaceResponse) ProtoMessage() {} + +func (x *UpdateWorkspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateWorkspaceResponse.ProtoReflect.Descriptor instead. +func (*UpdateWorkspaceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateWorkspaceResponse) GetWorkspace() *Workspace { + if x != nil { + return x.Workspace + } + return nil +} + +// Request message for DeleteWorkspace RPC. +type DeleteWorkspaceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Resource name of the workspace to delete. + // Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If true, cascade delete all child resources (gateways, etc.) + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteWorkspaceRequest) Reset() { + *x = DeleteWorkspaceRequest{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteWorkspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkspaceRequest) ProtoMessage() {} + +func (x *DeleteWorkspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteWorkspaceRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkspaceRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{9} +} + +func (x *DeleteWorkspaceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteWorkspaceRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +// Response message for DeleteWorkspace RPC. +type DeleteWorkspaceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteWorkspaceResponse) Reset() { + *x = DeleteWorkspaceResponse{} + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteWorkspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkspaceResponse) ProtoMessage() {} + +func (x *DeleteWorkspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_aigateway_v1_workspace_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteWorkspaceResponse.ProtoReflect.Descriptor instead. +func (*DeleteWorkspaceResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP(), []int{10} +} + +var File_redpanda_api_aigateway_v1_workspace_proto protoreflect.FileDescriptor + +var file_redpanda_api_aigateway_v1_workspace_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd5, 0x04, 0x0a, 0x09, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x30, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x3a, 0x6d, 0xea, 0x41, 0x6a, 0x0a, 0x20, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x46, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x2f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x7d, 0x22, 0xce, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x53, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, + 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, + 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xe0, 0x41, 0x01, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xe8, + 0x07, 0x28, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xa5, + 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x47, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x5d, 0x0a, 0x17, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x71, 0x0a, 0x16, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x69, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x19, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd4, 0x07, 0x0a, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xbf, + 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3f, 0x3a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x12, 0xab, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, + 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb1, + 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0xc9, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x3a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x32, 0x3c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, + 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, + 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb4, + 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x34, 0x2a, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0x19, 0xca, 0x41, 0x16, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x42, 0x83, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x76, 0x31, 0x42, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x6f, 0x2e, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x64, + 0x65, 0x76, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x61, 0x69, 0x67, 0x77, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x76, + 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x41, 0xaa, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, + 0x70, 0x69, 0x5c, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x41, + 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x41, 0x69, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_aigateway_v1_workspace_proto_rawDescOnce sync.Once + file_redpanda_api_aigateway_v1_workspace_proto_rawDescData = file_redpanda_api_aigateway_v1_workspace_proto_rawDesc +) + +func file_redpanda_api_aigateway_v1_workspace_proto_rawDescGZIP() []byte { + file_redpanda_api_aigateway_v1_workspace_proto_rawDescOnce.Do(func() { + file_redpanda_api_aigateway_v1_workspace_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_aigateway_v1_workspace_proto_rawDescData) + }) + return file_redpanda_api_aigateway_v1_workspace_proto_rawDescData +} + +var file_redpanda_api_aigateway_v1_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_redpanda_api_aigateway_v1_workspace_proto_goTypes = []any{ + (*Workspace)(nil), // 0: redpanda.api.aigateway.v1.Workspace + (*CreateWorkspaceRequest)(nil), // 1: redpanda.api.aigateway.v1.CreateWorkspaceRequest + (*CreateWorkspaceResponse)(nil), // 2: redpanda.api.aigateway.v1.CreateWorkspaceResponse + (*GetWorkspaceRequest)(nil), // 3: redpanda.api.aigateway.v1.GetWorkspaceRequest + (*GetWorkspaceResponse)(nil), // 4: redpanda.api.aigateway.v1.GetWorkspaceResponse + (*ListWorkspacesRequest)(nil), // 5: redpanda.api.aigateway.v1.ListWorkspacesRequest + (*ListWorkspacesResponse)(nil), // 6: redpanda.api.aigateway.v1.ListWorkspacesResponse + (*UpdateWorkspaceRequest)(nil), // 7: redpanda.api.aigateway.v1.UpdateWorkspaceRequest + (*UpdateWorkspaceResponse)(nil), // 8: redpanda.api.aigateway.v1.UpdateWorkspaceResponse + (*DeleteWorkspaceRequest)(nil), // 9: redpanda.api.aigateway.v1.DeleteWorkspaceRequest + (*DeleteWorkspaceResponse)(nil), // 10: redpanda.api.aigateway.v1.DeleteWorkspaceResponse + nil, // 11: redpanda.api.aigateway.v1.Workspace.MetadataEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_redpanda_api_aigateway_v1_workspace_proto_depIdxs = []int32{ + 11, // 0: redpanda.api.aigateway.v1.Workspace.metadata:type_name -> redpanda.api.aigateway.v1.Workspace.MetadataEntry + 12, // 1: redpanda.api.aigateway.v1.Workspace.create_time:type_name -> google.protobuf.Timestamp + 12, // 2: redpanda.api.aigateway.v1.Workspace.update_time:type_name -> google.protobuf.Timestamp + 0, // 3: redpanda.api.aigateway.v1.CreateWorkspaceRequest.workspace:type_name -> redpanda.api.aigateway.v1.Workspace + 0, // 4: redpanda.api.aigateway.v1.CreateWorkspaceResponse.workspace:type_name -> redpanda.api.aigateway.v1.Workspace + 0, // 5: redpanda.api.aigateway.v1.GetWorkspaceResponse.workspace:type_name -> redpanda.api.aigateway.v1.Workspace + 0, // 6: redpanda.api.aigateway.v1.ListWorkspacesResponse.workspaces:type_name -> redpanda.api.aigateway.v1.Workspace + 0, // 7: redpanda.api.aigateway.v1.UpdateWorkspaceRequest.workspace:type_name -> redpanda.api.aigateway.v1.Workspace + 13, // 8: redpanda.api.aigateway.v1.UpdateWorkspaceRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 9: redpanda.api.aigateway.v1.UpdateWorkspaceResponse.workspace:type_name -> redpanda.api.aigateway.v1.Workspace + 1, // 10: redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace:input_type -> redpanda.api.aigateway.v1.CreateWorkspaceRequest + 3, // 11: redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace:input_type -> redpanda.api.aigateway.v1.GetWorkspaceRequest + 5, // 12: redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces:input_type -> redpanda.api.aigateway.v1.ListWorkspacesRequest + 7, // 13: redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace:input_type -> redpanda.api.aigateway.v1.UpdateWorkspaceRequest + 9, // 14: redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace:input_type -> redpanda.api.aigateway.v1.DeleteWorkspaceRequest + 2, // 15: redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace:output_type -> redpanda.api.aigateway.v1.CreateWorkspaceResponse + 4, // 16: redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace:output_type -> redpanda.api.aigateway.v1.GetWorkspaceResponse + 6, // 17: redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces:output_type -> redpanda.api.aigateway.v1.ListWorkspacesResponse + 8, // 18: redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace:output_type -> redpanda.api.aigateway.v1.UpdateWorkspaceResponse + 10, // 19: redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace:output_type -> redpanda.api.aigateway.v1.DeleteWorkspaceResponse + 15, // [15:20] is the sub-list for method output_type + 10, // [10:15] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_redpanda_api_aigateway_v1_workspace_proto_init() } +func file_redpanda_api_aigateway_v1_workspace_proto_init() { + if File_redpanda_api_aigateway_v1_workspace_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_aigateway_v1_workspace_proto_rawDesc, + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_aigateway_v1_workspace_proto_goTypes, + DependencyIndexes: file_redpanda_api_aigateway_v1_workspace_proto_depIdxs, + MessageInfos: file_redpanda_api_aigateway_v1_workspace_proto_msgTypes, + }.Build() + File_redpanda_api_aigateway_v1_workspace_proto = out.File + file_redpanda_api_aigateway_v1_workspace_proto_rawDesc = nil + file_redpanda_api_aigateway_v1_workspace_proto_goTypes = nil + file_redpanda_api_aigateway_v1_workspace_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.gw.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.gw.go new file mode 100644 index 0000000000..0434d7d506 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace.pb.gw.go @@ -0,0 +1,571 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/aigateway/v1/workspace.proto + +/* +Package aigatewayv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package aigatewayv1 + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_WorkspaceService_CreateWorkspace_0 = &utilities.DoubleArray{Encoding: map[string]int{"workspace": 0, "parent": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + +func request_WorkspaceService_CreateWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Workspace); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_CreateWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateWorkspace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_WorkspaceService_CreateWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Workspace); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_CreateWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateWorkspace(ctx, &protoReq) + return msg, metadata, err +} + +func request_WorkspaceService_GetWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.GetWorkspace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_WorkspaceService_GetWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.GetWorkspace(ctx, &protoReq) + return msg, metadata, err +} + +var filter_WorkspaceService_ListWorkspaces_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_WorkspaceService_ListWorkspaces_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListWorkspacesRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_ListWorkspaces_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListWorkspaces(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_WorkspaceService_ListWorkspaces_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListWorkspacesRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_ListWorkspaces_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListWorkspaces(ctx, &protoReq) + return msg, metadata, err +} + +var filter_WorkspaceService_UpdateWorkspace_0 = &utilities.DoubleArray{Encoding: map[string]int{"workspace": 0, "name": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}} + +func request_WorkspaceService_UpdateWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Workspace); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Workspace); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["workspace.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workspace.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "workspace.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workspace.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_UpdateWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateWorkspace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_WorkspaceService_UpdateWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Workspace); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { + if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Workspace); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } else { + protoReq.UpdateMask = fieldMask + } + } + val, ok := pathParams["workspace.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workspace.name") + } + err = runtime.PopulateFieldFromPath(&protoReq, "workspace.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workspace.name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_UpdateWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateWorkspace(ctx, &protoReq) + return msg, metadata, err +} + +var filter_WorkspaceService_DeleteWorkspace_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_WorkspaceService_DeleteWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_DeleteWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteWorkspace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_WorkspaceService_DeleteWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteWorkspaceRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WorkspaceService_DeleteWorkspace_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DeleteWorkspace(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterWorkspaceServiceHandlerServer registers the http handlers for service WorkspaceService to "mux". +// UnaryRPC :call WorkspaceServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterWorkspaceServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterWorkspaceServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WorkspaceServiceServer) error { + mux.Handle(http.MethodPost, pattern_WorkspaceService_CreateWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/CreateWorkspace", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/workspaces")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_CreateWorkspace_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_CreateWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_WorkspaceService_GetWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/GetWorkspace", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_GetWorkspace_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_GetWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_WorkspaceService_ListWorkspaces_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/ListWorkspaces", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/workspaces")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_ListWorkspaces_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_ListWorkspaces_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_WorkspaceService_UpdateWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/UpdateWorkspace", runtime.WithHTTPPathPattern("/v1/{workspace.name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_UpdateWorkspace_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_UpdateWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_WorkspaceService_DeleteWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/DeleteWorkspace", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WorkspaceService_DeleteWorkspace_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_DeleteWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterWorkspaceServiceHandlerFromEndpoint is same as RegisterWorkspaceServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterWorkspaceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterWorkspaceServiceHandler(ctx, mux, conn) +} + +// RegisterWorkspaceServiceHandler registers the http handlers for service WorkspaceService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterWorkspaceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterWorkspaceServiceHandlerClient(ctx, mux, NewWorkspaceServiceClient(conn)) +} + +// RegisterWorkspaceServiceHandlerClient registers the http handlers for service WorkspaceService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "WorkspaceServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "WorkspaceServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "WorkspaceServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterWorkspaceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WorkspaceServiceClient) error { + mux.Handle(http.MethodPost, pattern_WorkspaceService_CreateWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/CreateWorkspace", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/workspaces")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_CreateWorkspace_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_CreateWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_WorkspaceService_GetWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/GetWorkspace", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_GetWorkspace_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_GetWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_WorkspaceService_ListWorkspaces_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/ListWorkspaces", runtime.WithHTTPPathPattern("/v1/{parent=accounts/*/organizations/*}/workspaces")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_ListWorkspaces_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_ListWorkspaces_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_WorkspaceService_UpdateWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/UpdateWorkspace", runtime.WithHTTPPathPattern("/v1/{workspace.name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_UpdateWorkspace_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_UpdateWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_WorkspaceService_DeleteWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.aigateway.v1.WorkspaceService/DeleteWorkspace", runtime.WithHTTPPathPattern("/v1/{name=accounts/*/organizations/*/workspaces/*}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WorkspaceService_DeleteWorkspace_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_WorkspaceService_DeleteWorkspace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_WorkspaceService_CreateWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "workspaces"}, "")) + pattern_WorkspaceService_GetWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "workspaces", "name"}, "")) + pattern_WorkspaceService_ListWorkspaces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "accounts", "organizations", "parent", "workspaces"}, "")) + pattern_WorkspaceService_UpdateWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "workspaces", "workspace.name"}, "")) + pattern_WorkspaceService_DeleteWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "accounts", "organizations", "workspaces", "name"}, "")) +) + +var ( + forward_WorkspaceService_CreateWorkspace_0 = runtime.ForwardResponseMessage + forward_WorkspaceService_GetWorkspace_0 = runtime.ForwardResponseMessage + forward_WorkspaceService_ListWorkspaces_0 = runtime.ForwardResponseMessage + forward_WorkspaceService_UpdateWorkspace_0 = runtime.ForwardResponseMessage + forward_WorkspaceService_DeleteWorkspace_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace_grpc.pb.go b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace_grpc.pb.go new file mode 100644 index 0000000000..acb79e60d4 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/aigateway/v1/workspace_grpc.pb.go @@ -0,0 +1,292 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/aigateway/v1/workspace.proto + +package aigatewayv1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + WorkspaceService_CreateWorkspace_FullMethodName = "/redpanda.api.aigateway.v1.WorkspaceService/CreateWorkspace" + WorkspaceService_GetWorkspace_FullMethodName = "/redpanda.api.aigateway.v1.WorkspaceService/GetWorkspace" + WorkspaceService_ListWorkspaces_FullMethodName = "/redpanda.api.aigateway.v1.WorkspaceService/ListWorkspaces" + WorkspaceService_UpdateWorkspace_FullMethodName = "/redpanda.api.aigateway.v1.WorkspaceService/UpdateWorkspace" + WorkspaceService_DeleteWorkspace_FullMethodName = "/redpanda.api.aigateway.v1.WorkspaceService/DeleteWorkspace" +) + +// WorkspaceServiceClient is the client API for WorkspaceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// WorkspaceService manages workspaces within organizations. +// A workspace is a grouping for gateways within an organization. +// Resource name: accounts/{account_id}/organizations/{organization_id}/workspaces/{workspace_id} +type WorkspaceServiceClient interface { + // Creates a new workspace within an organization. + CreateWorkspace(ctx context.Context, in *CreateWorkspaceRequest, opts ...grpc.CallOption) (*CreateWorkspaceResponse, error) + // Gets a workspace by name. + GetWorkspace(ctx context.Context, in *GetWorkspaceRequest, opts ...grpc.CallOption) (*GetWorkspaceResponse, error) + // Lists workspaces within an organization. + ListWorkspaces(ctx context.Context, in *ListWorkspacesRequest, opts ...grpc.CallOption) (*ListWorkspacesResponse, error) + // Updates a workspace. + UpdateWorkspace(ctx context.Context, in *UpdateWorkspaceRequest, opts ...grpc.CallOption) (*UpdateWorkspaceResponse, error) + // Deletes a workspace. + DeleteWorkspace(ctx context.Context, in *DeleteWorkspaceRequest, opts ...grpc.CallOption) (*DeleteWorkspaceResponse, error) +} + +type workspaceServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewWorkspaceServiceClient(cc grpc.ClientConnInterface) WorkspaceServiceClient { + return &workspaceServiceClient{cc} +} + +func (c *workspaceServiceClient) CreateWorkspace(ctx context.Context, in *CreateWorkspaceRequest, opts ...grpc.CallOption) (*CreateWorkspaceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateWorkspaceResponse) + err := c.cc.Invoke(ctx, WorkspaceService_CreateWorkspace_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workspaceServiceClient) GetWorkspace(ctx context.Context, in *GetWorkspaceRequest, opts ...grpc.CallOption) (*GetWorkspaceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetWorkspaceResponse) + err := c.cc.Invoke(ctx, WorkspaceService_GetWorkspace_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workspaceServiceClient) ListWorkspaces(ctx context.Context, in *ListWorkspacesRequest, opts ...grpc.CallOption) (*ListWorkspacesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListWorkspacesResponse) + err := c.cc.Invoke(ctx, WorkspaceService_ListWorkspaces_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workspaceServiceClient) UpdateWorkspace(ctx context.Context, in *UpdateWorkspaceRequest, opts ...grpc.CallOption) (*UpdateWorkspaceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateWorkspaceResponse) + err := c.cc.Invoke(ctx, WorkspaceService_UpdateWorkspace_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workspaceServiceClient) DeleteWorkspace(ctx context.Context, in *DeleteWorkspaceRequest, opts ...grpc.CallOption) (*DeleteWorkspaceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteWorkspaceResponse) + err := c.cc.Invoke(ctx, WorkspaceService_DeleteWorkspace_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// WorkspaceServiceServer is the server API for WorkspaceService service. +// All implementations must embed UnimplementedWorkspaceServiceServer +// for forward compatibility. +// +// WorkspaceService manages workspaces within organizations. +// A workspace is a grouping for gateways within an organization. +// Resource name: accounts/{account_id}/organizations/{organization_id}/workspaces/{workspace_id} +type WorkspaceServiceServer interface { + // Creates a new workspace within an organization. + CreateWorkspace(context.Context, *CreateWorkspaceRequest) (*CreateWorkspaceResponse, error) + // Gets a workspace by name. + GetWorkspace(context.Context, *GetWorkspaceRequest) (*GetWorkspaceResponse, error) + // Lists workspaces within an organization. + ListWorkspaces(context.Context, *ListWorkspacesRequest) (*ListWorkspacesResponse, error) + // Updates a workspace. + UpdateWorkspace(context.Context, *UpdateWorkspaceRequest) (*UpdateWorkspaceResponse, error) + // Deletes a workspace. + DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*DeleteWorkspaceResponse, error) + mustEmbedUnimplementedWorkspaceServiceServer() +} + +// UnimplementedWorkspaceServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedWorkspaceServiceServer struct{} + +func (UnimplementedWorkspaceServiceServer) CreateWorkspace(context.Context, *CreateWorkspaceRequest) (*CreateWorkspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateWorkspace not implemented") +} +func (UnimplementedWorkspaceServiceServer) GetWorkspace(context.Context, *GetWorkspaceRequest) (*GetWorkspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkspace not implemented") +} +func (UnimplementedWorkspaceServiceServer) ListWorkspaces(context.Context, *ListWorkspacesRequest) (*ListWorkspacesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListWorkspaces not implemented") +} +func (UnimplementedWorkspaceServiceServer) UpdateWorkspace(context.Context, *UpdateWorkspaceRequest) (*UpdateWorkspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkspace not implemented") +} +func (UnimplementedWorkspaceServiceServer) DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*DeleteWorkspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteWorkspace not implemented") +} +func (UnimplementedWorkspaceServiceServer) mustEmbedUnimplementedWorkspaceServiceServer() {} +func (UnimplementedWorkspaceServiceServer) testEmbeddedByValue() {} + +// UnsafeWorkspaceServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to WorkspaceServiceServer will +// result in compilation errors. +type UnsafeWorkspaceServiceServer interface { + mustEmbedUnimplementedWorkspaceServiceServer() +} + +func RegisterWorkspaceServiceServer(s grpc.ServiceRegistrar, srv WorkspaceServiceServer) { + // If the following call pancis, it indicates UnimplementedWorkspaceServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&WorkspaceService_ServiceDesc, srv) +} + +func _WorkspaceService_CreateWorkspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateWorkspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).CreateWorkspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkspaceService_CreateWorkspace_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).CreateWorkspace(ctx, req.(*CreateWorkspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkspaceService_GetWorkspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).GetWorkspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkspaceService_GetWorkspace_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).GetWorkspace(ctx, req.(*GetWorkspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkspaceService_ListWorkspaces_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListWorkspacesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).ListWorkspaces(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkspaceService_ListWorkspaces_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).ListWorkspaces(ctx, req.(*ListWorkspacesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkspaceService_UpdateWorkspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateWorkspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).UpdateWorkspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkspaceService_UpdateWorkspace_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).UpdateWorkspace(ctx, req.(*UpdateWorkspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkspaceService_DeleteWorkspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteWorkspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkspaceServiceServer).DeleteWorkspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkspaceService_DeleteWorkspace_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkspaceServiceServer).DeleteWorkspace(ctx, req.(*DeleteWorkspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// WorkspaceService_ServiceDesc is the grpc.ServiceDesc for WorkspaceService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var WorkspaceService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.aigateway.v1.WorkspaceService", + HandlerType: (*WorkspaceServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateWorkspace", + Handler: _WorkspaceService_CreateWorkspace_Handler, + }, + { + MethodName: "GetWorkspace", + Handler: _WorkspaceService_GetWorkspace_Handler, + }, + { + MethodName: "ListWorkspaces", + Handler: _WorkspaceService_ListWorkspaces_Handler, + }, + { + MethodName: "UpdateWorkspace", + Handler: _WorkspaceService_UpdateWorkspace_Handler, + }, + { + MethodName: "DeleteWorkspace", + Handler: _WorkspaceService_DeleteWorkspace_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/aigateway/v1/workspace.proto", +} diff --git a/buf.lock b/buf.lock index 4bd6a04191..0941c76a5c 100644 --- a/buf.lock +++ b/buf.lock @@ -10,9 +10,9 @@ deps: - name: buf.build/grpc-ecosystem/grpc-gateway commit: a48fcebcf8f140dd9d09359b9bb185a4 digest: b5:330af8a71b579ab96c4f3ee26929d1a68a5a9e986c7cfe0a898591fc514216bb6e723dc04c74d90fdee3f3f14f9100a54b4f079eb273e6e7213f0d5baca36ff8 - - name: buf.build/opentelemetry/opentelemetry - commit: 648a3e2f02e14fe187656ea4ac3befa1 - digest: b5:a0514be587ab2e8598f7102dfdaba5e985138b8c041c707e470a9c8b877410ada6e60cf2359352302f08c0504de685379f7f7a085d4699d69a2e6ed7035e78d9 + - name: buf.build/redpandadata/ai-gateway + commit: 702ee5c67c994d9995e39e74bb6553f6 + digest: b5:9717dd679ced8e42eab232efcc89c4ebcf9334b5aa6664b502268d5c7d25766e2c23b201822383a0a7c943d663859c7054c0656937fce7b612f7b578a59e3eb2 - name: buf.build/redpandadata/common commit: 601698cfe71d43b1b36fd434a7f765f1 digest: b5:d566ba6746a874a5709970e7f8569584008447d655c556676aabd3430111bbbc0a303dde11d99a1955ee27ac4748bcf7c972503a66db4ef850eb55f239f851ac diff --git a/buf.yaml b/buf.yaml index 68dda3d488..0586b5c1f0 100644 --- a/buf.yaml +++ b/buf.yaml @@ -11,6 +11,7 @@ deps: - buf.build/redpandadata/common - buf.build/redpandadata/core:05aa34b3829a4d5a801d9487623a7c76 - buf.build/redpandadata/otel + - buf.build/redpandadata/ai-gateway lint: use: - STANDARD diff --git a/frontend/bun.lock b/frontend/bun.lock index 67faf6703e..21e5bf1449 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "dependencies": { diff --git a/frontend/rsbuild.config.ts b/frontend/rsbuild.config.ts index 15c6393f7b..d6cee293d1 100644 --- a/frontend/rsbuild.config.ts +++ b/frontend/rsbuild.config.ts @@ -53,12 +53,31 @@ export default defineConfig({ origin: ['http://localhost:3000', 'http://localhost:9090'], credentials: true, }, - proxy: { - context: ['/api', '/redpanda.api', '/auth', '/logout'], - target: process.env.PROXY_TARGET || 'http://localhost:9090', - changeOrigin: !!process.env.PROXY_TARGET, - secure: process.env.PROXY_TARGET ? false : undefined, - }, + proxy: [ + // AI Gateway API - proxy to separate AI Gateway service + // Matches: /.redpanda/api/redpanda.api.aigateway.v1.* + // Proto package is: redpanda.api.aigateway.v1 (includes .api) + // AI Gateway now expects the full path with .api + ...(process.env.AI_GATEWAY_URL + ? [ + { + context: ['/.redpanda/api/redpanda.api.aigateway.v1'], + target: process.env.AI_GATEWAY_URL, + changeOrigin: true, + secure: false, + logLevel: 'debug', + // No pathRewrite - AI Gateway expects full path with .api + }, + ] + : []), + // All other APIs - proxy to Console backend + { + context: ['/api', '/redpanda.api', '/auth', '/logout'], + target: process.env.PROXY_TARGET || 'http://localhost:9090', + changeOrigin: !!process.env.PROXY_TARGET, + secure: process.env.PROXY_TARGET ? false : undefined, + }, + ], }, source: { define: { diff --git a/frontend/src/components/constants.ts b/frontend/src/components/constants.ts index 870a122cee..6b9577f368 100644 --- a/frontend/src/components/constants.ts +++ b/frontend/src/components/constants.ts @@ -18,6 +18,7 @@ export const FEATURE_FLAGS = { enableMcpServiceAccount: false, enablePipelineServiceAccount: false, enableTranscriptsInConsole: false, + enableApiKeyConfigurationAgent: false, shadowlinkCloudUi: false, enableNewTheme: false, }; diff --git a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx index bc6e04645c..dc783bd2a1 100644 --- a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx +++ b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx @@ -32,6 +32,7 @@ import { type ServiceAccountSelectorRef, } from 'components/ui/service-account/service-account-selector'; import { TagsFieldList } from 'components/ui/tag/tags-field-list'; +import { isFeatureFlagEnabled } from 'config'; import { Loader2 } from 'lucide-react'; import { Scope } from 'protogen/redpanda/api/dataplane/v1/secret_pb'; import { @@ -51,6 +52,7 @@ import { import { useEffect, useMemo, useRef, useState } from 'react'; import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { useCreateAIAgentMutation } from 'react-query/api/ai-agent'; +import { useListGatewaysQuery } from 'react-query/api/ai-gateway'; import { useListMCPServersQuery } from 'react-query/api/remote-mcp'; import { useCreateSecretMutation, useListSecretsQuery } from 'react-query/api/secret'; import { toast } from 'sonner'; @@ -72,6 +74,38 @@ export const AIAgentCreatePage = () => { skipInvalidation: true, }); + // Feature flag: when true, use legacy API key mode (hardcoded providers) + const useLegacyApiKeyMode = isFeatureFlagEnabled('enableApiKeyConfigurationAgent'); + + // Gateway detection and list query (using v1 API from ai-gateway module) + // Only fetch when NOT in legacy mode + const { data: gatewaysData, isLoading: isLoadingGateways } = useListGatewaysQuery( + { pageSize: 1000 }, // Get all gateways (max 1000) + { enabled: !useLegacyApiKeyMode } + ); + + const hasGatewayDeployed = useMemo(() => { + if (useLegacyApiKeyMode || isLoadingGateways) { + return false; + } + return Boolean(gatewaysData?.gateways && gatewaysData.gateways.length > 0); + }, [useLegacyApiKeyMode, gatewaysData, isLoadingGateways]); + + const availableGateways = useMemo(() => { + if (useLegacyApiKeyMode || !gatewaysData?.gateways) { + return []; + } + return gatewaysData.gateways.map((gw) => { + // Extract gateway ID from name (format: "gateways/{gateway_id}") + const gatewayId = gw.name.split('/').pop() || gw.name; + return { + id: gatewayId, + displayName: gw.displayName, + description: gw.description, + }; + }); + }, [useLegacyApiKeyMode, gatewaysData]); + // Ref to ServiceAccountSelector to call createServiceAccount const serviceAccountSelectorRef = useRef(null); @@ -107,6 +141,13 @@ export const AIAgentCreatePage = () => { } }, [displayName, form]); + // Auto-select first gateway when gateways are available (only if not in legacy mode) + useEffect(() => { + if (!useLegacyApiKeyMode && availableGateways.length > 0 && !form.getValues('gatewayId')) { + form.setValue('gatewayId', availableGateways[0].id); + } + }, [useLegacyApiKeyMode, availableGateways.length, form]); + const { fields: tagFields, append: appendTag, @@ -294,7 +335,9 @@ export const AIAgentCreatePage = () => { }); // Build provider configuration based on selected provider - const apiKeyRef = `\${secrets.${values.apiKeySecret}}`; + // When using gateway: api_key can be empty (proto has ignore = IGNORE_IF_ZERO_VALUE) + // When not using gateway: api_key must reference a secret + const apiKeyRef = values.apiKeySecret ? `\${secrets.${values.apiKeySecret}}` : ''; let providerConfig: AIAgent_Provider; switch (values.provider) { @@ -464,7 +507,7 @@ export const AIAgentCreatePage = () => { { gatewayId: 'gatewayId', }} form={form} - hasGatewayDeployed={false} + hasGatewayDeployed={hasGatewayDeployed} + isLoadingGateways={isLoadingGateways} mode="create" scopes={[Scope.MCP_SERVER, Scope.AI_AGENT]} showBaseUrl={form.watch('provider') === 'openaiCompatible'} diff --git a/frontend/src/components/pages/agents/create/schemas.ts b/frontend/src/components/pages/agents/create/schemas.ts index a2dd0821cb..b881723542 100644 --- a/frontend/src/components/pages/agents/create/schemas.ts +++ b/frontend/src/components/pages/agents/create/schemas.ts @@ -49,6 +49,14 @@ export const FormSchema = z { message: 'Tags must have unique keys' } ), triggerType: z.enum(['http', 'slack', 'kafka']).default('http'), + gatewayId: z + .string() + .refine( + (val) => !val || (val.length === 20 && /^[a-z0-9]+$/.test(val)), + 'Gateway ID must be exactly 20 lowercase alphanumeric characters' + ) + .optional() + .or(z.literal('')), provider: z.enum(['openai', 'anthropic', 'google', 'openaiCompatible']).default('openai'), apiKeySecret: z.string(), model: z.string().min(1, 'Model is required'), @@ -77,15 +85,24 @@ export const FormSchema = z }, { message: 'Subagent names must be unique' } ), - gatewayId: z - .string() - .length(20, 'Gateway ID must be exactly 20 characters') - .regex(/^[a-z0-9]+$/, 'Gateway ID must contain only lowercase letters and numbers') - .optional() - .or(z.literal('')), }) // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex validation logic with multiple conditional checks .superRefine((data, ctx) => { + // Note: Gateway validation happens in the UI layer based on availability + // If gateways are available, gateway is required (enforced by UI) + // If gateways are NOT available, API key is required + + const hasGateway = data.gatewayId && data.gatewayId.trim() !== ''; + + if (!hasGateway && (!data.apiKeySecret || data.apiKeySecret.trim() === '')) { + // No gateway selected: API Key is required + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'API Token is required', + path: ['apiKeySecret'], + }); + } + if (data.provider === 'openaiCompatible') { if (!data.baseUrl || data.baseUrl.trim() === '') { ctx.addIssue({ @@ -131,6 +148,7 @@ export const initialValues: FormValues = { description: '', tags: [], triggerType: 'http', + gatewayId: '', provider: 'openai', apiKeySecret: '', model: '', diff --git a/frontend/src/hooks/use-ai-gateway-transport.ts b/frontend/src/hooks/use-ai-gateway-transport.ts new file mode 100644 index 0000000000..00b837bc48 --- /dev/null +++ b/frontend/src/hooks/use-ai-gateway-transport.ts @@ -0,0 +1,34 @@ +import type { Transport } from '@connectrpc/connect'; +import { createConnectTransport } from '@connectrpc/connect-web'; +import { addBearerTokenInterceptor } from 'config'; +import { protobufRegistry } from 'protobuf-registry'; +import { useMemo } from 'react'; + +/** + * Custom hook to create and memoize a Connect transport for AI Gateway API calls + * + * Uses base path: /.redpanda/api/ + * Connect Query will append the service path: redpanda.aigateway.v1.GatewayService/ListGateways + * Full path becomes: /.redpanda/api/redpanda.aigateway.v1.GatewayService/ListGateways + * + * Dev server proxies /.redpanda/api/redpanda.aigateway.v1 to: + * https://ai-gateway.${CLUSTER_ID}.clusters.ign.rdpa.co + * + * @returns Transport instance configured for AI Gateway communication + */ +export const useAIGatewayTransport = (): Transport => { + const aiGatewayTransport = useMemo(() => { + // Use /.redpanda/api/ base path (AI Gateway's Connect RPC endpoint prefix) + const baseUrl = '/.redpanda/api'; + + return createConnectTransport({ + baseUrl, + interceptors: [addBearerTokenInterceptor], + jsonOptions: { + registry: protobufRegistry, + }, + }); + }, []); + + return aiGatewayTransport; +}; diff --git a/frontend/src/protogen/buf/validate/validate_pb.ts b/frontend/src/protogen/buf/validate/validate_pb.ts index 3f98e73502..ac05cb4265 100644 --- a/frontend/src/protogen/buf/validate/validate_pb.ts +++ b/frontend/src/protogen/buf/validate/validate_pb.ts @@ -18,15 +18,15 @@ import type { GenEnum, GenExtension, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; import { enumDesc, extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Duration, FieldDescriptorProto_Type, FieldMask, FieldOptions, MessageOptions, OneofOptions, Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Duration, FieldDescriptorProto_Type, FieldOptions, MessageOptions, OneofOptions, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file buf/validate/validate.proto. */ export const file_buf_validate_validate: GenFile = /*@__PURE__*/ - fileDesc("ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSLaFwoKRmxvYXRSdWxlcxKDAQoFY29uc3QYASABKAJCdMJIcQpvCgtmbG9hdC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEp8BCgJsdBgCIAEoAkKQAcJIjAEKiQEKCGZsb2F0Lmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEq8BCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLvBwoCZ3QYBCABKAJC4AfCSNwHCo0BCghmbG9hdC5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsMBCgtmbG9hdC5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs0BChVmbG9hdC5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrTAQoMZmxvYXQuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3QEKFmZsb2F0Lmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEroICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESfwoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdgoGbm90X2luGAcgAygCQmbCSGMKYQoMZmxvYXQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdQoGZmluaXRlGAggASgIQmXCSGIKYAoMZmxvYXQuZmluaXRlGlBydWxlcy5maW5pdGUgPyAodGhpcy5pc05hbigpIHx8IHRoaXMuaXNJbmYoKSA/ICd2YWx1ZSBtdXN0IGJlIGZpbml0ZScgOiAnJykgOiAnJxIrCgdleGFtcGxlGAkgAygCQhrCSBcKFQoNZmxvYXQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i7RcKC0RvdWJsZVJ1bGVzEoQBCgVjb25zdBgBIAEoAUJ1wkhyCnAKDGRvdWJsZS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqABCgJsdBgCIAEoAUKRAcJIjQEKigEKCWRvdWJsZS5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKwAQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvQHCgJndBgEIAEoAULlB8JI4QcKjgEKCWRvdWJsZS5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsQBCgxkb3VibGUuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrOAQoWZG91YmxlLmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtQBCg1kb3VibGUuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3gEKF2RvdWJsZS5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK/CAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygBQnTCSHEKbwoJZG91YmxlLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdgoGZmluaXRlGAggASgIQmbCSGMKYQoNZG91YmxlLmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSLAoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50MzJSdWxlcxKDAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoBUJ8wkh5CncKCGludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKAVCjAHCSIgBCoUBCglpbnQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoBUKIB8JIhAcKegoIaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgFQtMHwkjPBwqIAQoJaW50MzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygFQnPCSHAKbgoIaW50MzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCCADKAVCGsJIFwoVCg1pbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50NjRSdWxlcxKDAQoFY29uc3QYASABKANCdMJIcQpvCgtpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoA0J8wkh5CncKCGludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoA0KIB8JIhAcKegoIaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoA0JmwkhjCmEKDGludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDMyUnVsZXMShAEKBWNvbnN0GAEgASgNQnXCSHIKcAoMdWludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKA1CjQHCSIkBCoYBCgp1aW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgNQtgHwkjUBwqJAQoKdWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKA1CZ8JIZApiCg11aW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoDUIbwkgYChYKDnVpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDY0UnVsZXMShAEKBWNvbnN0GAEgASgEQnXCSHIKcAoMdWludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKARCjQHCSIkBCoYBCgp1aW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgEQtgHwkjUBwqJAQoKdWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKARCZ8JIZApiCg11aW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoBEIbwkgYChYKDnVpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDMyUnVsZXMShAEKBWNvbnN0GAEgASgRQnXCSHIKcAoMc2ludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBFCjQHCSIkBCoYBCgpzaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgRQtgHwkjUBwqJAQoKc2ludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBFCZ8JIZApiCg1zaW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDY0UnVsZXMShAEKBWNvbnN0GAEgASgSQnXCSHIKcAoMc2ludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBJCjQHCSIkBCoYBCgpzaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgSQtgHwkjUBwqJAQoKc2ludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBJCZ8JIZApiCg1zaW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEkIbwkgYChYKDnNpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQzMlJ1bGVzEoUBCgVjb25zdBgBIAEoB0J2wkhzCnEKDWZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAdCjgHCSIoBCocBCgtmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgHQt0HwkjZBwqKAQoLZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAdCaMJIZQpjCg5maXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAdCHMJIGQoXCg9maXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIq8VCgxGaXhlZDY0UnVsZXMShQEKBWNvbnN0GAEgASgGQnbCSHMKcQoNZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEowBCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASngEKA2x0ZRgDIAEoBkKOAcJIigEKhwEKC2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKhBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu0HCgNndGUYBSABKAZC3QfCSNkHCooBCgtmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsQBCg5maXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoYZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrUAQoPZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtwBChlmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoEBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEngKBm5vdF9pbhgHIAMoBkJowkhlCmMKDmZpeGVkNjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwBUKDVNGaXhlZDMyUnVsZXMShgEKBWNvbnN0GAEgASgPQnfCSHQKcgoOc2ZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKNAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKfAQoDbHRlGAMgASgPQo8BwkiLAQqIAQoMc2ZpeGVkMzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKmBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES8gcKA2d0ZRgFIAEoD0LiB8JI3gcKiwEKDHNmaXhlZDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKCAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeQoGbm90X2luGAcgAygPQmnCSGYKZAoPc2ZpeGVkMzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLgoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQ2NFJ1bGVzEoYBCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgQQn/CSHwKegoLc2ZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoEEKPAcJIiwEKiAEKDHNmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgQQpcHwkiTBwp9CgtzZml4ZWQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKBBC4gfCSN4HCosBCgxzZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkNjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkNjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygQQnbCSHMKcQoLc2ZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKBBCHcJIGgoYChBzZml4ZWQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLHAQoJQm9vbFJ1bGVzEoIBCgVjb25zdBgBIAEoCEJzwkhwCm4KCmJvb2wuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIiiDkKC1N0cmluZ1J1bGVzEoYBCgVjb25zdBgBIAEoCUJ3wkh0CnIKDHN0cmluZy5jb25zdBpidGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSfgoDbGVuGBMgASgEQnHCSG4KbAoKc3RyaW5nLmxlbhpedWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKZAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKXAQoHbWF4X2xlbhgDIAEoBEKFAcJIgQEKfwoOc3RyaW5nLm1heF9sZW4abXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSmwEKCWxlbl9ieXRlcxgUIAEoBEKHAcJIgwEKgAEKEHN0cmluZy5sZW5fYnl0ZXMabHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSAhPSBydWxlcy5sZW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKjAQoJbWluX2J5dGVzGAQgASgEQo8BwkiLAQqIAQoQc3RyaW5nLm1pbl9ieXRlcxp0dWludChieXRlcyh0aGlzKS5zaXplKCkpIDwgcnVsZXMubWluX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSogEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJycSjQEKB3BhdHRlcm4YBiABKAlCfMJIeQp3Cg5zdHJpbmcucGF0dGVybhplIXRoaXMubWF0Y2hlcyhydWxlcy5wYXR0ZXJuKSA/ICd2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycShAEKBnByZWZpeBgHIAEoCUJ0wkhxCm8KDXN0cmluZy5wcmVmaXgaXiF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgJXNgJy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSggEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEpABCghjb250YWlucxgJIAEoCUJ+wkh7CnkKD3N0cmluZy5jb250YWlucxpmIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ3ZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpgBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJycSgAEKAmluGAogAygJQnTCSHEKbwoJc3RyaW5nLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YCyADKAlCZ8JIZApiCg1zdHJpbmcubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycS3wEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAEucBCghob3N0bmFtZRgNIAEoCELSAcJIzgEKZQoPc3RyaW5nLmhvc3RuYW1lEh52YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdG5hbWUaMiFydWxlcy5ob3N0bmFtZSB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpCmUKFXN0cmluZy5ob3N0bmFtZV9lbXB0eRItdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lGh0hcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyAhPSAnJ0gAEscBCgJpcBgOIAEoCEK4AcJItAEKVQoJc3RyaW5nLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxomIXJ1bGVzLmlwIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKCkKWwoPc3RyaW5nLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxoXIXJ1bGVzLmlwIHx8IHRoaXMgIT0gJydIABLWAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAEr8BCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSAAScAoHdXJpX3JlZhgSIAEoCEJdwkhaClgKDnN0cmluZy51cmlfcmVmEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJIFJlZmVyZW5jZRohIXJ1bGVzLnVyaV9yZWYgfHwgdGhpcy5pc1VyaVJlZigpSAASkAIKB2FkZHJlc3MYFSABKAhC/AHCSPgBCoEBCg5zdHJpbmcuYWRkcmVzcxItdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKYAgoEdXVpZBgWIAEoCEKHAsJIgwIKpQEKC3N0cmluZy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS8AEKBXR1dWlkGCEgASgIQt4BwkjaAQpzCgxzdHJpbmcudHV1aWQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASlgIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvgBwkj0AQp4ChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEs8CChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQq8CwkirAgqTAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SNXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS8gEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABKDAgoLaXB2NF9wcmVmaXgYHiABKAhC6wHCSOcBCnUKEnN0cmluZy5pcHY0X3ByZWZpeBIhdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjZfcHJlZml4GB8gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2Nl9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAErUCCg1ob3N0X2FuZF9wb3J0GCAgASgIQpsCwkiXAgqZAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSQXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEvUBCgR1bGlkGCMgASgIQuQBwkjgAQqCAQoLc3RyaW5nLnVsaWQSGnZhbHVlIG11c3QgYmUgYSB2YWxpZCBVTElEGlchcnVsZXMudWxpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTddWzAtOUEtSEpLTU5QLVRWLVphLWhqa21ucC10di16XXsyNX0kJykKWQoRc3RyaW5nLnVsaWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVTElEGhkhcnVsZXMudWxpZCB8fCB0aGlzICE9ICcnSAASqAUKEHdlbGxfa25vd25fcmVnZXgYGCABKA4yGC5idWYudmFsaWRhdGUuS25vd25SZWdleELxBMJI7QQK8AEKI3N0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lEiZ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRqgAXJ1bGVzLndlbGxfa25vd25fcmVnZXggIT0gMSB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXjo/WzAtOWEtekEtWiEjJCUmXCcqKy0uXl98flx4NjBdKyQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSskJykKjQEKKXN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lX2VtcHR5EjV2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRopcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgIT0gJycK5wEKJHN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl92YWx1ZRIndmFsdWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgaGVhZGVyIHZhbHVlGpUBcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAyIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXlteXHUwMDAwLVx1MDAwOFx1MDAwQS1cdTAwMUZcdTAwN0ZdKiQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSokJylIABIOCgZzdHJpY3QYGSABKAgSLAoHZXhhbXBsZRgiIAMoCUIbwkgYChYKDnN0cmluZy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLCEgoKQnl0ZXNSdWxlcxKAAQoFY29uc3QYASABKAxCccJIbgpsCgtieXRlcy5jb25zdBpddGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBiZSAleCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEngKA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSkAEKB21pbl9sZW4YAiABKARCf8JIfAp6Cg1ieXRlcy5taW5fbGVuGml1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg1ieXRlcy5tYXhfbGVuGmF1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpABCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoEBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEn8KBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEoMBCghjb250YWlucxgHIAEoDEJxwkhuCmwKDmJ5dGVzLmNvbnRhaW5zGlohdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSpwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YCSADKAxCZsJIYwphCgxieXRlcy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLrAQoCaXAYCiABKAhC3AHCSNgBCnQKCGJ5dGVzLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5AEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5QEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEtUBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLUAwoJRW51bVJ1bGVzEoIBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIUCgxkZWZpbmVkX29ubHkYAiABKAgSfgoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ1CgZub3RfaW4YBCADKAVCZcJIYgpgCgtlbnVtLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEioKB2V4YW1wbGUYBSADKAVCGcJIFgoUCgxlbnVtLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAiL7AwoNUmVwZWF0ZWRSdWxlcxKeAQoJbWluX2l0ZW1zGAEgASgEQooBwkiGAQqDAQoScmVwZWF0ZWQubWluX2l0ZW1zGm11aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICd2YWx1ZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEqIBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIpkXCg1EdXJhdGlvblJ1bGVzEqEBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJ3wkh0CnIKDmR1cmF0aW9uLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSqAEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQn/CSHwKegoLZHVyYXRpb24ubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASugEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASwQcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQpcHwkiTBwp9CgtkdXJhdGlvbi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDmR1cmF0aW9uLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD2R1cmF0aW9uLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEo0ICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESnQEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnbCSHMKcQoLZHVyYXRpb24uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEpQBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i/QUKDkZpZWxkTWFza1J1bGVzEr8BCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCkwHCSI8BCowBChBmaWVsZF9tYXNrLmNvbnN0Gnh0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICd2YWx1ZSBtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS2QEKAmluGAIgAygJQswBwkjIAQrFAQoNZmllbGRfbWFzay5pbhqzASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICd2YWx1ZSBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEvMBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIikhgKDlRpbWVzdGFtcFJ1bGVzEqMBCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCeMJIdQpzCg90aW1lc3RhbXAuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKrAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQoABwkh9CnsKDHRpbWVzdGFtcC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK8AQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEmwKBmx0X25vdxgHIAEoCEJawkhXClUKEHRpbWVzdGFtcC5sdF9ub3caQShydWxlcy5sdF9ub3cgJiYgdGhpcyA+IG5vdykgPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbm93JyA6ICcnSAASxwcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEpMICgNndGUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQucHwkjjBwqMAQoNdGltZXN0YW1wLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsYBChB0aW1lc3RhbXAuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs4BChp0aW1lc3RhbXAuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1gEKEXRpbWVzdGFtcC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt4BCht0aW1lc3RhbXAuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESbwoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIARK4AQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQowBwkiIAQqFAQoQdGltZXN0YW1wLndpdGhpbhpxdGhpcyA8IG5vdy1ydWxlcy53aXRoaW4gfHwgdGhpcyA+IG5vdytydWxlcy53aXRoaW4gPyAndmFsdWUgbXVzdCBiZSB3aXRoaW4gJXMgb2Ygbm93Jy5mb3JtYXQoW3J1bGVzLndpdGhpbl0pIDogJycSSwoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iOQoKVmlvbGF0aW9ucxIrCgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvbiKfAQoJVmlvbGF0aW9uEiYKBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIlCgRydWxlGAYgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIPCgdydWxlX2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDwoHZm9yX2tleRgEIAEoCEoECAEQAlIKZmllbGRfcGF0aCI9CglGaWVsZFBhdGgSMAoIZWxlbWVudHMYASADKAsyHi5idWYudmFsaWRhdGUuRmllbGRQYXRoRWxlbWVudCLpAgoQRmllbGRQYXRoRWxlbWVudBIUCgxmaWVsZF9udW1iZXIYASABKAUSEgoKZmllbGRfbmFtZRgCIAEoCRI+CgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPAoIa2V5X3R5cGUYBCABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI+Cgp2YWx1ZV90eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSDwoFaW5kZXgYBiABKARIABISCghib29sX2tleRgHIAEoCEgAEhEKB2ludF9rZXkYCCABKANIABISCgh1aW50X2tleRgJIAEoBEgAEhQKCnN0cmluZ19rZXkYCiABKAlIAEILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQrsBChBjb20uYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRlogIDQlZYqgIMQnVmLlZhbGlkYXRlygIMQnVmXFZhbGlkYXRl4gIYQnVmXFZhbGlkYXRlXEdQQk1ldGFkYXRh6gINQnVmOjpWYWxpZGF0ZQ", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + fileDesc("ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSJuCgxNZXNzYWdlUnVsZXMSHwoDY2VsGAMgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSLQoFb25lb2YYBCADKAsyHi5idWYudmFsaWRhdGUuTWVzc2FnZU9uZW9mUnVsZUoECAEQAlIIZGlzYWJsZWQiNAoQTWVzc2FnZU9uZW9mUnVsZRIOCgZmaWVsZHMYASADKAkSEAoIcmVxdWlyZWQYAiABKAgiHgoKT25lb2ZSdWxlcxIQCghyZXF1aXJlZBgBIAEoCCK/CAoKRmllbGRSdWxlcxIfCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZRIQCghyZXF1aXJlZBgZIAEoCBIkCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlEikKBWZsb2F0GAEgASgLMhguYnVmLnZhbGlkYXRlLkZsb2F0UnVsZXNIABIrCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIABIpCgVpbnQzMhgDIAEoCzIYLmJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzSAASKQoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAEisKBnVpbnQzMhgFIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50MzJSdWxlc0gAEisKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAEisKBnNpbnQzMhgHIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50MzJSdWxlc0gAEisKBnNpbnQ2NBgIIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50NjRSdWxlc0gAEi0KB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSAASLQoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIABIvCghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSAASLwoIc2ZpeGVkNjQYDCABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkNjRSdWxlc0gAEicKBGJvb2wYDSABKAsyFy5idWYudmFsaWRhdGUuQm9vbFJ1bGVzSAASKwoGc3RyaW5nGA4gASgLMhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzSAASKQoFYnl0ZXMYDyABKAsyGC5idWYudmFsaWRhdGUuQnl0ZXNSdWxlc0gAEicKBGVudW0YECABKAsyFy5idWYudmFsaWRhdGUuRW51bVJ1bGVzSAASLwoIcmVwZWF0ZWQYEiABKAsyGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlc0gAEiUKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAEiUKA2FueRgUIAEoCzIWLmJ1Zi52YWxpZGF0ZS5BbnlSdWxlc0gAEi8KCGR1cmF0aW9uGBUgASgLMhsuYnVmLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIABIxCgl0aW1lc3RhbXAYFiABKAsyHC5idWYudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAEIGCgR0eXBlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkiVQoPUHJlZGVmaW5lZFJ1bGVzEh8KA2NlbBgBIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHki2hcKCkZsb2F0UnVsZXMSgwEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKfAQoCbHQYAiABKAJCkAHCSIwBCokBCghmbG9hdC5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKvAQoDbHRlGAMgASgCQp8BwkibAQqYAQoJZmxvYXQubHRlGooBIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS7wcKAmd0GAQgASgCQuAHwkjcBwqNAQoIZmxvYXQuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrDAQoLZmxvYXQuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrNAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK0wEKDGZsb2F0Lmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt0BChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK6CAoDZ3RlGAUgASgCQqoIwkimCAqbAQoJZmxvYXQuZ3RlGo0BIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCtIBCgxmbG9hdC5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtwBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwriAQoNZmxvYXQuZ3RlX2x0ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK7AEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygCQnPCSHAKbgoIZmxvYXQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnUKBmZpbml0ZRgIIAEoCEJlwkhiCmAKDGZsb2F0LmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu0XCgtEb3VibGVSdWxlcxKEAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKgAQoCbHQYAiABKAFCkQHCSI0BCooBCglkb3VibGUubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASsAEKA2x0ZRgDIAEoAUKgAcJInAEKmQEKCmRvdWJsZS5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL0BwoCZ3QYBCABKAFC5QfCSOEHCo4BCglkb3VibGUuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrEAQoMZG91YmxlLmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKFmRvdWJsZS5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrUAQoNZG91YmxlLmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt4BChdkb3VibGUuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESvwgKA2d0ZRgFIAEoAUKvCMJIqwgKnAEKCmRvdWJsZS5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0wEKDWRvdWJsZS5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BChdkb3VibGUuZ3RlX2x0X2V4Y2x1c2l2ZRrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK4wEKDmRvdWJsZS5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrtAQoYZG91YmxlLmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoAUJ0wkhxCm8KCWRvdWJsZS5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygBQmfCSGQKYgoNZG91YmxlLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnYKBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDMyUnVsZXMSgwEKBWNvbnN0GAEgASgFQnTCSHEKbwoLaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgFQowBwkiIAQqFAQoJaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoBULTB8JIzwcKiAEKCWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoBUJzwkhwCm4KCGludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKAVCZsJIYwphCgxpbnQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDY0UnVsZXMSgwEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKANCfMJIeQp3CghpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgDQowBwkiIAQqFAQoJaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKANCiAfCSIQHCnoKCGludDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50NjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoA0LTB8JIzwcKiAEKCWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoA0JzwkhwCm4KCGludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAkgAygDQhrCSBcKFQoNaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoDUJ1wkhyCnAKDHVpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoDUJ9wkh6CngKCXVpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgNQo0HwkiJBwp7Cgl1aW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoDUJ0wkhxCm8KCXVpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoBEJ1wkhyCnAKDHVpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoBEJ9wkh6CngKCXVpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgEQo0HwkiJBwp7Cgl1aW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoBEJ0wkhxCm8KCXVpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKARCG8JIGAoWCg51aW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoEUJ1wkhyCnAKDHNpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEUJ9wkh6CngKCXNpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgRQo0HwkiJBwp7CglzaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEUJ0wkhxCm8KCXNpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBFCG8JIGAoWCg5zaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoEkJ1wkhyCnAKDHNpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEkJ9wkh6CngKCXNpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgSQo0HwkiJBwp7CglzaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEkJ0wkhxCm8KCXNpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4irxUKDEZpeGVkMzJSdWxlcxKFAQoFY29uc3QYASABKAdCdsJIcwpxCg1maXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjAEKAmx0GAIgASgHQn7CSHsKeQoKZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKeAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqEHCgJndBgEIAEoB0KSB8JIjgcKfAoKZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtQEKDWZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BChdmaXhlZDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsUBCg5maXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzQEKGGZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES7QcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgQEKAmluGAYgAygHQnXCSHIKcAoKZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeAoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxItCgdleGFtcGxlGAggAygHQhzCSBkKFwoPZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQ2NFJ1bGVzEoUBCgVjb25zdBgBIAEoBkJ2wkhzCnEKDWZpeGVkNjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAZCfsJIewp5CgpmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgGQpIHwkiOBwp8CgpmaXhlZDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkNjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAZCdcJIcgpwCgpmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAZCHMJIGQoXCg9maXhlZDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQzMlJ1bGVzEoYBCgVjb25zdBgBIAEoD0J3wkh0CnIKDnNmaXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgPQn/CSHwKegoLc2ZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgPQpcHwkiTBwp9CgtzZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygPQnbCSHMKcQoLc2ZpeGVkMzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoD0JpwkhmCmQKD3NmaXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKA9CHcJIGgoYChBzZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLAFQoNU0ZpeGVkNjRSdWxlcxKGAQoFY29uc3QYASABKBBCd8JIdApyCg5zZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEo0BCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp8BCgNsdGUYAyABKBBCjwHCSIsBCogBCgxzZml4ZWQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqYHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLyBwoDZ3RlGAUgASgQQuIHwkjeBwqLAQoMc2ZpeGVkNjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxQEKD3NmaXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoZc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1QEKEHNmaXhlZDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3QEKGnNmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoIBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ5CgZub3RfaW4YByADKBBCacJIZgpkCg9zZml4ZWQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ixwEKCUJvb2xSdWxlcxKCAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSKgoHZXhhbXBsZRgCIAMoCEIZwkgWChQKDGJvb2wuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIpA3CgtTdHJpbmdSdWxlcxKGAQoFY29uc3QYASABKAlCd8JIdApyCgxzdHJpbmcuY29uc3QaYnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgYCVzYCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEn4KA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSmQEKB21pbl9sZW4YAiABKARChwHCSIMBCoABCg5zdHJpbmcubWluX2xlbhpudWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSlwEKB21heF9sZW4YAyABKARChQHCSIEBCn8KDnN0cmluZy5tYXhfbGVuGm11aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpsBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJycSowEKCW1pbl9ieXRlcxgEIAEoBEKPAcJIiwEKiAEKEHN0cmluZy5taW5fYnl0ZXMadHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fYnl0ZXNdKSA6ICcnEqIBCgltYXhfYnl0ZXMYBSABKARCjgHCSIoBCocBChBzdHJpbmcubWF4X2J5dGVzGnN1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPiBydWxlcy5tYXhfYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfYnl0ZXNdKSA6ICcnEo0BCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoQBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEoIBCgZzdWZmaXgYCCABKAlCcsJIbwptCg1zdHJpbmcuc3VmZml4GlwhdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4IGAlc2AnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxKQAQoIY29udGFpbnMYCSABKAlCfsJIewp5Cg9zdHJpbmcuY29udGFpbnMaZiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKYAQoMbm90X2NvbnRhaW5zGBcgASgJQoEBwkh+CnwKE3N0cmluZy5ub3RfY29udGFpbnMaZXRoaXMuY29udGFpbnMocnVsZXMubm90X2NvbnRhaW5zKSA/ICd2YWx1ZSBjb250YWlucyBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5ub3RfY29udGFpbnNdKSA6ICcnEoABCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAsgAygJQmfCSGQKYgoNc3RyaW5nLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEt8BCgVlbWFpbBgMIAEoCELNAcJIyQEKYQoMc3RyaW5nLmVtYWlsEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLnAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLHAQoCaXAYDiABKAhCuAHCSLQBClUKCXN0cmluZy5pcBIgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjQYDyABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY0EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtYBCgRpcHY2GBAgASgIQsUBwkjBAQpcCgtzdHJpbmcuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK/AQoDdXJpGBEgASgIQq8BwkirAQpRCgpzdHJpbmcudXJpEhl2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEnAKB3VyaV9yZWYYEiABKAhCXcJIWgpYCg5zdHJpbmcudXJpX3JlZhIjdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEpACCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSAASmAIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAEvABCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAEpYCChFpcF93aXRoX3ByZWZpeGxlbhgaIAEoCEL4AcJI9AEKeAoYc3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuEh92YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgcHJlZml4GjshcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoKQp4Ch5zdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW5fZW1wdHkSLnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBwcmVmaXgaJiFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAASzwIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2Nl93aXRoX3ByZWZpeGxlbhgcIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNikKkgEKIHN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEvIBCglpcF9wcmVmaXgYHSABKAhC3AHCSNgBCmwKEHN0cmluZy5pcF9wcmVmaXgSH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaNyFydWxlcy5pcF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgodHJ1ZSkKaAoWc3RyaW5nLmlwX3ByZWZpeF9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBoeIXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEoMCCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIABK1AgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIABKoBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIuoQCgpCeXRlc1J1bGVzEoABCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSeAoDbGVuGA0gASgEQmvCSGgKZgoJYnl0ZXMubGVuGll1aW50KHRoaXMuc2l6ZSgpKSAhPSBydWxlcy5sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKQAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKIAQoHbWF4X2xlbhgDIAEoBEJ3wkh0CnIKDWJ5dGVzLm1heF9sZW4aYXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSkAEKB3BhdHRlcm4YBCABKAlCf8JIfAp6Cg1ieXRlcy5wYXR0ZXJuGmkhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSgQEKBnByZWZpeBgFIAEoDEJxwkhuCmwKDGJ5dGVzLnByZWZpeBpcIXRoaXMuc3RhcnRzV2l0aChydWxlcy5wcmVmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgcHJlZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSfwoGc3VmZml4GAYgASgMQm/CSGwKagoMYnl0ZXMuc3VmZml4GlohdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnN1ZmZpeF0pIDogJycSgwEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKnAQoCaW4YCCADKAxCmgHCSJYBCpMBCghieXRlcy5pbhqGAWdldEZpZWxkKHJ1bGVzLCAnaW4nKS5zaXplKCkgPiAwICYmICEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgJIAMoDEJmwkhjCmEKDGJ5dGVzLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEusBCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIABLkAQoEaXB2NBgLIAEoCELTAcJIzwEKZQoKYnl0ZXMuaXB2NBIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcxozIXJ1bGVzLmlwdjQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0CmYKEGJ5dGVzLmlwdjRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MaHyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpICE9IDBIABLlAQoEaXB2NhgMIAEoCELUAcJI0AEKZgoKYnl0ZXMuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxo0IXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpmChBieXRlcy5pcHY2X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzGh8hcnVsZXMuaXB2NiB8fCB0aGlzLnNpemUoKSAhPSAwSAASKwoHZXhhbXBsZRgOIAMoDEIawkgXChUKDWJ5dGVzLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duItQDCglFbnVtUnVsZXMSggEKBWNvbnN0GAEgASgFQnPCSHAKbgoKZW51bS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ+CgJpbhgDIAMoBUJywkhvCm0KB2VudW0uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnUKBm5vdF9pbhgEIAMoBUJlwkhiCmAKC2VudW0ubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIvsDCg1SZXBlYXRlZFJ1bGVzEp4BCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJycSogEKCW1heF9pdGVtcxgCIAEoBEKOAcJIigEKhwEKEnJlcGVhdGVkLm1heF9pdGVtcxpxdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfaXRlbXMgPyAndmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAlcyBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1heF9pdGVtc10pIDogJycScAoGdW5pcXVlGAMgASgIQmDCSF0KWwoPcmVwZWF0ZWQudW5pcXVlEihyZXBlYXRlZCB2YWx1ZSBtdXN0IGNvbnRhaW4gdW5pcXVlIGl0ZW1zGh4hcnVsZXMudW5pcXVlIHx8IHRoaXMudW5pcXVlKCkSJwoFaXRlbXMYBCABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlcyoJCOgHEICAgIACIooDCghNYXBSdWxlcxKPAQoJbWluX3BhaXJzGAEgASgEQnzCSHkKdwoNbWFwLm1pbl9wYWlycxpmdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbGVhc3QgJWQgZW50cmllcycuZm9ybWF0KFtydWxlcy5taW5fcGFpcnNdKSA6ICcnEo4BCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJxImCgRrZXlzGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMSKAoGdmFsdWVzGAUgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiImCghBbnlSdWxlcxIKCgJpbhgCIAMoCRIOCgZub3RfaW4YAyADKAkimRcKDUR1cmF0aW9uUnVsZXMSoQEKBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnfCSHQKcgoOZHVyYXRpb24uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKoAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK6AQoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQo8BwkiLAQqIAQoMZHVyYXRpb24ubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLBBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESjQgKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkLiB8JI3gcKiwEKDGR1cmF0aW9uLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9kdXJhdGlvbi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGWR1cmF0aW9uLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBkdXJhdGlvbi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpkdXJhdGlvbi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKdAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSlAEKBm5vdF9pbhgIIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJpwkhmCmQKD2R1cmF0aW9uLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEkkKB2V4YW1wbGUYCSADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CHcJIGgoYChBkdXJhdGlvbi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKSGAoOVGltZXN0YW1wUnVsZXMSowEKBWNvbnN0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEJ4wkh1CnMKD3RpbWVzdGFtcC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqsBCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErwBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpABwkiMAQqJAQoNdGltZXN0YW1wLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASbAoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABLHBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpwHwkiYBwp+Cgx0aW1lc3RhbXAuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrcBCg90aW1lc3RhbXAuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr8BChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxwEKEHRpbWVzdGFtcC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs8BChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESkwgKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBC5wfCSOMHCowBCg10aW1lc3RhbXAuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxgEKEHRpbWVzdGFtcC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrWAQoRdGltZXN0YW1wLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3gEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJvCgZndF9ub3cYCCABKAhCXcJIWgpYChB0aW1lc3RhbXAuZ3Rfbm93GkQocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErgBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CjAHCSIgBCoUBChB0aW1lc3RhbXAud2l0aGluGnF0aGlzIDwgbm93LXJ1bGVzLndpdGhpbiB8fCB0aGlzID4gbm93K3J1bGVzLndpdGhpbiA/ICd2YWx1ZSBtdXN0IGJlIHdpdGhpbiAlcyBvZiBub3cnLmZvcm1hdChbcnVsZXMud2l0aGluXSkgOiAnJxJLCgdleGFtcGxlGAogAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIewkgbChkKEXRpbWVzdGFtcC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiI5CgpWaW9sYXRpb25zEisKCnZpb2xhdGlvbnMYASADKAsyFy5idWYudmFsaWRhdGUuVmlvbGF0aW9uIp8BCglWaW9sYXRpb24SJgoFZmllbGQYBSABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEiUKBHJ1bGUYBiABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEg8KB3J1bGVfaWQYAiABKAkSDwoHbWVzc2FnZRgDIAEoCRIPCgdmb3Jfa2V5GAQgASgISgQIARACUgpmaWVsZF9wYXRoIj0KCUZpZWxkUGF0aBIwCghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50IukCChBGaWVsZFBhdGhFbGVtZW50EhQKDGZpZWxkX251bWJlchgBIAEoBRISCgpmaWVsZF9uYW1lGAIgASgJEj4KCmZpZWxkX3R5cGUYAyABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI8CghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEj4KCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIPCgVpbmRleBgGIAEoBEgAEhIKCGJvb2xfa2V5GAcgASgISAASEQoHaW50X2tleRgIIAEoA0gAEhIKCHVpbnRfa2V5GAkgASgESAASFAoKc3RyaW5nX2tleRgKIAEoCUgAQgsKCXN1YnNjcmlwdCqhAQoGSWdub3JlEhYKEklHTk9SRV9VTlNQRUNJRklFRBAAEhgKFElHTk9SRV9JRl9aRVJPX1ZBTFVFEAESEQoNSUdOT1JFX0FMV0FZUxADIgQIAhACKgxJR05PUkVfRU1QVFkqDklHTk9SRV9ERUZBVUxUKhdJR05PUkVfSUZfREVGQVVMVF9WQUxVRSoVSUdOT1JFX0lGX1VOUE9QVUxBVEVEKm4KCktub3duUmVnZXgSGwoXS05PV05fUkVHRVhfVU5TUEVDSUZJRUQQABIgChxLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FEAESIQodS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFMVUUQAjpWCgdtZXNzYWdlEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIcJIAEoCzIaLmJ1Zi52YWxpZGF0ZS5NZXNzYWdlUnVsZXNSB21lc3NhZ2U6TgoFb25lb2YSHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5PbmVvZlJ1bGVzUgVvbmVvZjpOCgVmaWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWZpZWxkOl0KCnByZWRlZmluZWQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIgJIAEoCzIdLmJ1Zi52YWxpZGF0ZS5QcmVkZWZpbmVkUnVsZXNSCnByZWRlZmluZWRCuwEKEGNvbS5idWYudmFsaWRhdGVCDVZhbGlkYXRlUHJvdG9QAVpHYnVmLmJ1aWxkL2dlbi9nby9idWZidWlsZC9wcm90b3ZhbGlkYXRlL3Byb3RvY29sYnVmZmVycy9nby9idWYvdmFsaWRhdGWiAgNCVliqAgxCdWYuVmFsaWRhdGXKAgxCdWZcVmFsaWRhdGXiAhhCdWZcVmFsaWRhdGVcR1BCTWV0YWRhdGHqAg1CdWY6OlZhbGlkYXRl", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp]); /** * `Rule` represents a validation rule written in the Common Expression @@ -91,30 +91,6 @@ export const RuleSchema: GenMessage = /*@__PURE__*/ * @generated from message buf.validate.MessageRules */ export type MessageRules = Message<"buf.validate.MessageRules"> & { - /** - * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation - * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax. - * - * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for - * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will - * be same as the `expression`. - * - * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message MyMessage { - * // The field `foo` must be greater than 42. - * option (buf.validate.message).cel_expression = "this.foo > 42"; - * // The field `foo` must be less than 84. - * option (buf.validate.message).cel_expression = "this.foo < 84"; - * optional int32 foo = 1; - * } - * ``` - * - * @generated from field: repeated string cel_expression = 5; - */ - celExpression: string[]; - /** * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message. * These rules are written in Common Expression Language (CEL) syntax. For more information, @@ -257,27 +233,6 @@ export const OneofRulesSchema: GenMessage = /*@__PURE__*/ * @generated from message buf.validate.FieldRules */ export type FieldRules = Message<"buf.validate.FieldRules"> & { - /** - * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation - * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax. - * - * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for - * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will - * be same as the `expression`. - * - * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message MyMessage { - * // The field `value` must be greater than 42. - * optional int32 value = 1 [(buf.validate.field).cel_expression = "this > 42"]; - * } - * ``` - * - * @generated from field: repeated string cel_expression = 29; - */ - celExpression: string[]; - /** * `cel` is a repeated field used to represent a textual expression * in the Common Expression Language (CEL) syntax. For more information, @@ -507,12 +462,6 @@ export type FieldRules = Message<"buf.validate.FieldRules"> & { */ value: DurationRules; case: "duration"; - } | { - /** - * @generated from field: buf.validate.FieldMaskRules field_mask = 28; - */ - value: FieldMaskRules; - case: "fieldMask"; } | { /** * @generated from field: buf.validate.TimestampRules timestamp = 22; @@ -3297,23 +3246,6 @@ export type StringRules = Message<"buf.validate.StringRules"> & { */ value: boolean; case: "hostAndPort"; - } | { - /** - * `ulid` specifies that the field value must be a valid ULID (Universally Unique - * Lexicographically Sortable Identifier) as defined by the [ULID specification](https://github.com/ulid/spec). - * If the field value isn't a valid ULID, an error message will be generated. - * - * ```proto - * message MyString { - * // value must be a valid ULID - * string value = 1 [(buf.validate.field).string.ulid = true]; - * } - * ``` - * - * @generated from field: bool ulid = 35; - */ - value: boolean; - case: "ulid"; } | { /** * `well_known_regex` specifies a common well-known pattern @@ -3511,7 +3443,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * the string. * If the field value doesn't meet the requirement, an error message is generated. * - * ```proto + * ```protobuf * message MyBytes { * // value does not contain \x02\x03 * optional bytes value = 1 [(buf.validate.field).bytes.contains = "\x02\x03"]; @@ -3527,7 +3459,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * values. If the field value doesn't match any of the specified values, an * error message is generated. * - * ```proto + * ```protobuf * message MyBytes { * // value must in ["\x01\x02", "\x02\x03", "\x03\x04"] * optional bytes value = 1 [(buf.validate.field).bytes.in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; @@ -3608,25 +3540,6 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { */ value: boolean; case: "ipv6"; - } | { - /** - * `uuid` ensures that the field `value` encodes the 128-bit UUID data as - * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). - * The field must contain exactly 16 bytes - * representing the UUID. If the field value isn't a valid UUID, an error - * message will be generated. - * - * ```proto - * message MyBytes { - * // value must be a valid UUID - * optional bytes value = 1 [(buf.validate.field).bytes.uuid = true]; - * } - * ``` - * - * @generated from field: bool uuid = 15; - */ - value: boolean; - case: "uuid"; } | { case: undefined; value?: undefined }; /** @@ -4175,96 +4088,6 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { export const DurationRulesSchema: GenMessage = /*@__PURE__*/ messageDesc(file_buf_validate_validate, 25); -/** - * FieldMaskRules describe rules applied exclusively to the `google.protobuf.FieldMask` well-known type. - * - * @generated from message buf.validate.FieldMaskRules - */ -export type FieldMaskRules = Message<"buf.validate.FieldMaskRules"> & { - /** - * `const` dictates that the field must match the specified value of the `google.protobuf.FieldMask` type exactly. - * If the field's value deviates from the specified value, an error message - * will be generated. - * - * ```proto - * message MyFieldMask { - * // value must equal ["a"] - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask.const = { - * paths: ["a"] - * }]; - * } - * ``` - * - * @generated from field: optional google.protobuf.FieldMask const = 1; - */ - const?: FieldMask; - - /** - * `in` requires the field value to only contain paths matching specified - * values or their subpaths. - * If any of the field value's paths doesn't match the rule, - * an error message is generated. - * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask - * - * ```proto - * message MyFieldMask { - * // The `value` FieldMask must only contain paths listed in `in`. - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = { - * in: ["a", "b", "c.a"] - * }]; - * } - * ``` - * - * @generated from field: repeated string in = 2; - */ - in: string[]; - - /** - * `not_in` requires the field value to not contain paths matching specified - * values or their subpaths. - * If any of the field value's paths matches the rule, - * an error message is generated. - * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask - * - * ```proto - * message MyFieldMask { - * // The `value` FieldMask shall not contain paths listed in `not_in`. - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = { - * not_in: ["forbidden", "immutable", "c.a"] - * }]; - * } - * ``` - * - * @generated from field: repeated string not_in = 3; - */ - notIn: string[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyFieldMask { - * google.protobuf.FieldMask value = 1 [ - * (buf.validate.field).field_mask.example = { paths: ["a", "b"] }, - * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] }, - * ]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.FieldMask example = 4; - */ - example: FieldMask[]; -}; - -/** - * Describes the message buf.validate.FieldMaskRules. - * Use `create(FieldMaskRulesSchema)` to create a new message. - */ -export const FieldMaskRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 26); - /** * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type. * @@ -4443,7 +4266,7 @@ export type TimestampRules = Message<"buf.validate.TimestampRules"> & { * Use `create(TimestampRulesSchema)` to create a new message. */ export const TimestampRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 27); + messageDesc(file_buf_validate_validate, 26); /** * `Violations` is a collection of `Violation` messages. This message type is returned by @@ -4466,7 +4289,7 @@ export type Violations = Message<"buf.validate.Violations"> & { * Use `create(ViolationsSchema)` to create a new message. */ export const ViolationsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 28); + messageDesc(file_buf_validate_validate, 27); /** * `Violation` represents a single instance where a validation rule, expressed @@ -4604,7 +4427,7 @@ export type Violation = Message<"buf.validate.Violation"> & { * Use `create(ViolationSchema)` to create a new message. */ export const ViolationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 29); + messageDesc(file_buf_validate_validate, 28); /** * `FieldPath` provides a path to a nested protobuf field. @@ -4628,7 +4451,7 @@ export type FieldPath = Message<"buf.validate.FieldPath"> & { * Use `create(FieldPathSchema)` to create a new message. */ export const FieldPathSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 30); + messageDesc(file_buf_validate_validate, 29); /** * `FieldPathElement` provides enough information to nest through a single protobuf field. @@ -4741,7 +4564,7 @@ export type FieldPathElement = Message<"buf.validate.FieldPathElement"> & { * Use `create(FieldPathElementSchema)` to create a new message. */ export const FieldPathElementSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 31); + messageDesc(file_buf_validate_validate, 30); /** * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and diff --git a/frontend/src/protogen/google/api/client_pb.ts b/frontend/src/protogen/google/api/client_pb.ts new file mode 100644 index 0000000000..4b6d969616 --- /dev/null +++ b/frontend/src/protogen/google/api/client_pb.ts @@ -0,0 +1,953 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file google/api/client.proto (package google.api, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenExtension, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { LaunchStage } from "./launch_stage_pb"; +import { file_google_api_launch_stage } from "./launch_stage_pb"; +import type { Duration, MethodOptions, ServiceOptions } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_descriptor, file_google_protobuf_duration } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file google/api/client.proto. + */ +export const file_google_api_client: GenFile = /*@__PURE__*/ + fileDesc("Chdnb29nbGUvYXBpL2NsaWVudC5wcm90bxIKZ29vZ2xlLmFwaSK+AQoWQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxIeChJyZWZlcmVuY2VfZG9jc191cmkYASABKAlCAhgBEjoKDGRlc3RpbmF0aW9ucxgCIAMoDjIkLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeURlc3RpbmF0aW9uEkgKGnNlbGVjdGl2ZV9nYXBpY19nZW5lcmF0aW9uGAMgASgLMiQuZ29vZ2xlLmFwaS5TZWxlY3RpdmVHYXBpY0dlbmVyYXRpb24i+wMKFUNsaWVudExpYnJhcnlTZXR0aW5ncxIPCgd2ZXJzaW9uGAEgASgJEi0KDGxhdW5jaF9zdGFnZRgCIAEoDjIXLmdvb2dsZS5hcGkuTGF1bmNoU3RhZ2USGgoScmVzdF9udW1lcmljX2VudW1zGAMgASgIEi8KDWphdmFfc2V0dGluZ3MYFSABKAsyGC5nb29nbGUuYXBpLkphdmFTZXR0aW5ncxItCgxjcHBfc2V0dGluZ3MYFiABKAsyFy5nb29nbGUuYXBpLkNwcFNldHRpbmdzEi0KDHBocF9zZXR0aW5ncxgXIAEoCzIXLmdvb2dsZS5hcGkuUGhwU2V0dGluZ3MSMwoPcHl0aG9uX3NldHRpbmdzGBggASgLMhouZ29vZ2xlLmFwaS5QeXRob25TZXR0aW5ncxIvCg1ub2RlX3NldHRpbmdzGBkgASgLMhguZ29vZ2xlLmFwaS5Ob2RlU2V0dGluZ3MSMwoPZG90bmV0X3NldHRpbmdzGBogASgLMhouZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncxIvCg1ydWJ5X3NldHRpbmdzGBsgASgLMhguZ29vZ2xlLmFwaS5SdWJ5U2V0dGluZ3MSKwoLZ29fc2V0dGluZ3MYHCABKAsyFi5nb29nbGUuYXBpLkdvU2V0dGluZ3MiqAMKClB1Ymxpc2hpbmcSMwoPbWV0aG9kX3NldHRpbmdzGAIgAygLMhouZ29vZ2xlLmFwaS5NZXRob2RTZXR0aW5ncxIVCg1uZXdfaXNzdWVfdXJpGGUgASgJEhkKEWRvY3VtZW50YXRpb25fdXJpGGYgASgJEhYKDmFwaV9zaG9ydF9uYW1lGGcgASgJEhQKDGdpdGh1Yl9sYWJlbBhoIAEoCRIeChZjb2Rlb3duZXJfZ2l0aHViX3RlYW1zGGkgAygJEhYKDmRvY190YWdfcHJlZml4GGogASgJEjsKDG9yZ2FuaXphdGlvbhhrIAEoDjIlLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeU9yZ2FuaXphdGlvbhI7ChBsaWJyYXJ5X3NldHRpbmdzGG0gAygLMiEuZ29vZ2xlLmFwaS5DbGllbnRMaWJyYXJ5U2V0dGluZ3MSKQohcHJvdG9fcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG4gASgJEigKIHJlc3RfcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG8gASgJIuMBCgxKYXZhU2V0dGluZ3MSFwoPbGlicmFyeV9wYWNrYWdlGAEgASgJEkwKE3NlcnZpY2VfY2xhc3NfbmFtZXMYAiADKAsyLy5nb29nbGUuYXBpLkphdmFTZXR0aW5ncy5TZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EjIKBmNvbW1vbhgDIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxo4ChZTZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiQQoLQ3BwU2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzIkEKC1BocFNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncyKbAgoOUHl0aG9uU2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzEk4KFWV4cGVyaW1lbnRhbF9mZWF0dXJlcxgCIAEoCzIvLmdvb2dsZS5hcGkuUHl0aG9uU2V0dGluZ3MuRXhwZXJpbWVudGFsRmVhdHVyZXMahAEKFEV4cGVyaW1lbnRhbEZlYXR1cmVzEh0KFXJlc3RfYXN5bmNfaW9fZW5hYmxlZBgBIAEoCBInCh9wcm90b2J1Zl9weXRob25pY190eXBlc19lbmFibGVkGAIgASgIEiQKHHVudmVyc2lvbmVkX3BhY2thZ2VfZGlzYWJsZWQYAyABKAgiQgoMTm9kZVNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncyKqAwoORG90bmV0U2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzEkkKEHJlbmFtZWRfc2VydmljZXMYAiADKAsyLy5nb29nbGUuYXBpLkRvdG5ldFNldHRpbmdzLlJlbmFtZWRTZXJ2aWNlc0VudHJ5EksKEXJlbmFtZWRfcmVzb3VyY2VzGAMgAygLMjAuZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncy5SZW5hbWVkUmVzb3VyY2VzRW50cnkSGQoRaWdub3JlZF9yZXNvdXJjZXMYBCADKAkSIAoYZm9yY2VkX25hbWVzcGFjZV9hbGlhc2VzGAUgAygJEh4KFmhhbmR3cml0dGVuX3NpZ25hdHVyZXMYBiADKAkaNgoUUmVuYW1lZFNlcnZpY2VzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo3ChVSZW5hbWVkUmVzb3VyY2VzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgxSdWJ5U2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzIr8BCgpHb1NldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxJFChByZW5hbWVkX3NlcnZpY2VzGAIgAygLMisuZ29vZ2xlLmFwaS5Hb1NldHRpbmdzLlJlbmFtZWRTZXJ2aWNlc0VudHJ5GjYKFFJlbmFtZWRTZXJ2aWNlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEizwIKDk1ldGhvZFNldHRpbmdzEhAKCHNlbGVjdG9yGAEgASgJEjwKDGxvbmdfcnVubmluZxgCIAEoCzImLmdvb2dsZS5hcGkuTWV0aG9kU2V0dGluZ3MuTG9uZ1J1bm5pbmcSHQoVYXV0b19wb3B1bGF0ZWRfZmllbGRzGAMgAygJGs0BCgtMb25nUnVubmluZxI1ChJpbml0aWFsX3BvbGxfZGVsYXkYASABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SHQoVcG9sbF9kZWxheV9tdWx0aXBsaWVyGAIgASgCEjEKDm1heF9wb2xsX2RlbGF5GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEjUKEnRvdGFsX3BvbGxfdGltZW91dBgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiJRChhTZWxlY3RpdmVHYXBpY0dlbmVyYXRpb24SDwoHbWV0aG9kcxgBIAMoCRIkChxnZW5lcmF0ZV9vbWl0dGVkX2FzX2ludGVybmFsGAIgASgIKqMBChlDbGllbnRMaWJyYXJ5T3JnYW5pemF0aW9uEisKJ0NMSUVOVF9MSUJSQVJZX09SR0FOSVpBVElPTl9VTlNQRUNJRklFRBAAEgkKBUNMT1VEEAESBwoDQURTEAISCgoGUEhPVE9TEAMSDwoLU1RSRUVUX1ZJRVcQBBIMCghTSE9QUElORxAFEgcKA0dFTxAGEhEKDUdFTkVSQVRJVkVfQUkQBypnChhDbGllbnRMaWJyYXJ5RGVzdGluYXRpb24SKgomQ0xJRU5UX0xJQlJBUllfREVTVElOQVRJT05fVU5TUEVDSUZJRUQQABIKCgZHSVRIVUIQChITCg9QQUNLQUdFX01BTkFHRVIQFDpKChBtZXRob2Rfc2lnbmF0dXJlEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYmwggAygJUg9tZXRob2RTaWduYXR1cmU6QwoMZGVmYXVsdF9ob3N0Eh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJkIIAEoCVILZGVmYXVsdEhvc3Q6QwoMb2F1dGhfc2NvcGVzEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJoIIAEoCVILb2F1dGhTY29wZXM6RAoLYXBpX3ZlcnNpb24SHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMYwbqr+gEgASgJUgphcGlWZXJzaW9uQqkBCg5jb20uZ29vZ2xlLmFwaUILQ2xpZW50UHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgNHQViqAgpHb29nbGUuQXBpygIKR29vZ2xlXEFwaeICFkdvb2dsZVxBcGlcR1BCTWV0YWRhdGHqAgtHb29nbGU6OkFwaWIGcHJvdG8z", [file_google_api_launch_stage, file_google_protobuf_descriptor, file_google_protobuf_duration]); + +/** + * Required information for every language. + * + * @generated from message google.api.CommonLanguageSettings + */ +export type CommonLanguageSettings = Message<"google.api.CommonLanguageSettings"> & { + /** + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * + * @generated from field: string reference_docs_uri = 1 [deprecated = true]; + * @deprecated + */ + referenceDocsUri: string; + + /** + * The destination where API teams want this client library to be published. + * + * @generated from field: repeated google.api.ClientLibraryDestination destinations = 2; + */ + destinations: ClientLibraryDestination[]; + + /** + * Configuration for which RPCs should be generated in the GAPIC client. + * + * @generated from field: google.api.SelectiveGapicGeneration selective_gapic_generation = 3; + */ + selectiveGapicGeneration?: SelectiveGapicGeneration; +}; + +/** + * Describes the message google.api.CommonLanguageSettings. + * Use `create(CommonLanguageSettingsSchema)` to create a new message. + */ +export const CommonLanguageSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 0); + +/** + * Details about how and where to publish client libraries. + * + * @generated from message google.api.ClientLibrarySettings + */ +export type ClientLibrarySettings = Message<"google.api.ClientLibrarySettings"> & { + /** + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + * + * @generated from field: string version = 1; + */ + version: string; + + /** + * Launch stage of this version of the API. + * + * @generated from field: google.api.LaunchStage launch_stage = 2; + */ + launchStage: LaunchStage; + + /** + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + * + * @generated from field: bool rest_numeric_enums = 3; + */ + restNumericEnums: boolean; + + /** + * Settings for legacy Java features, supported in the Service YAML. + * + * @generated from field: google.api.JavaSettings java_settings = 21; + */ + javaSettings?: JavaSettings; + + /** + * Settings for C++ client libraries. + * + * @generated from field: google.api.CppSettings cpp_settings = 22; + */ + cppSettings?: CppSettings; + + /** + * Settings for PHP client libraries. + * + * @generated from field: google.api.PhpSettings php_settings = 23; + */ + phpSettings?: PhpSettings; + + /** + * Settings for Python client libraries. + * + * @generated from field: google.api.PythonSettings python_settings = 24; + */ + pythonSettings?: PythonSettings; + + /** + * Settings for Node client libraries. + * + * @generated from field: google.api.NodeSettings node_settings = 25; + */ + nodeSettings?: NodeSettings; + + /** + * Settings for .NET client libraries. + * + * @generated from field: google.api.DotnetSettings dotnet_settings = 26; + */ + dotnetSettings?: DotnetSettings; + + /** + * Settings for Ruby client libraries. + * + * @generated from field: google.api.RubySettings ruby_settings = 27; + */ + rubySettings?: RubySettings; + + /** + * Settings for Go client libraries. + * + * @generated from field: google.api.GoSettings go_settings = 28; + */ + goSettings?: GoSettings; +}; + +/** + * Describes the message google.api.ClientLibrarySettings. + * Use `create(ClientLibrarySettingsSchema)` to create a new message. + */ +export const ClientLibrarySettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 1); + +/** + * This message configures the settings for publishing [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from the service config. + * + * @generated from message google.api.Publishing + */ +export type Publishing = Message<"google.api.Publishing"> & { + /** + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + * + * @generated from field: repeated google.api.MethodSettings method_settings = 2; + */ + methodSettings: MethodSettings[]; + + /** + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + * + * @generated from field: string new_issue_uri = 101; + */ + newIssueUri: string; + + /** + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + * + * @generated from field: string documentation_uri = 102; + */ + documentationUri: string; + + /** + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + * + * @generated from field: string api_short_name = 103; + */ + apiShortName: string; + + /** + * GitHub label to apply to issues and pull requests opened for this API. + * + * @generated from field: string github_label = 104; + */ + githubLabel: string; + + /** + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + * + * @generated from field: repeated string codeowner_github_teams = 105; + */ + codeownerGithubTeams: string[]; + + /** + * A prefix used in sample code when demarking regions to be included in + * documentation. + * + * @generated from field: string doc_tag_prefix = 106; + */ + docTagPrefix: string; + + /** + * For whom the client library is being published. + * + * @generated from field: google.api.ClientLibraryOrganization organization = 107; + */ + organization: ClientLibraryOrganization; + + /** + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + * + * @generated from field: repeated google.api.ClientLibrarySettings library_settings = 109; + */ + librarySettings: ClientLibrarySettings[]; + + /** + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + * + * @generated from field: string proto_reference_documentation_uri = 110; + */ + protoReferenceDocumentationUri: string; + + /** + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + * + * @generated from field: string rest_reference_documentation_uri = 111; + */ + restReferenceDocumentationUri: string; +}; + +/** + * Describes the message google.api.Publishing. + * Use `create(PublishingSchema)` to create a new message. + */ +export const PublishingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 2); + +/** + * Settings for Java client libraries. + * + * @generated from message google.api.JavaSettings + */ +export type JavaSettings = Message<"google.api.JavaSettings"> & { + /** + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * + * Example of a YAML configuration:: + * + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + * + * @generated from field: string library_package = 1; + */ + libraryPackage: string; + + /** + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * + * Example of a YAML configuration:: + * + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + * + * @generated from field: map service_class_names = 2; + */ + serviceClassNames: { [key: string]: string }; + + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 3; + */ + common?: CommonLanguageSettings; +}; + +/** + * Describes the message google.api.JavaSettings. + * Use `create(JavaSettingsSchema)` to create a new message. + */ +export const JavaSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 3); + +/** + * Settings for C++ client libraries. + * + * @generated from message google.api.CppSettings + */ +export type CppSettings = Message<"google.api.CppSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; +}; + +/** + * Describes the message google.api.CppSettings. + * Use `create(CppSettingsSchema)` to create a new message. + */ +export const CppSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 4); + +/** + * Settings for Php client libraries. + * + * @generated from message google.api.PhpSettings + */ +export type PhpSettings = Message<"google.api.PhpSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; +}; + +/** + * Describes the message google.api.PhpSettings. + * Use `create(PhpSettingsSchema)` to create a new message. + */ +export const PhpSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 5); + +/** + * Settings for Python client libraries. + * + * @generated from message google.api.PythonSettings + */ +export type PythonSettings = Message<"google.api.PythonSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; + + /** + * Experimental features to be included during client library generation. + * + * @generated from field: google.api.PythonSettings.ExperimentalFeatures experimental_features = 2; + */ + experimentalFeatures?: PythonSettings_ExperimentalFeatures; +}; + +/** + * Describes the message google.api.PythonSettings. + * Use `create(PythonSettingsSchema)` to create a new message. + */ +export const PythonSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 6); + +/** + * Experimental features to be included during client library generation. + * These fields will be deprecated once the feature graduates and is enabled + * by default. + * + * @generated from message google.api.PythonSettings.ExperimentalFeatures + */ +export type PythonSettings_ExperimentalFeatures = Message<"google.api.PythonSettings.ExperimentalFeatures"> & { + /** + * Enables generation of asynchronous REST clients if `rest` transport is + * enabled. By default, asynchronous REST clients will not be generated. + * This feature will be enabled by default 1 month after launching the + * feature in preview packages. + * + * @generated from field: bool rest_async_io_enabled = 1; + */ + restAsyncIoEnabled: boolean; + + /** + * Enables generation of protobuf code using new types that are more + * Pythonic which are included in `protobuf>=5.29.x`. This feature will be + * enabled by default 1 month after launching the feature in preview + * packages. + * + * @generated from field: bool protobuf_pythonic_types_enabled = 2; + */ + protobufPythonicTypesEnabled: boolean; + + /** + * Disables generation of an unversioned Python package for this client + * library. This means that the module names will need to be versioned in + * import statements. For example `import google.cloud.library_v2` instead + * of `import google.cloud.library`. + * + * @generated from field: bool unversioned_package_disabled = 3; + */ + unversionedPackageDisabled: boolean; +}; + +/** + * Describes the message google.api.PythonSettings.ExperimentalFeatures. + * Use `create(PythonSettings_ExperimentalFeaturesSchema)` to create a new message. + */ +export const PythonSettings_ExperimentalFeaturesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 6, 0); + +/** + * Settings for Node client libraries. + * + * @generated from message google.api.NodeSettings + */ +export type NodeSettings = Message<"google.api.NodeSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; +}; + +/** + * Describes the message google.api.NodeSettings. + * Use `create(NodeSettingsSchema)` to create a new message. + */ +export const NodeSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 7); + +/** + * Settings for Dotnet client libraries. + * + * @generated from message google.api.DotnetSettings + */ +export type DotnetSettings = Message<"google.api.DotnetSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; + + /** + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + * + * @generated from field: map renamed_services = 2; + */ + renamedServices: { [key: string]: string }; + + /** + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + * + * @generated from field: map renamed_resources = 3; + */ + renamedResources: { [key: string]: string }; + + /** + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + * + * @generated from field: repeated string ignored_resources = 4; + */ + ignoredResources: string[]; + + /** + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + * + * @generated from field: repeated string forced_namespace_aliases = 5; + */ + forcedNamespaceAliases: string[]; + + /** + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + * + * @generated from field: repeated string handwritten_signatures = 6; + */ + handwrittenSignatures: string[]; +}; + +/** + * Describes the message google.api.DotnetSettings. + * Use `create(DotnetSettingsSchema)` to create a new message. + */ +export const DotnetSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 8); + +/** + * Settings for Ruby client libraries. + * + * @generated from message google.api.RubySettings + */ +export type RubySettings = Message<"google.api.RubySettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; +}; + +/** + * Describes the message google.api.RubySettings. + * Use `create(RubySettingsSchema)` to create a new message. + */ +export const RubySettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 9); + +/** + * Settings for Go client libraries. + * + * @generated from message google.api.GoSettings + */ +export type GoSettings = Message<"google.api.GoSettings"> & { + /** + * Some settings. + * + * @generated from field: google.api.CommonLanguageSettings common = 1; + */ + common?: CommonLanguageSettings; + + /** + * Map of service names to renamed services. Keys are the package relative + * service names and values are the name to be used for the service client + * and call options. + * + * publishing: + * go_settings: + * renamed_services: + * Publisher: TopicAdmin + * + * @generated from field: map renamed_services = 2; + */ + renamedServices: { [key: string]: string }; +}; + +/** + * Describes the message google.api.GoSettings. + * Use `create(GoSettingsSchema)` to create a new message. + */ +export const GoSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 10); + +/** + * Describes the generator configuration for a method. + * + * @generated from message google.api.MethodSettings + */ +export type MethodSettings = Message<"google.api.MethodSettings"> & { + /** + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * + * Example: + * + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + * + * @generated from field: string selector = 1; + */ + selector: string; + + /** + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * + * Example of a YAML configuration:: + * + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + * + * @generated from field: google.api.MethodSettings.LongRunning long_running = 2; + */ + longRunning?: MethodSettings_LongRunning; + + /** + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * + * Example of a YAML configuration: + * + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + * + * @generated from field: repeated string auto_populated_fields = 3; + */ + autoPopulatedFields: string[]; +}; + +/** + * Describes the message google.api.MethodSettings. + * Use `create(MethodSettingsSchema)` to create a new message. + */ +export const MethodSettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 11); + +/** + * Describes settings to use when generating API methods that use the + * long-running operation pattern. + * All default values below are from those used in the client library + * generators (e.g. + * [Java](https://github.com/googleapis/gapic-generator-java/blob/04c2faa191a9b5a10b92392fe8482279c4404803/src/main/java/com/google/api/generator/gapic/composer/common/RetrySettingsComposer.java)). + * + * @generated from message google.api.MethodSettings.LongRunning + */ +export type MethodSettings_LongRunning = Message<"google.api.MethodSettings.LongRunning"> & { + /** + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + * + * @generated from field: google.protobuf.Duration initial_poll_delay = 1; + */ + initialPollDelay?: Duration; + + /** + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + * + * @generated from field: float poll_delay_multiplier = 2; + */ + pollDelayMultiplier: number; + + /** + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + * + * @generated from field: google.protobuf.Duration max_poll_delay = 3; + */ + maxPollDelay?: Duration; + + /** + * Total polling timeout. + * Default value: 5 minutes. + * + * @generated from field: google.protobuf.Duration total_poll_timeout = 4; + */ + totalPollTimeout?: Duration; +}; + +/** + * Describes the message google.api.MethodSettings.LongRunning. + * Use `create(MethodSettings_LongRunningSchema)` to create a new message. + */ +export const MethodSettings_LongRunningSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 11, 0); + +/** + * This message is used to configure the generation of a subset of the RPCs in + * a service for client libraries. + * + * @generated from message google.api.SelectiveGapicGeneration + */ +export type SelectiveGapicGeneration = Message<"google.api.SelectiveGapicGeneration"> & { + /** + * An allowlist of the fully qualified names of RPCs that should be included + * on public client surfaces. + * + * @generated from field: repeated string methods = 1; + */ + methods: string[]; + + /** + * Setting this to true indicates to the client generators that methods + * that would be excluded from the generation should instead be generated + * in a way that indicates these methods should not be consumed by + * end users. How this is expressed is up to individual language + * implementations to decide. Some examples may be: added annotations, + * obfuscated identifiers, or other language idiomatic patterns. + * + * @generated from field: bool generate_omitted_as_internal = 2; + */ + generateOmittedAsInternal: boolean; +}; + +/** + * Describes the message google.api.SelectiveGapicGeneration. + * Use `create(SelectiveGapicGenerationSchema)` to create a new message. + */ +export const SelectiveGapicGenerationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_google_api_client, 12); + +/** + * The organization for which the client libraries are being published. + * Affects the url where generated docs are published, etc. + * + * @generated from enum google.api.ClientLibraryOrganization + */ +export enum ClientLibraryOrganization { + /** + * Not useful. + * + * @generated from enum value: CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0; + */ + CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0, + + /** + * Google Cloud Platform Org. + * + * @generated from enum value: CLOUD = 1; + */ + CLOUD = 1, + + /** + * Ads (Advertising) Org. + * + * @generated from enum value: ADS = 2; + */ + ADS = 2, + + /** + * Photos Org. + * + * @generated from enum value: PHOTOS = 3; + */ + PHOTOS = 3, + + /** + * Street View Org. + * + * @generated from enum value: STREET_VIEW = 4; + */ + STREET_VIEW = 4, + + /** + * Shopping Org. + * + * @generated from enum value: SHOPPING = 5; + */ + SHOPPING = 5, + + /** + * Geo Org. + * + * @generated from enum value: GEO = 6; + */ + GEO = 6, + + /** + * Generative AI - https://developers.generativeai.google + * + * @generated from enum value: GENERATIVE_AI = 7; + */ + GENERATIVE_AI = 7, +} + +/** + * Describes the enum google.api.ClientLibraryOrganization. + */ +export const ClientLibraryOrganizationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_api_client, 0); + +/** + * To where should client libraries be published? + * + * @generated from enum google.api.ClientLibraryDestination + */ +export enum ClientLibraryDestination { + /** + * Client libraries will neither be generated nor published to package + * managers. + * + * @generated from enum value: CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0; + */ + CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0, + + /** + * Generate the client library in a repo under github.com/googleapis, + * but don't publish it to package managers. + * + * @generated from enum value: GITHUB = 10; + */ + GITHUB = 10, + + /** + * Publish the library to package managers like nuget.org and npmjs.com. + * + * @generated from enum value: PACKAGE_MANAGER = 20; + */ + PACKAGE_MANAGER = 20, +} + +/** + * Describes the enum google.api.ClientLibraryDestination. + */ +export const ClientLibraryDestinationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_api_client, 1); + +/** + * A definition of a client library method signature. + * + * In client libraries, each proto RPC corresponds to one or more methods + * which the end user is able to call, and calls the underlying RPC. + * Normally, this method receives a single argument (a struct or instance + * corresponding to the RPC request object). Defining this field will + * add one or more overloads providing flattened or simpler method signatures + * in some languages. + * + * The fields on the method signature are provided as a comma-separated + * string. + * + * For example, the proto RPC and annotation: + * + * rpc CreateSubscription(CreateSubscriptionRequest) + * returns (Subscription) { + * option (google.api.method_signature) = "name,topic"; + * } + * + * Would add the following Java overload (in addition to the method accepting + * the request object): + * + * public final Subscription createSubscription(String name, String topic) + * + * The following backwards-compatibility guidelines apply: + * + * * Adding this annotation to an unannotated method is backwards + * compatible. + * * Adding this annotation to a method which already has existing + * method signature annotations is backwards compatible if and only if + * the new method signature annotation is last in the sequence. + * * Modifying or removing an existing method signature annotation is + * a breaking change. + * * Re-ordering existing method signature annotations is a breaking + * change. + * + * @generated from extension: repeated string method_signature = 1051; + */ +export const method_signature: GenExtension = /*@__PURE__*/ + extDesc(file_google_api_client, 0); + +/** + * The hostname for this service. + * This should be specified with no prefix or protocol. + * + * Example: + * + * service Foo { + * option (google.api.default_host) = "foo.googleapi.com"; + * ... + * } + * + * @generated from extension: string default_host = 1049; + */ +export const default_host: GenExtension = /*@__PURE__*/ + extDesc(file_google_api_client, 1); + +/** + * OAuth scopes needed for the client. + * + * Example: + * + * service Foo { + * option (google.api.oauth_scopes) = \ + * "https://www.googleapis.com/auth/cloud-platform"; + * ... + * } + * + * If there is more than one scope, use a comma-separated string: + * + * Example: + * + * service Foo { + * option (google.api.oauth_scopes) = \ + * "https://www.googleapis.com/auth/cloud-platform," + * "https://www.googleapis.com/auth/monitoring"; + * ... + * } + * + * @generated from extension: string oauth_scopes = 1050; + */ +export const oauth_scopes: GenExtension = /*@__PURE__*/ + extDesc(file_google_api_client, 2); + +/** + * The API version of this service, which should be sent by version-aware + * clients to the service. This allows services to abide by the schema and + * behavior of the service at the time this API version was deployed. + * The format of the API version must be treated as opaque by clients. + * Services may use a format with an apparent structure, but clients must + * not rely on this to determine components within an API version, or attempt + * to construct other valid API versions. Note that this is for upcoming + * functionality and may not be implemented for all services. + * + * Example: + * + * service Foo { + * option (google.api.api_version) = "v1_20230821_preview"; + * } + * + * @generated from extension: string api_version = 525000001; + */ +export const api_version: GenExtension = /*@__PURE__*/ + extDesc(file_google_api_client, 3); + diff --git a/frontend/src/protogen/google/api/launch_stage_pb.ts b/frontend/src/protogen/google/api/launch_stage_pb.ts new file mode 100644 index 0000000000..d208bdfa08 --- /dev/null +++ b/frontend/src/protogen/google/api/launch_stage_pb.ts @@ -0,0 +1,118 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file google/api/launch_stage.proto (package google.api, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; + +/** + * Describes the file google/api/launch_stage.proto. + */ +export const file_google_api_launch_stage: GenFile = /*@__PURE__*/ + fileDesc("Ch1nb29nbGUvYXBpL2xhdW5jaF9zdGFnZS5wcm90bxIKZ29vZ2xlLmFwaSqMAQoLTGF1bmNoU3RhZ2USHAoYTEFVTkNIX1NUQUdFX1VOU1BFQ0lGSUVEEAASEQoNVU5JTVBMRU1FTlRFRBAGEg0KCVBSRUxBVU5DSBAHEhAKDEVBUkxZX0FDQ0VTUxABEgkKBUFMUEhBEAISCAoEQkVUQRADEgYKAkdBEAQSDgoKREVQUkVDQVRFRBAFQpoBCg5jb20uZ29vZ2xlLmFwaUIQTGF1bmNoU3RhZ2VQcm90b1ABWi1nb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaTthcGmiAgNHQViqAgpHb29nbGUuQXBpygIKR29vZ2xlXEFwaeICFkdvb2dsZVxBcGlcR1BCTWV0YWRhdGHqAgtHb29nbGU6OkFwaWIGcHJvdG8z"); + +/** + * The launch stage as defined by [Google Cloud Platform + * Launch Stages](https://cloud.google.com/terms/launch-stages). + * + * @generated from enum google.api.LaunchStage + */ +export enum LaunchStage { + /** + * Do not use this default value. + * + * @generated from enum value: LAUNCH_STAGE_UNSPECIFIED = 0; + */ + LAUNCH_STAGE_UNSPECIFIED = 0, + + /** + * The feature is not yet implemented. Users can not use it. + * + * @generated from enum value: UNIMPLEMENTED = 6; + */ + UNIMPLEMENTED = 6, + + /** + * Prelaunch features are hidden from users and are only visible internally. + * + * @generated from enum value: PRELAUNCH = 7; + */ + PRELAUNCH = 7, + + /** + * Early Access features are limited to a closed group of testers. To use + * these features, you must sign up in advance and sign a Trusted Tester + * agreement (which includes confidentiality provisions). These features may + * be unstable, changed in backward-incompatible ways, and are not + * guaranteed to be released. + * + * @generated from enum value: EARLY_ACCESS = 1; + */ + EARLY_ACCESS = 1, + + /** + * Alpha is a limited availability test for releases before they are cleared + * for widespread use. By Alpha, all significant design issues are resolved + * and we are in the process of verifying functionality. Alpha customers + * need to apply for access, agree to applicable terms, and have their + * projects allowlisted. Alpha releases don't have to be feature complete, + * no SLAs are provided, and there are no technical support obligations, but + * they will be far enough along that customers can actually use them in + * test environments or for limited-use tests -- just like they would in + * normal production cases. + * + * @generated from enum value: ALPHA = 2; + */ + ALPHA = 2, + + /** + * Beta is the point at which we are ready to open a release for any + * customer to use. There are no SLA or technical support obligations in a + * Beta release. Products will be complete from a feature perspective, but + * may have some open outstanding issues. Beta releases are suitable for + * limited production use cases. + * + * @generated from enum value: BETA = 3; + */ + BETA = 3, + + /** + * GA features are open to all developers and are considered stable and + * fully qualified for production use. + * + * @generated from enum value: GA = 4; + */ + GA = 4, + + /** + * Deprecated features are scheduled to be shut down and removed. For more + * information, see the "Deprecation Policy" section of our [Terms of + * Service](https://cloud.google.com/terms/) + * and the [Google Cloud Platform Subject to the Deprecation + * Policy](https://cloud.google.com/terms/deprecation) documentation. + * + * @generated from enum value: DEPRECATED = 5; + */ + DEPRECATED = 5, +} + +/** + * Describes the enum google.api.LaunchStage. + */ +export const LaunchStageSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_google_api_launch_stage, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/access_control-AccessControlService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/access_control-AccessControlService_connectquery.ts new file mode 100644 index 0000000000..d3a0f107a7 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/access_control-AccessControlService_connectquery.ts @@ -0,0 +1,68 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/access_control.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { AccessControlService } from "./access_control_pb"; + +/** + * Creates a new Cedar policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.CreatePolicy + */ +export const createPolicy = AccessControlService.method.createPolicy; + +/** + * Gets a policy by name. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.GetPolicy + */ +export const getPolicy = AccessControlService.method.getPolicy; + +/** + * Lists policies within a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ListPolicies + */ +export const listPolicies = AccessControlService.method.listPolicies; + +/** + * Updates a policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy + */ +export const updatePolicy = AccessControlService.method.updatePolicy; + +/** + * Deletes a policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.DeletePolicy + */ +export const deletePolicy = AccessControlService.method.deletePolicy; + +/** + * Validates a Cedar policy without saving it. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy + */ +export const validatePolicy = AccessControlService.method.validatePolicy; + +/** + * Evaluates an authorization request against policies. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess + */ +export const evaluateAccess = AccessControlService.method.evaluateAccess; + +/** + * Lists policy versions (audit trail). + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions + */ +export const listPolicyVersions = AccessControlService.method.listPolicyVersions; + +/** + * Gets available entities for policy authoring (autocomplete). + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities + */ +export const getPolicyEntities = AccessControlService.method.getPolicyEntities; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/access_control_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/access_control_pb.ts new file mode 100644 index 0000000000..4a0fd44595 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/access_control_pb.ts @@ -0,0 +1,1117 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/access_control.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/access_control.proto. + */ +export const file_redpanda_api_aigateway_v1_access_control: GenFile = /*@__PURE__*/ + fileDesc("Ci5yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2FjY2Vzc19jb250cm9sLnByb3RvEhlyZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxIusFCgxBY2Nlc3NQb2xpY3kSEQoEbmFtZRgBIAEoCUID4EEIEhkKDGRpc3BsYXlfbmFtZRgCIAEoCUID4EECEhgKC2Rlc2NyaXB0aW9uGAMgASgJQgPgQQESGAoLcG9saWN5X3RleHQYBCABKAlCA+BBAhI/Cgtwb2xpY3lfdHlwZRgFIAEoDjIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUG9saWN5VHlwZUID4EEBEjwKBmVmZmVjdBgGIAEoDjInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUG9saWN5RWZmZWN0QgPgQQMSHAoPcHJpbmNpcGFsX3R5cGVzGAcgAygJQgPgQQMSGwoOcmVzb3VyY2VfdHlwZXMYCCADKAlCA+BBAxIZCgxhY3Rpb25fdHlwZXMYCSADKAlCA+BBAxIPCgdlbmFibGVkGAogASgIEhAKCHByaW9yaXR5GAsgASgFEhQKB3ZlcnNpb24YDCABKAVCA+BBAxJHCghtZXRhZGF0YRgNIAMoCzI1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQWNjZXNzUG9saWN5Lk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYDyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgQIAEoCUID4EEDEhQKB3VwZGF0ZXIYESABKAlCA+BBAxovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAE6WepBVgojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9BY2Nlc3NQb2xpY3kSL3dvcmtzcGFjZXMve3dvcmtzcGFjZX0vYWNjZXNzLXBvbGljaWVzL3twb2xpY3l9Io4BCg1Qb2xpY3lWZXJzaW9uEg8KB3ZlcnNpb24YASABKAUSEwoLcG9saWN5X3RleHQYAiABKAkSFQoNY2hhbmdlX3JlYXNvbhgDIAEoCRIvCgtjcmVhdGVfdGltZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDwoHY3JlYXRvchgFIAEoCSKlAQoTQ3JlYXRlUG9saWN5UmVxdWVzdBI4CgZwYXJlbnQYASABKAlCKOBBAvpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Xb3Jrc3BhY2USFgoJcG9saWN5X2lkGAIgASgJQgPgQQESPAoGcG9saWN5GAMgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2Nlc3NQb2xpY3lCA+BBAiJPChRDcmVhdGVQb2xpY3lSZXNwb25zZRI3CgZwb2xpY3kYASABKAsyJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFjY2Vzc1BvbGljeSJNChBHZXRQb2xpY3lSZXF1ZXN0EjkKBG5hbWUYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9BY2Nlc3NQb2xpY3kiTAoRR2V0UG9saWN5UmVzcG9uc2USNwoGcG9saWN5GAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2Nlc3NQb2xpY3kirAEKE0xpc3RQb2xpY2llc1JlcXVlc3QSOAoGcGFyZW50GAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vV29ya3NwYWNlEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBARITCgZmaWx0ZXIYBCABKAlCA+BBARIVCghvcmRlcl9ieRgFIAEoCUID4EEBIn4KFExpc3RQb2xpY2llc1Jlc3BvbnNlEjkKCHBvbGljaWVzGAEgAygLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2Nlc3NQb2xpY3kSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUipQEKE1VwZGF0ZVBvbGljeVJlcXVlc3QSPAoGcG9saWN5GAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2Nlc3NQb2xpY3lCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBARIaCg1jaGFuZ2VfcmVhc29uGAMgASgJQgPgQQEiTwoUVXBkYXRlUG9saWN5UmVzcG9uc2USNwoGcG9saWN5GAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2Nlc3NQb2xpY3kiUAoTRGVsZXRlUG9saWN5UmVxdWVzdBI5CgRuYW1lGAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQWNjZXNzUG9saWN5IhYKFERlbGV0ZVBvbGljeVJlc3BvbnNlImsKFVZhbGlkYXRlUG9saWN5UmVxdWVzdBI4CgZwYXJlbnQYASABKAlCKOBBAvpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Xb3Jrc3BhY2USGAoLcG9saWN5X3RleHQYAiABKAlCA+BBAiLpAQoWVmFsaWRhdGVQb2xpY3lSZXNwb25zZRINCgV2YWxpZBgBIAEoCBJACgZlcnJvcnMYAiADKAsyMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlBvbGljeVZhbGlkYXRpb25FcnJvchI3CgZlZmZlY3QYAyABKA4yJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlBvbGljeUVmZmVjdBIXCg9wcmluY2lwYWxfdHlwZXMYBCADKAkSFgoOcmVzb3VyY2VfdHlwZXMYBSADKAkSFAoMYWN0aW9uX3R5cGVzGAYgAygJIkYKFVBvbGljeVZhbGlkYXRpb25FcnJvchIMCgRsaW5lGAEgASgFEg4KBmNvbHVtbhgCIAEoBRIPCgdtZXNzYWdlGAMgASgJIpADChVFdmFsdWF0ZUFjY2Vzc1JlcXVlc3QSOwoJd29ya3NwYWNlGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vV29ya3NwYWNlEj4KCXByaW5jaXBhbBgCIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ2VkYXJFbnRpdHlCA+BBAhI7CgZhY3Rpb24YAyABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNlZGFyRW50aXR5QgPgQQISPQoIcmVzb3VyY2UYBCABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNlZGFyRW50aXR5QgPgQQISTgoHY29udGV4dBgFIAMoCzI9LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRXZhbHVhdGVBY2Nlc3NSZXF1ZXN0LkNvbnRleHRFbnRyeRouCgxDb250ZXh0RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKTAQoWRXZhbHVhdGVBY2Nlc3NSZXNwb25zZRIPCgdhbGxvd2VkGAEgASgIEjUKCGRlY2lzaW9uGAIgASgOMiMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWNpc2lvbhIcChRkZXRlcm1pbmluZ19wb2xpY2llcxgDIAMoCRITCgtkaWFnbm9zdGljcxgEIAMoCSIxCgtDZWRhckVudGl0eRIRCgR0eXBlGAEgASgJQgPgQQISDwoCaWQYAiABKAlCA+BBAiKJAQoZTGlzdFBvbGljeVZlcnNpb25zUmVxdWVzdBI7CgZwYXJlbnQYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9BY2Nlc3NQb2xpY3kSFgoJcGFnZV9zaXplGAIgASgFQgPgQQESFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBInEKGkxpc3RQb2xpY3lWZXJzaW9uc1Jlc3BvbnNlEjoKCHZlcnNpb25zGAEgAygLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Qb2xpY3lWZXJzaW9uEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSJUChhHZXRQb2xpY3lFbnRpdGllc1JlcXVlc3QSOAoGcGFyZW50GAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vV29ya3NwYWNlIqcCChlHZXRQb2xpY3lFbnRpdGllc1Jlc3BvbnNlEkIKD3ByaW5jaXBhbF90eXBlcxgBIAMoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRW50aXR5VHlwZUluZm8SPwoMYWN0aW9uX3R5cGVzGAIgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5FbnRpdHlUeXBlSW5mbxJBCg5yZXNvdXJjZV90eXBlcxgDIAMoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRW50aXR5VHlwZUluZm8SQgoPc2FtcGxlX2VudGl0aWVzGAQgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5FbnRpdHlJbnN0YW5jZSJzCg5FbnRpdHlUeXBlSW5mbxIMCgR0eXBlGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEj4KCmF0dHJpYnV0ZXMYAyADKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkVudGl0eUF0dHJpYnV0ZSJCCg9FbnRpdHlBdHRyaWJ1dGUSDAoEbmFtZRgBIAEoCRIMCgR0eXBlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIkAKDkVudGl0eUluc3RhbmNlEgwKBHR5cGUYASABKAkSCgoCaWQYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJKlsKClBvbGljeVR5cGUSGwoXUE9MSUNZX1RZUEVfVU5TUEVDSUZJRUQQABIWChJQT0xJQ1lfVFlQRV9TVEFUSUMQARIYChRQT0xJQ1lfVFlQRV9URU1QTEFURRACKmEKDFBvbGljeUVmZmVjdBIdChlQT0xJQ1lfRUZGRUNUX1VOU1BFQ0lGSUVEEAASGAoUUE9MSUNZX0VGRkVDVF9QRVJNSVQQARIYChRQT0xJQ1lfRUZGRUNUX0ZPUkJJRBACKmUKCERlY2lzaW9uEhgKFERFQ0lTSU9OX1VOU1BFQ0lGSUVEEAASEgoOREVDSVNJT05fQUxMT1cQARIRCg1ERUNJU0lPTl9ERU5ZEAISGAoUREVDSVNJT05fTk9fREVDSVNJT04QAzLfDAoUQWNjZXNzQ29udHJvbFNlcnZpY2USqgEKDENyZWF0ZVBvbGljeRIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlUG9saWN5UmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlUG9saWN5UmVzcG9uc2UiOYLT5JMCMzoGcG9saWN5IikvdjEve3BhcmVudD13b3Jrc3BhY2VzLyp9L2FjY2Vzcy1wb2xpY2llcxKZAQoJR2V0UG9saWN5EisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRQb2xpY3lSZXF1ZXN0GiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRQb2xpY3lSZXNwb25zZSIxgtPkkwIrEikvdjEve25hbWU9d29ya3NwYWNlcy8qL2FjY2Vzcy1wb2xpY2llcy8qfRKiAQoMTGlzdFBvbGljaWVzEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UG9saWNpZXNSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UG9saWNpZXNSZXNwb25zZSIxgtPkkwIrEikvdjEve3BhcmVudD13b3Jrc3BhY2VzLyp9L2FjY2Vzcy1wb2xpY2llcxKxAQoMVXBkYXRlUG9saWN5Ei4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVQb2xpY3lSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVQb2xpY3lSZXNwb25zZSJAgtPkkwI6OgZwb2xpY3kyMC92MS97cG9saWN5Lm5hbWU9d29ya3NwYWNlcy8qL2FjY2Vzcy1wb2xpY2llcy8qfRKiAQoMRGVsZXRlUG9saWN5Ei4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVQb2xpY3lSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVQb2xpY3lSZXNwb25zZSIxgtPkkwIrKikvdjEve25hbWU9d29ya3NwYWNlcy8qL2FjY2Vzcy1wb2xpY2llcy8qfRK0AQoOVmFsaWRhdGVQb2xpY3kSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlZhbGlkYXRlUG9saWN5UmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVmFsaWRhdGVQb2xpY3lSZXNwb25zZSI9gtPkkwI3OgEqIjIvdjEve3BhcmVudD13b3Jrc3BhY2VzLyp9L2FjY2Vzcy1wb2xpY2llczp2YWxpZGF0ZRKuAQoORXZhbHVhdGVBY2Nlc3MSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkV2YWx1YXRlQWNjZXNzUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRXZhbHVhdGVBY2Nlc3NSZXNwb25zZSI3gtPkkwIxOgEqIiwvdjEve3dvcmtzcGFjZT13b3Jrc3BhY2VzLyp9L2FjY2VzczpldmFsdWF0ZRK/AQoSTGlzdFBvbGljeVZlcnNpb25zEjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UG9saWN5VmVyc2lvbnNSZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UG9saWN5VmVyc2lvbnNSZXNwb25zZSI8gtPkkwI2EjQvdjEve3BhcmVudD13b3Jrc3BhY2VzLyovYWNjZXNzLXBvbGljaWVzLyp9L3ZlcnNpb25zEroBChFHZXRQb2xpY3lFbnRpdGllcxIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0UG9saWN5RW50aXRpZXNSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRQb2xpY3lFbnRpdGllc1Jlc3BvbnNlIjqC0+STAjQSMi92MS97cGFyZW50PXdvcmtzcGFjZXMvKn0vYWNjZXNzLXBvbGljaWVzOmVudGl0aWVzGhnKQRZhaWdhdGV3YXkucmVkcGFuZGEuY29tQocCCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUISQWNjZXNzQ29udHJvbFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * AccessPolicy represents a Cedar authorization policy. + * + * @generated from message redpanda.api.aigateway.v1.AccessPolicy + */ +export type AccessPolicy = Message<"redpanda.api.aigateway.v1.AccessPolicy"> & { + /** + * Resource name. Format: `workspaces/{workspace}/access-policies/{policy}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Required: The Cedar policy source code + * + * @generated from field: string policy_text = 4; + */ + policyText: string; + + /** + * Policy type: STATIC or TEMPLATE + * + * @generated from field: redpanda.api.aigateway.v1.PolicyType policy_type = 5; + */ + policyType: PolicyType; + + /** + * Output only. Effect: PERMIT or FORBID (extracted from policy) + * + * @generated from field: redpanda.api.aigateway.v1.PolicyEffect effect = 6; + */ + effect: PolicyEffect; + + /** + * Output only. Types of principals this policy applies to + * + * @generated from field: repeated string principal_types = 7; + */ + principalTypes: string[]; + + /** + * Output only. Types of resources this policy applies to + * + * @generated from field: repeated string resource_types = 8; + */ + resourceTypes: string[]; + + /** + * Output only. Types of actions this policy applies to + * + * @generated from field: repeated string action_types = 9; + */ + actionTypes: string[]; + + /** + * Whether this policy is active + * + * @generated from field: bool enabled = 10; + */ + enabled: boolean; + + /** + * Priority for policy ordering (lower = higher priority) + * + * @generated from field: int32 priority = 11; + */ + priority: number; + + /** + * Current version number + * + * @generated from field: int32 version = 12; + */ + version: number; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 13; + */ + metadata: { [key: string]: string }; + + /** + * Output only timestamps + * + * @generated from field: google.protobuf.Timestamp create_time = 14; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 15; + */ + updateTime?: Timestamp; + + /** + * @generated from field: string creator = 16; + */ + creator: string; + + /** + * @generated from field: string updater = 17; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AccessPolicy. + * Use `create(AccessPolicySchema)` to create a new message. + */ +export const AccessPolicySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 0); + +/** + * PolicyVersion represents a historical version of a policy. + * + * @generated from message redpanda.api.aigateway.v1.PolicyVersion + */ +export type PolicyVersion = Message<"redpanda.api.aigateway.v1.PolicyVersion"> & { + /** + * Version number + * + * @generated from field: int32 version = 1; + */ + version: number; + + /** + * The policy text at this version + * + * @generated from field: string policy_text = 2; + */ + policyText: string; + + /** + * Reason for this change + * + * @generated from field: string change_reason = 3; + */ + changeReason: string; + + /** + * When this version was created + * + * @generated from field: google.protobuf.Timestamp create_time = 4; + */ + createTime?: Timestamp; + + /** + * Who created this version + * + * @generated from field: string creator = 5; + */ + creator: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PolicyVersion. + * Use `create(PolicyVersionSchema)` to create a new message. + */ +export const PolicyVersionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 1); + +/** + * Request message for CreatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreatePolicyRequest + */ +export type CreatePolicyRequest = Message<"redpanda.api.aigateway.v1.CreatePolicyRequest"> & { + /** + * Required: Parent workspace. + * Format: `workspaces/{workspace}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Optional policy ID (auto-generated if empty) + * + * @generated from field: string policy_id = 2; + */ + policyId: string; + + /** + * Required: The policy to create + * + * @generated from field: redpanda.api.aigateway.v1.AccessPolicy policy = 3; + */ + policy?: AccessPolicy; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreatePolicyRequest. + * Use `create(CreatePolicyRequestSchema)` to create a new message. + */ +export const CreatePolicyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 2); + +/** + * Response message for CreatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreatePolicyResponse + */ +export type CreatePolicyResponse = Message<"redpanda.api.aigateway.v1.CreatePolicyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.AccessPolicy policy = 1; + */ + policy?: AccessPolicy; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreatePolicyResponse. + * Use `create(CreatePolicyResponseSchema)` to create a new message. + */ +export const CreatePolicyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 3); + +/** + * Request message for GetPolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPolicyRequest + */ +export type GetPolicyRequest = Message<"redpanda.api.aigateway.v1.GetPolicyRequest"> & { + /** + * Resource name of the policy. + * Format: `workspaces/{workspace}/access-policies/{policy}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPolicyRequest. + * Use `create(GetPolicyRequestSchema)` to create a new message. + */ +export const GetPolicyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 4); + +/** + * Response message for GetPolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPolicyResponse + */ +export type GetPolicyResponse = Message<"redpanda.api.aigateway.v1.GetPolicyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.AccessPolicy policy = 1; + */ + policy?: AccessPolicy; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPolicyResponse. + * Use `create(GetPolicyResponseSchema)` to create a new message. + */ +export const GetPolicyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 5); + +/** + * Request message for ListPolicies RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListPoliciesRequest + */ +export type ListPoliciesRequest = Message<"redpanda.api.aigateway.v1.ListPoliciesRequest"> & { + /** + * Required: Parent workspace. + * Format: `workspaces/{workspace}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of policies to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListPolicies call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPoliciesRequest. + * Use `create(ListPoliciesRequestSchema)` to create a new message. + */ +export const ListPoliciesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 6); + +/** + * Response message for ListPolicies RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListPoliciesResponse + */ +export type ListPoliciesResponse = Message<"redpanda.api.aigateway.v1.ListPoliciesResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.AccessPolicy policies = 1; + */ + policies: AccessPolicy[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPoliciesResponse. + * Use `create(ListPoliciesResponseSchema)` to create a new message. + */ +export const ListPoliciesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 7); + +/** + * Request message for UpdatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdatePolicyRequest + */ +export type UpdatePolicyRequest = Message<"redpanda.api.aigateway.v1.UpdatePolicyRequest"> & { + /** + * The policy resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.AccessPolicy policy = 1; + */ + policy?: AccessPolicy; + + /** + * The fields to update. + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; + + /** + * Optional reason for this update (stored in version history) + * + * @generated from field: string change_reason = 3; + */ + changeReason: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdatePolicyRequest. + * Use `create(UpdatePolicyRequestSchema)` to create a new message. + */ +export const UpdatePolicyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 8); + +/** + * Response message for UpdatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdatePolicyResponse + */ +export type UpdatePolicyResponse = Message<"redpanda.api.aigateway.v1.UpdatePolicyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.AccessPolicy policy = 1; + */ + policy?: AccessPolicy; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdatePolicyResponse. + * Use `create(UpdatePolicyResponseSchema)` to create a new message. + */ +export const UpdatePolicyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 9); + +/** + * Request message for DeletePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeletePolicyRequest + */ +export type DeletePolicyRequest = Message<"redpanda.api.aigateway.v1.DeletePolicyRequest"> & { + /** + * Resource name of the policy to delete. + * Format: `workspaces/{workspace}/access-policies/{policy}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeletePolicyRequest. + * Use `create(DeletePolicyRequestSchema)` to create a new message. + */ +export const DeletePolicyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 10); + +/** + * Response message for DeletePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeletePolicyResponse + */ +export type DeletePolicyResponse = Message<"redpanda.api.aigateway.v1.DeletePolicyResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeletePolicyResponse. + * Use `create(DeletePolicyResponseSchema)` to create a new message. + */ +export const DeletePolicyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 11); + +/** + * Request message for ValidatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.ValidatePolicyRequest + */ +export type ValidatePolicyRequest = Message<"redpanda.api.aigateway.v1.ValidatePolicyRequest"> & { + /** + * Required: Parent workspace (for context). + * Format: `workspaces/{workspace}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The Cedar policy text to validate + * + * @generated from field: string policy_text = 2; + */ + policyText: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ValidatePolicyRequest. + * Use `create(ValidatePolicyRequestSchema)` to create a new message. + */ +export const ValidatePolicyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 12); + +/** + * Response message for ValidatePolicy RPC. + * + * @generated from message redpanda.api.aigateway.v1.ValidatePolicyResponse + */ +export type ValidatePolicyResponse = Message<"redpanda.api.aigateway.v1.ValidatePolicyResponse"> & { + /** + * Whether the policy is valid + * + * @generated from field: bool valid = 1; + */ + valid: boolean; + + /** + * Validation errors (if any) + * + * @generated from field: repeated redpanda.api.aigateway.v1.PolicyValidationError errors = 2; + */ + errors: PolicyValidationError[]; + + /** + * Parsed policy information (if valid) + * + * @generated from field: redpanda.api.aigateway.v1.PolicyEffect effect = 3; + */ + effect: PolicyEffect; + + /** + * @generated from field: repeated string principal_types = 4; + */ + principalTypes: string[]; + + /** + * @generated from field: repeated string resource_types = 5; + */ + resourceTypes: string[]; + + /** + * @generated from field: repeated string action_types = 6; + */ + actionTypes: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ValidatePolicyResponse. + * Use `create(ValidatePolicyResponseSchema)` to create a new message. + */ +export const ValidatePolicyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 13); + +/** + * PolicyValidationError describes a syntax error in a Cedar policy. + * + * @generated from message redpanda.api.aigateway.v1.PolicyValidationError + */ +export type PolicyValidationError = Message<"redpanda.api.aigateway.v1.PolicyValidationError"> & { + /** + * Line number (1-indexed) + * + * @generated from field: int32 line = 1; + */ + line: number; + + /** + * Column number (1-indexed) + * + * @generated from field: int32 column = 2; + */ + column: number; + + /** + * Error message + * + * @generated from field: string message = 3; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PolicyValidationError. + * Use `create(PolicyValidationErrorSchema)` to create a new message. + */ +export const PolicyValidationErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 14); + +/** + * Request message for EvaluateAccess RPC. + * + * @generated from message redpanda.api.aigateway.v1.EvaluateAccessRequest + */ +export type EvaluateAccessRequest = Message<"redpanda.api.aigateway.v1.EvaluateAccessRequest"> & { + /** + * Required: Workspace containing the policies. + * Format: `workspaces/{workspace}` + * + * @generated from field: string workspace = 1; + */ + workspace: string; + + /** + * Principal making the request + * + * @generated from field: redpanda.api.aigateway.v1.CedarEntity principal = 2; + */ + principal?: CedarEntity; + + /** + * Action being performed + * + * @generated from field: redpanda.api.aigateway.v1.CedarEntity action = 3; + */ + action?: CedarEntity; + + /** + * Resource being accessed + * + * @generated from field: redpanda.api.aigateway.v1.CedarEntity resource = 4; + */ + resource?: CedarEntity; + + /** + * Optional context attributes + * + * @generated from field: map context = 5; + */ + context: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EvaluateAccessRequest. + * Use `create(EvaluateAccessRequestSchema)` to create a new message. + */ +export const EvaluateAccessRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 15); + +/** + * Response message for EvaluateAccess RPC. + * + * @generated from message redpanda.api.aigateway.v1.EvaluateAccessResponse + */ +export type EvaluateAccessResponse = Message<"redpanda.api.aigateway.v1.EvaluateAccessResponse"> & { + /** + * Whether access is allowed + * + * @generated from field: bool allowed = 1; + */ + allowed: boolean; + + /** + * The decision: ALLOW, DENY, or NO_DECISION + * + * @generated from field: redpanda.api.aigateway.v1.Decision decision = 2; + */ + decision: Decision; + + /** + * IDs of policies that contributed to this decision + * + * @generated from field: repeated string determining_policies = 3; + */ + determiningPolicies: string[]; + + /** + * Diagnostic information + * + * @generated from field: repeated string diagnostics = 4; + */ + diagnostics: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EvaluateAccessResponse. + * Use `create(EvaluateAccessResponseSchema)` to create a new message. + */ +export const EvaluateAccessResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 16); + +/** + * CedarEntity represents a Cedar principal, action, or resource. + * + * @generated from message redpanda.api.aigateway.v1.CedarEntity + */ +export type CedarEntity = Message<"redpanda.api.aigateway.v1.CedarEntity"> & { + /** + * Entity type (e.g., "AIGateway::User") + * + * @generated from field: string type = 1; + */ + type: string; + + /** + * Entity ID + * + * @generated from field: string id = 2; + */ + id: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CedarEntity. + * Use `create(CedarEntitySchema)` to create a new message. + */ +export const CedarEntitySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 17); + +/** + * Request message for ListPolicyVersions RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListPolicyVersionsRequest + */ +export type ListPolicyVersionsRequest = Message<"redpanda.api.aigateway.v1.ListPolicyVersionsRequest"> & { + /** + * Parent policy resource. + * Format: `workspaces/{workspace}/access-policies/{policy}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPolicyVersionsRequest. + * Use `create(ListPolicyVersionsRequestSchema)` to create a new message. + */ +export const ListPolicyVersionsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 18); + +/** + * Response message for ListPolicyVersions RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListPolicyVersionsResponse + */ +export type ListPolicyVersionsResponse = Message<"redpanda.api.aigateway.v1.ListPolicyVersionsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.PolicyVersion versions = 1; + */ + versions: PolicyVersion[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPolicyVersionsResponse. + * Use `create(ListPolicyVersionsResponseSchema)` to create a new message. + */ +export const ListPolicyVersionsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 19); + +/** + * Request message for GetPolicyEntities RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPolicyEntitiesRequest + */ +export type GetPolicyEntitiesRequest = Message<"redpanda.api.aigateway.v1.GetPolicyEntitiesRequest"> & { + /** + * Parent workspace. + * Format: `workspaces/{workspace}` + * + * @generated from field: string parent = 1; + */ + parent: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPolicyEntitiesRequest. + * Use `create(GetPolicyEntitiesRequestSchema)` to create a new message. + */ +export const GetPolicyEntitiesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 20); + +/** + * Response message for GetPolicyEntities RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPolicyEntitiesResponse + */ +export type GetPolicyEntitiesResponse = Message<"redpanda.api.aigateway.v1.GetPolicyEntitiesResponse"> & { + /** + * Available principal types with descriptions + * + * @generated from field: repeated redpanda.api.aigateway.v1.EntityTypeInfo principal_types = 1; + */ + principalTypes: EntityTypeInfo[]; + + /** + * Available action types + * + * @generated from field: repeated redpanda.api.aigateway.v1.EntityTypeInfo action_types = 2; + */ + actionTypes: EntityTypeInfo[]; + + /** + * Available resource types with descriptions + * + * @generated from field: repeated redpanda.api.aigateway.v1.EntityTypeInfo resource_types = 3; + */ + resourceTypes: EntityTypeInfo[]; + + /** + * Sample entities for autocomplete + * + * @generated from field: repeated redpanda.api.aigateway.v1.EntityInstance sample_entities = 4; + */ + sampleEntities: EntityInstance[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPolicyEntitiesResponse. + * Use `create(GetPolicyEntitiesResponseSchema)` to create a new message. + */ +export const GetPolicyEntitiesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 21); + +/** + * EntityTypeInfo describes a Cedar entity type. + * + * @generated from message redpanda.api.aigateway.v1.EntityTypeInfo + */ +export type EntityTypeInfo = Message<"redpanda.api.aigateway.v1.EntityTypeInfo"> & { + /** + * Entity type name (e.g., "AIGateway::User") + * + * @generated from field: string type = 1; + */ + type: string; + + /** + * Human-readable description + * + * @generated from field: string description = 2; + */ + description: string; + + /** + * Available attributes on this entity type + * + * @generated from field: repeated redpanda.api.aigateway.v1.EntityAttribute attributes = 3; + */ + attributes: EntityAttribute[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EntityTypeInfo. + * Use `create(EntityTypeInfoSchema)` to create a new message. + */ +export const EntityTypeInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 22); + +/** + * EntityAttribute describes an attribute on a Cedar entity. + * + * @generated from message redpanda.api.aigateway.v1.EntityAttribute + */ +export type EntityAttribute = Message<"redpanda.api.aigateway.v1.EntityAttribute"> & { + /** + * Attribute name + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Attribute type ("String", "Long", "Boolean", "Set", "Record") + * + * @generated from field: string type = 2; + */ + type: string; + + /** + * Human-readable description + * + * @generated from field: string description = 3; + */ + description: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EntityAttribute. + * Use `create(EntityAttributeSchema)` to create a new message. + */ +export const EntityAttributeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 23); + +/** + * EntityInstance represents a concrete entity for autocomplete. + * + * @generated from message redpanda.api.aigateway.v1.EntityInstance + */ +export type EntityInstance = Message<"redpanda.api.aigateway.v1.EntityInstance"> & { + /** + * Entity type + * + * @generated from field: string type = 1; + */ + type: string; + + /** + * Entity ID + * + * @generated from field: string id = 2; + */ + id: string; + + /** + * Display name for UI + * + * @generated from field: string display_name = 3; + */ + displayName: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EntityInstance. + * Use `create(EntityInstanceSchema)` to create a new message. + */ +export const EntityInstanceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_access_control, 24); + +/** + * Policy type enumeration + * + * @generated from enum redpanda.api.aigateway.v1.PolicyType + */ +export enum PolicyType { + /** + * @generated from enum value: POLICY_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Standard Cedar policy + * + * @generated from enum value: POLICY_TYPE_STATIC = 1; + */ + STATIC = 1, + + /** + * Cedar policy template + * + * @generated from enum value: POLICY_TYPE_TEMPLATE = 2; + */ + TEMPLATE = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.PolicyType. + */ +export const PolicyTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_access_control, 0); + +/** + * Policy effect enumeration + * + * @generated from enum redpanda.api.aigateway.v1.PolicyEffect + */ +export enum PolicyEffect { + /** + * @generated from enum value: POLICY_EFFECT_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: POLICY_EFFECT_PERMIT = 1; + */ + PERMIT = 1, + + /** + * @generated from enum value: POLICY_EFFECT_FORBID = 2; + */ + FORBID = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.PolicyEffect. + */ +export const PolicyEffectSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_access_control, 1); + +/** + * Authorization decision enumeration. + * + * @generated from enum redpanda.api.aigateway.v1.Decision + */ +export enum Decision { + /** + * @generated from enum value: DECISION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: DECISION_ALLOW = 1; + */ + ALLOW = 1, + + /** + * @generated from enum value: DECISION_DENY = 2; + */ + DENY = 2, + + /** + * No applicable policies + * + * @generated from enum value: DECISION_NO_DECISION = 3; + */ + NO_DECISION = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.Decision. + */ +export const DecisionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_access_control, 2); + +/** + * AccessControlService manages Cedar access control policies. + * Policies define fine-grained authorization rules for AI Gateway resources. + * Resource name: workspaces/{workspace}/access-policies/{policy} + * + * @generated from service redpanda.api.aigateway.v1.AccessControlService + */ +export const AccessControlService: GenService<{ + /** + * Creates a new Cedar policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.CreatePolicy + */ + createPolicy: { + methodKind: "unary"; + input: typeof CreatePolicyRequestSchema; + output: typeof CreatePolicyResponseSchema; + }, + /** + * Gets a policy by name. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.GetPolicy + */ + getPolicy: { + methodKind: "unary"; + input: typeof GetPolicyRequestSchema; + output: typeof GetPolicyResponseSchema; + }, + /** + * Lists policies within a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ListPolicies + */ + listPolicies: { + methodKind: "unary"; + input: typeof ListPoliciesRequestSchema; + output: typeof ListPoliciesResponseSchema; + }, + /** + * Updates a policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.UpdatePolicy + */ + updatePolicy: { + methodKind: "unary"; + input: typeof UpdatePolicyRequestSchema; + output: typeof UpdatePolicyResponseSchema; + }, + /** + * Deletes a policy. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.DeletePolicy + */ + deletePolicy: { + methodKind: "unary"; + input: typeof DeletePolicyRequestSchema; + output: typeof DeletePolicyResponseSchema; + }, + /** + * Validates a Cedar policy without saving it. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ValidatePolicy + */ + validatePolicy: { + methodKind: "unary"; + input: typeof ValidatePolicyRequestSchema; + output: typeof ValidatePolicyResponseSchema; + }, + /** + * Evaluates an authorization request against policies. + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.EvaluateAccess + */ + evaluateAccess: { + methodKind: "unary"; + input: typeof EvaluateAccessRequestSchema; + output: typeof EvaluateAccessResponseSchema; + }, + /** + * Lists policy versions (audit trail). + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.ListPolicyVersions + */ + listPolicyVersions: { + methodKind: "unary"; + input: typeof ListPolicyVersionsRequestSchema; + output: typeof ListPolicyVersionsResponseSchema; + }, + /** + * Gets available entities for policy authoring (autocomplete). + * + * @generated from rpc redpanda.api.aigateway.v1.AccessControlService.GetPolicyEntities + */ + getPolicyEntities: { + methodKind: "unary"; + input: typeof GetPolicyEntitiesRequestSchema; + output: typeof GetPolicyEntitiesResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_access_control, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/account-AccountService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/account-AccountService_connectquery.ts new file mode 100644 index 0000000000..ff5ca38f82 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/account-AccountService_connectquery.ts @@ -0,0 +1,57 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/account.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { AccountService } from "./account_pb"; + +/** + * Creates a new account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.CreateAccount + */ +export const createAccount = AccountService.method.createAccount; + +/** + * Gets an account by name. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.GetAccount + */ +export const getAccount = AccountService.method.getAccount; + +/** + * Lists accounts. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.ListAccounts + */ +export const listAccounts = AccountService.method.listAccounts; + +/** + * Updates an account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.UpdateAccount + */ +export const updateAccount = AccountService.method.updateAccount; + +/** + * Deletes an account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.DeleteAccount + */ +export const deleteAccount = AccountService.method.deleteAccount; + +/** + * Sets the license key for an account. + * The license key is a JWT token signed by Redpanda. + * This operation will validate the JWT and store it encrypted at rest. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.SetAccountLicense + */ +export const setAccountLicense = AccountService.method.setAccountLicense; + +/** + * Gets the current license information for an account. + * Returns the decoded license info without the encrypted key. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.GetAccountLicense + */ +export const getAccountLicense = AccountService.method.getAccountLicense; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/account_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/account_pb.ts new file mode 100644 index 0000000000..c1a0aeb25e --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/account_pb.ts @@ -0,0 +1,671 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/account.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/account.proto. + */ +export const file_redpanda_api_aigateway_v1_account: GenFile = /*@__PURE__*/ + fileDesc("CidyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2FjY291bnQucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEikgIKC0xpY2Vuc2VJbmZvEjkKBHR5cGUYASABKA4yJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpY2Vuc2VUeXBlQgPgQQMSMwoKZXhwaXJlc19hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIyCglpc3N1ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSLgoIZmVhdHVyZXMYBCABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0QgPgQQMSEgoFdmFsaWQYBSABKAhCA+BBAxIbCg5zdGF0dXNfbWVzc2FnZRgGIAEoCUID4EEDIt8ECgdBY2NvdW50EhEKBG5hbWUYASABKAlCA+BBCBIjCgxkaXNwbGF5X25hbWUYAiABKAlCDeBBArpIB3IFEAEY/wESGAoLZGVzY3JpcHRpb24YAyABKAlCA+BBARIPCgdlbmFibGVkGAQgASgIEiEKDWJpbGxpbmdfZW1haWwYBSABKAlCCuBBArpIBHICYAESNQoPYmlsbGluZ19hZGRyZXNzGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEID4EEBEhMKBnRheF9pZBgHIAEoCUID4EEBEkIKCG1ldGFkYXRhGAggAygLMjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2NvdW50Lk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgLIAEoCUID4EEDEhQKB3VwZGF0ZXIYDCABKAlCA+BBAxI8CgdsaWNlbnNlGA0gASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaWNlbnNlSW5mb0ID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATo36kE0Ch5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQSEmFjY291bnRzL3thY2NvdW50fSJiChRDcmVhdGVBY2NvdW50UmVxdWVzdBI4CgdhY2NvdW50GAIgASgLMiIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2NvdW50QgPgQQJKBAgBEAJSCmFjY291bnRfaWQiTAoVQ3JlYXRlQWNjb3VudFJlc3BvbnNlEjMKB2FjY291bnQYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFjY291bnQiSQoRR2V0QWNjb3VudFJlcXVlc3QSNAoEbmFtZRgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQiSQoSR2V0QWNjb3VudFJlc3BvbnNlEjMKB2FjY291bnQYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFjY291bnQifAoTTGlzdEFjY291bnRzUmVxdWVzdBIgCglwYWdlX3NpemUYASABKAVCDeBBAbpIBxoFGOgHKAASFwoKcGFnZV90b2tlbhgCIAEoCUID4EEBEhMKBmZpbHRlchgDIAEoCUID4EEBEhUKCG9yZGVyX2J5GAQgASgJQgPgQQEieQoUTGlzdEFjY291bnRzUmVzcG9uc2USNAoIYWNjb3VudHMYASADKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFjY291bnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUihgEKFFVwZGF0ZUFjY291bnRSZXF1ZXN0EjgKB2FjY291bnQYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFjY291bnRCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJMChVVcGRhdGVBY2NvdW50UmVzcG9uc2USMwoHYWNjb3VudBgBIAEoCzIiLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQWNjb3VudCJgChREZWxldGVBY2NvdW50UmVxdWVzdBI0CgRuYW1lGAEgASgJQibgQQL6QSAKHmFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQWNjb3VudBISCgVmb3JjZRgCIAEoCEID4EEBIhcKFURlbGV0ZUFjY291bnRSZXNwb25zZSJxChhTZXRBY2NvdW50TGljZW5zZVJlcXVlc3QSNAoEbmFtZRgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQSHwoLbGljZW5zZV9rZXkYAiABKAlCCuBBArpIBHICEAEiVAoZU2V0QWNjb3VudExpY2Vuc2VSZXNwb25zZRI3CgdsaWNlbnNlGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaWNlbnNlSW5mbyJQChhHZXRBY2NvdW50TGljZW5zZVJlcXVlc3QSNAoEbmFtZRgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQiVAoZR2V0QWNjb3VudExpY2Vuc2VSZXNwb25zZRI3CgdsaWNlbnNlGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaWNlbnNlSW5mbyqbAQoLTGljZW5zZVR5cGUSHAoYTElDRU5TRV9UWVBFX1VOU1BFQ0lGSUVEEAASFgoSTElDRU5TRV9UWVBFX1RSSUFMEAESHQoZTElDRU5TRV9UWVBFX1BST0ZFU1NJT05BTBACEhsKF0xJQ0VOU0VfVFlQRV9FTlRFUlBSSVNFEAMSGgoWTElDRU5TRV9UWVBFX1VOTElNSVRFRBAEMuEICg5BY2NvdW50U2VydmljZRKRAQoNQ3JlYXRlQWNjb3VudBIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlQWNjb3VudFJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZUFjY291bnRSZXNwb25zZSIdgtPkkwIXOgdhY2NvdW50IgwvdjEvYWNjb3VudHMSiAEKCkdldEFjY291bnQSLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEFjY291bnRSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRBY2NvdW50UmVzcG9uc2UiHYLT5JMCFxIVL3YxL3tuYW1lPWFjY291bnRzLyp9EoUBCgxMaXN0QWNjb3VudHMSLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RBY2NvdW50c1JlcXVlc3QaLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RBY2NvdW50c1Jlc3BvbnNlIhSC0+STAg4SDC92MS9hY2NvdW50cxKiAQoNVXBkYXRlQWNjb3VudBIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlQWNjb3VudFJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUFjY291bnRSZXNwb25zZSIugtPkkwIoOgdhY2NvdW50Mh0vdjEve2FjY291bnQubmFtZT1hY2NvdW50cy8qfRKRAQoNRGVsZXRlQWNjb3VudBIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlQWNjb3VudFJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZUFjY291bnRSZXNwb25zZSIdgtPkkwIXKhUvdjEve25hbWU9YWNjb3VudHMvKn0SqwEKEVNldEFjY291bnRMaWNlbnNlEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TZXRBY2NvdW50TGljZW5zZVJlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNldEFjY291bnRMaWNlbnNlUmVzcG9uc2UiK4LT5JMCJToBKiIgL3YxL3tuYW1lPWFjY291bnRzLyp9OnNldExpY2Vuc2USpQEKEUdldEFjY291bnRMaWNlbnNlEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRBY2NvdW50TGljZW5zZVJlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEFjY291bnRMaWNlbnNlUmVzcG9uc2UiJYLT5JMCHxIdL3YxL3tuYW1lPWFjY291bnRzLyp9L2xpY2Vuc2UaGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21CgQIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQgxBY2NvdW50UHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp]); + +/** + * License information for an account. + * License keys are JWT tokens signed by Redpanda and encrypted at rest. + * + * @generated from message redpanda.api.aigateway.v1.LicenseInfo + */ +export type LicenseInfo = Message<"redpanda.api.aigateway.v1.LicenseInfo"> & { + /** + * License type/tier + * + * @generated from field: redpanda.api.aigateway.v1.LicenseType type = 1; + */ + type: LicenseType; + + /** + * When the license expires (null for perpetual licenses) + * + * @generated from field: google.protobuf.Timestamp expires_at = 2; + */ + expiresAt?: Timestamp; + + /** + * When the license was issued + * + * @generated from field: google.protobuf.Timestamp issued_at = 3; + */ + issuedAt?: Timestamp; + + /** + * Licensed features and their limits + * Example: {"max_gateways": 10, "max_requests_per_day": 1000000, "sso_enabled": true} + * + * @generated from field: google.protobuf.Struct features = 4; + */ + features?: JsonObject; + + /** + * Whether the license is currently valid + * + * @generated from field: bool valid = 5; + */ + valid: boolean; + + /** + * Human-readable license status message + * + * @generated from field: string status_message = 6; + */ + statusMessage: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LicenseInfo. + * Use `create(LicenseInfoSchema)` to create a new message. + */ +export const LicenseInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 0); + +/** + * Account represents a top-level billing entity. + * Accounts contain organizations and serve as the billing boundary in multi-tenant SaaS. + * Each account has an associated license key from Redpanda. + * + * @generated from message redpanda.api.aigateway.v1.Account + */ +export type Account = Message<"redpanda.api.aigateway.v1.Account"> & { + /** + * Resource name. Format: `accounts/{account_id}` + * Account ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name (must be unique) + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Whether this account is active + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * Required: Billing email address + * + * @generated from field: string billing_email = 5; + */ + billingEmail: string; + + /** + * Optional: Billing address as structured JSON + * + * @generated from field: google.protobuf.Struct billing_address = 6; + */ + billingAddress?: JsonObject; + + /** + * Optional: Tax identification number + * + * @generated from field: string tax_id = 7; + */ + taxId: string; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 8; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 9; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 10; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 11; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 12; + */ + updater: string; + + /** + * Output only. License information for this account. + * License keys are JWT tokens signed by Redpanda, stored encrypted at rest. + * + * @generated from field: redpanda.api.aigateway.v1.LicenseInfo license = 13; + */ + license?: LicenseInfo; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Account. + * Use `create(AccountSchema)` to create a new message. + */ +export const AccountSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 1); + +/** + * Request message for CreateAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateAccountRequest + */ +export type CreateAccountRequest = Message<"redpanda.api.aigateway.v1.CreateAccountRequest"> & { + /** + * Required: The account resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Account account = 2; + */ + account?: Account; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateAccountRequest. + * Use `create(CreateAccountRequestSchema)` to create a new message. + */ +export const CreateAccountRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 2); + +/** + * Response message for CreateAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateAccountResponse + */ +export type CreateAccountResponse = Message<"redpanda.api.aigateway.v1.CreateAccountResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Account account = 1; + */ + account?: Account; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateAccountResponse. + * Use `create(CreateAccountResponseSchema)` to create a new message. + */ +export const CreateAccountResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 3); + +/** + * Request message for GetAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetAccountRequest + */ +export type GetAccountRequest = Message<"redpanda.api.aigateway.v1.GetAccountRequest"> & { + /** + * Resource name of the account. + * Format: `accounts/{account}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAccountRequest. + * Use `create(GetAccountRequestSchema)` to create a new message. + */ +export const GetAccountRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 4); + +/** + * Response message for GetAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetAccountResponse + */ +export type GetAccountResponse = Message<"redpanda.api.aigateway.v1.GetAccountResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Account account = 1; + */ + account?: Account; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAccountResponse. + * Use `create(GetAccountResponseSchema)` to create a new message. + */ +export const GetAccountResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 5); + +/** + * Request message for ListAccounts RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListAccountsRequest + */ +export type ListAccountsRequest = Message<"redpanda.api.aigateway.v1.ListAccountsRequest"> & { + /** + * Maximum number of accounts to return (max 1000) + * + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * Page token from a previous ListAccounts call + * + * @generated from field: string page_token = 2; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * Examples: + * enabled == true + * display_name == "production" + * billing_email.endsWith("@example.com") + * + * @generated from field: string filter = 3; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * Examples: "create_time desc", "display_name" + * + * @generated from field: string order_by = 4; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListAccountsRequest. + * Use `create(ListAccountsRequestSchema)` to create a new message. + */ +export const ListAccountsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 6); + +/** + * Response message for ListAccounts RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListAccountsResponse + */ +export type ListAccountsResponse = Message<"redpanda.api.aigateway.v1.ListAccountsResponse"> & { + /** + * The list of accounts + * + * @generated from field: repeated redpanda.api.aigateway.v1.Account accounts = 1; + */ + accounts: Account[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching accounts + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListAccountsResponse. + * Use `create(ListAccountsResponseSchema)` to create a new message. + */ +export const ListAccountsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 7); + +/** + * Request message for UpdateAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateAccountRequest + */ +export type UpdateAccountRequest = Message<"redpanda.api.aigateway.v1.UpdateAccountRequest"> & { + /** + * Required: The account resource to update. + * The account's name field is used to identify the resource. + * + * @generated from field: redpanda.api.aigateway.v1.Account account = 1; + */ + account?: Account; + + /** + * The fields to update. + * If omitted, all mutable fields are updated. + * Allowed fields: display_name, description, enabled, billing_email, billing_address, tax_id, metadata + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateAccountRequest. + * Use `create(UpdateAccountRequestSchema)` to create a new message. + */ +export const UpdateAccountRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 8); + +/** + * Response message for UpdateAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateAccountResponse + */ +export type UpdateAccountResponse = Message<"redpanda.api.aigateway.v1.UpdateAccountResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Account account = 1; + */ + account?: Account; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateAccountResponse. + * Use `create(UpdateAccountResponseSchema)` to create a new message. + */ +export const UpdateAccountResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 9); + +/** + * Request message for DeleteAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteAccountRequest + */ +export type DeleteAccountRequest = Message<"redpanda.api.aigateway.v1.DeleteAccountRequest"> & { + /** + * Resource name of the account to delete. + * Format: `accounts/{account}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all child resources (organizations, workspaces, etc.) + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteAccountRequest. + * Use `create(DeleteAccountRequestSchema)` to create a new message. + */ +export const DeleteAccountRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 10); + +/** + * Response message for DeleteAccount RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteAccountResponse + */ +export type DeleteAccountResponse = Message<"redpanda.api.aigateway.v1.DeleteAccountResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteAccountResponse. + * Use `create(DeleteAccountResponseSchema)` to create a new message. + */ +export const DeleteAccountResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 11); + +/** + * Request message for SetAccountLicense RPC. + * + * @generated from message redpanda.api.aigateway.v1.SetAccountLicenseRequest + */ +export type SetAccountLicenseRequest = Message<"redpanda.api.aigateway.v1.SetAccountLicenseRequest"> & { + /** + * Resource name of the account. + * Format: `accounts/{account}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * The JWT license key signed by Redpanda. + * This will be validated and stored encrypted at rest. + * + * @generated from field: string license_key = 2; + */ + licenseKey: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SetAccountLicenseRequest. + * Use `create(SetAccountLicenseRequestSchema)` to create a new message. + */ +export const SetAccountLicenseRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 12); + +/** + * Response message for SetAccountLicense RPC. + * + * @generated from message redpanda.api.aigateway.v1.SetAccountLicenseResponse + */ +export type SetAccountLicenseResponse = Message<"redpanda.api.aigateway.v1.SetAccountLicenseResponse"> & { + /** + * The updated license information + * + * @generated from field: redpanda.api.aigateway.v1.LicenseInfo license = 1; + */ + license?: LicenseInfo; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SetAccountLicenseResponse. + * Use `create(SetAccountLicenseResponseSchema)` to create a new message. + */ +export const SetAccountLicenseResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 13); + +/** + * Request message for GetAccountLicense RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetAccountLicenseRequest + */ +export type GetAccountLicenseRequest = Message<"redpanda.api.aigateway.v1.GetAccountLicenseRequest"> & { + /** + * Resource name of the account. + * Format: `accounts/{account}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAccountLicenseRequest. + * Use `create(GetAccountLicenseRequestSchema)` to create a new message. + */ +export const GetAccountLicenseRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 14); + +/** + * Response message for GetAccountLicense RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetAccountLicenseResponse + */ +export type GetAccountLicenseResponse = Message<"redpanda.api.aigateway.v1.GetAccountLicenseResponse"> & { + /** + * The license information for the account + * + * @generated from field: redpanda.api.aigateway.v1.LicenseInfo license = 1; + */ + license?: LicenseInfo; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAccountLicenseResponse. + * Use `create(GetAccountLicenseResponseSchema)` to create a new message. + */ +export const GetAccountLicenseResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_account, 15); + +/** + * LicenseType represents the license tier for an account. + * + * @generated from enum redpanda.api.aigateway.v1.LicenseType + */ +export enum LicenseType { + /** + * Unspecified license type + * + * @generated from enum value: LICENSE_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Trial license - limited features, time-limited + * + * @generated from enum value: LICENSE_TYPE_TRIAL = 1; + */ + TRIAL = 1, + + /** + * Professional license - standard features + * + * @generated from enum value: LICENSE_TYPE_PROFESSIONAL = 2; + */ + PROFESSIONAL = 2, + + /** + * Enterprise license - full features, SLA support + * + * @generated from enum value: LICENSE_TYPE_ENTERPRISE = 3; + */ + ENTERPRISE = 3, + + /** + * Unlimited license - no restrictions + * + * @generated from enum value: LICENSE_TYPE_UNLIMITED = 4; + */ + UNLIMITED = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.LicenseType. + */ +export const LicenseTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_account, 0); + +/** + * AccountService manages accounts - top-level billing entities. + * An account contains one or more organizations and serves as the billing boundary. + * Resource name: accounts/{account_id} + * + * @generated from service redpanda.api.aigateway.v1.AccountService + */ +export const AccountService: GenService<{ + /** + * Creates a new account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.CreateAccount + */ + createAccount: { + methodKind: "unary"; + input: typeof CreateAccountRequestSchema; + output: typeof CreateAccountResponseSchema; + }, + /** + * Gets an account by name. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.GetAccount + */ + getAccount: { + methodKind: "unary"; + input: typeof GetAccountRequestSchema; + output: typeof GetAccountResponseSchema; + }, + /** + * Lists accounts. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.ListAccounts + */ + listAccounts: { + methodKind: "unary"; + input: typeof ListAccountsRequestSchema; + output: typeof ListAccountsResponseSchema; + }, + /** + * Updates an account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.UpdateAccount + */ + updateAccount: { + methodKind: "unary"; + input: typeof UpdateAccountRequestSchema; + output: typeof UpdateAccountResponseSchema; + }, + /** + * Deletes an account. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.DeleteAccount + */ + deleteAccount: { + methodKind: "unary"; + input: typeof DeleteAccountRequestSchema; + output: typeof DeleteAccountResponseSchema; + }, + /** + * Sets the license key for an account. + * The license key is a JWT token signed by Redpanda. + * This operation will validate the JWT and store it encrypted at rest. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.SetAccountLicense + */ + setAccountLicense: { + methodKind: "unary"; + input: typeof SetAccountLicenseRequestSchema; + output: typeof SetAccountLicenseResponseSchema; + }, + /** + * Gets the current license information for an account. + * Returns the decoded license info without the encrypted key. + * + * @generated from rpc redpanda.api.aigateway.v1.AccountService.GetAccountLicense + */ + getAccountLicense: { + methodKind: "unary"; + input: typeof GetAccountLicenseRequestSchema; + output: typeof GetAccountLicenseResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_account, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/analytics-AnalyticsService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/analytics-AnalyticsService_connectquery.ts new file mode 100644 index 0000000000..36e1ee111f --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/analytics-AnalyticsService_connectquery.ts @@ -0,0 +1,37 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/analytics.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { AnalyticsService } from "./analytics_pb"; + +/** + * GetSpendingSummary returns high-level spending metrics for the dashboard. + * Includes total cost, requests, tokens, and trends compared to previous period. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary + */ +export const getSpendingSummary = AnalyticsService.method.getSpendingSummary; + +/** + * GetSpendingTimeSeries returns spending over time for line charts. + * Automatically selects granularity (hour/day/week) based on time range. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries + */ +export const getSpendingTimeSeries = AnalyticsService.method.getSpendingTimeSeries; + +/** + * GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + * Used for pie charts and bar charts showing distribution. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown + */ +export const getSpendingBreakdown = AnalyticsService.method.getSpendingBreakdown; + +/** + * GetTopSpenders returns the highest spending entities for a given dimension. + * Used for tables showing top users, teams, organizations, etc. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders + */ +export const getTopSpenders = AnalyticsService.method.getTopSpenders; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/analytics_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/analytics_pb.ts new file mode 100644 index 0000000000..b163eaf09e --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/analytics_pb.ts @@ -0,0 +1,947 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/analytics.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/analytics.proto. + */ +export const file_redpanda_api_aigateway_v1_analytics: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2FuYWx5dGljcy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJ7Cg9TcGVuZGluZ0ZpbHRlcnMSEAoIZ2F0ZXdheXMYASADKAkSEQoJcHJvdmlkZXJzGAIgAygJEg4KBm1vZGVscxgDIAMoCRINCgV0ZWFtcxgEIAMoCRIVCg1vcmdhbml6YXRpb25zGAUgAygJEg0KBXVzZXJzGAYgAygJIo4CChlHZXRTcGVuZGluZ1N1bW1hcnlSZXF1ZXN0EkcKCnRpbWVfcmFuZ2UYASABKA4yJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRpbWVSYW5nZUIN4EECukgHggEEEAEgABIzCgpzdGFydF9kYXRlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEjEKCGVuZF9kYXRlGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEkAKB2ZpbHRlcnMYBCABKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kaW5nRmlsdGVyc0ID4EEBIpICChpHZXRTcGVuZGluZ1N1bW1hcnlSZXNwb25zZRJACgdjdXJyZW50GAEgASgLMioucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TcGVuZGluZ1N1bW1hcnlCA+BBAxJBCghwcmV2aW91cxgCIAEoCzIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRpbmdTdW1tYXJ5QgPgQQMSPAoGdHJlbmRzGAMgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UcmVuZE1ldHJpY3NCA+BBAxIWCgl0b3BfbW9kZWwYBCABKAlCA+BBAxIZCgx0b3BfcHJvdmlkZXIYBSABKAlCA+BBAyK4AgoPU3BlbmRpbmdTdW1tYXJ5EhgKEHRvdGFsX2Nvc3RfY2VudHMYASABKAMSFgoOdG90YWxfcmVxdWVzdHMYAiABKAMSGgoSdG90YWxfaW5wdXRfdG9rZW5zGAMgASgDEhsKE3RvdGFsX291dHB1dF90b2tlbnMYBCABKAMSFAoMdG90YWxfdG9rZW5zGAUgASgDEiIKGmF2Z19jb3N0X3Blcl9yZXF1ZXN0X2NlbnRzGAYgASgDEh4KFmF2Z190b2tlbnNfcGVyX3JlcXVlc3QYByABKAMSMAoMcGVyaW9kX3N0YXJ0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpwZXJpb2RfZW5kGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKMAQoMVHJlbmRNZXRyaWNzEhsKE2Nvc3RfY2hhbmdlX3BlcmNlbnQYASABKAESHwoXcmVxdWVzdHNfY2hhbmdlX3BlcmNlbnQYAiABKAESHQoVdG9rZW5zX2NoYW5nZV9wZXJjZW50GAMgASgBEh8KF2F2Z19jb3N0X2NoYW5nZV9wZXJjZW50GAQgASgBItMCChxHZXRTcGVuZGluZ1RpbWVTZXJpZXNSZXF1ZXN0EkcKCnRpbWVfcmFuZ2UYASABKA4yJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRpbWVSYW5nZUIN4EECukgHggEEEAEgABIzCgpzdGFydF9kYXRlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEjEKCGVuZF9kYXRlGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEkAKB2ZpbHRlcnMYBCABKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kaW5nRmlsdGVyc0ID4EEBEkAKC2dyYW51bGFyaXR5GAUgASgOMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HcmFudWxhcml0eUID4EEBIuwBCh1HZXRTcGVuZGluZ1RpbWVTZXJpZXNSZXNwb25zZRJICgtkYXRhX3BvaW50cxgBIAMoCzIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGltZVNlcmllc0RhdGFQb2ludEID4EEDEkAKC2dyYW51bGFyaXR5GAIgASgOMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HcmFudWxhcml0eUID4EEDEj8KBnRvdGFscxgDIAEoCzIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRpbmdTdW1tYXJ5QgPgQQMipwEKE1RpbWVTZXJpZXNEYXRhUG9pbnQSLQoJdGltZXN0YW1wGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgpjb3N0X2NlbnRzGAIgASgDEhAKCHJlcXVlc3RzGAMgASgDEg4KBnRva2VucxgEIAEoAxIUCgxpbnB1dF90b2tlbnMYBSABKAMSFQoNb3V0cHV0X3Rva2VucxgGIAEoAyL+AgobR2V0U3BlbmRpbmdCcmVha2Rvd25SZXF1ZXN0Ek8KCWRpbWVuc2lvbhgBIAEoDjItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQnJlYWtkb3duRGltZW5zaW9uQg3gQQK6SAeCAQQQASAAEkcKCnRpbWVfcmFuZ2UYAiABKA4yJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRpbWVSYW5nZUIN4EECukgHggEEEAEgABIzCgpzdGFydF9kYXRlGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEjEKCGVuZF9kYXRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEkAKB2ZpbHRlcnMYBSABKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kaW5nRmlsdGVyc0ID4EEBEhsKBWxpbWl0GAYgASgFQgzgQQG6SAYaBBhkKAEixQEKHEdldFNwZW5kaW5nQnJlYWtkb3duUmVzcG9uc2USPwoHZW50cmllcxgBIAMoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQnJlYWtkb3duRW50cnlCA+BBAxIdChB0b3RhbF9jb3N0X2NlbnRzGAIgASgDQgPgQQMSRQoJZGltZW5zaW9uGAMgASgOMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5CcmVha2Rvd25EaW1lbnNpb25CA+BBAyKrAQoOQnJlYWtkb3duRW50cnkSDAoEbmFtZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSEgoKY29zdF9jZW50cxgDIAEoAxIQCghyZXF1ZXN0cxgEIAEoAxIOCgZ0b2tlbnMYBSABKAMSFAoMaW5wdXRfdG9rZW5zGAYgASgDEhUKDW91dHB1dF90b2tlbnMYByABKAMSEgoKcGVyY2VudGFnZRgIIAEoASL4AgoVR2V0VG9wU3BlbmRlcnNSZXF1ZXN0Ek8KCWRpbWVuc2lvbhgBIAEoDjItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQnJlYWtkb3duRGltZW5zaW9uQg3gQQK6SAeCAQQQASAAEkcKCnRpbWVfcmFuZ2UYAiABKA4yJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRpbWVSYW5nZUIN4EECukgHggEEEAEgABIzCgpzdGFydF9kYXRlGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEjEKCGVuZF9kYXRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBEkAKB2ZpbHRlcnMYBSABKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kaW5nRmlsdGVyc0ID4EEBEhsKBWxpbWl0GAYgASgFQgzgQQG6SAYaBBhkKAEioQEKFkdldFRvcFNwZW5kZXJzUmVzcG9uc2USQAoHZW50cmllcxgBIAMoCzIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVG9wU3BlbmRlckVudHJ5QgPgQQMSRQoJZGltZW5zaW9uGAIgASgOMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5CcmVha2Rvd25EaW1lbnNpb25CA+BBAyLGAQoPVG9wU3BlbmRlckVudHJ5EgwKBHJhbmsYASABKAUSDAoEbmFtZRgCIAEoCRIUCgxkaXNwbGF5X25hbWUYAyABKAkSEgoKY29zdF9jZW50cxgEIAEoAxIQCghyZXF1ZXN0cxgFIAEoAxIOCgZ0b2tlbnMYBiABKAMSIgoaYXZnX2Nvc3RfcGVyX3JlcXVlc3RfY2VudHMYByABKAMSEQoJdG9wX21vZGVsGAggASgJEhQKDHRvcF9wcm92aWRlchgJIAEoCSqIAQoJVGltZVJhbmdlEhoKFlRJTUVfUkFOR0VfVU5TUEVDSUZJRUQQABIXChNUSU1FX1JBTkdFX0xBU1RfMjRIEAESFgoSVElNRV9SQU5HRV9MQVNUXzdEEAISFwoTVElNRV9SQU5HRV9MQVNUXzMwRBADEhUKEVRJTUVfUkFOR0VfQ1VTVE9NEAQq/QEKEkJyZWFrZG93bkRpbWVuc2lvbhIjCh9CUkVBS0RPV05fRElNRU5TSU9OX1VOU1BFQ0lGSUVEEAASIAocQlJFQUtET1dOX0RJTUVOU0lPTl9QUk9WSURFUhABEh0KGUJSRUFLRE9XTl9ESU1FTlNJT05fTU9ERUwQAhIfChtCUkVBS0RPV05fRElNRU5TSU9OX0dBVEVXQVkQAxIcChhCUkVBS0RPV05fRElNRU5TSU9OX1RFQU0QBBIkCiBCUkVBS0RPV05fRElNRU5TSU9OX09SR0FOSVpBVElPThAFEhwKGEJSRUFLRE9XTl9ESU1FTlNJT05fVVNFUhAGKmsKC0dyYW51bGFyaXR5EhsKF0dSQU5VTEFSSVRZX1VOU1BFQ0lGSUVEEAASFAoQR1JBTlVMQVJJVFlfSE9VUhABEhMKD0dSQU5VTEFSSVRZX0RBWRACEhQKEEdSQU5VTEFSSVRZX1dFRUsQAzLrBQoQQW5hbHl0aWNzU2VydmljZRKpAQoSR2V0U3BlbmRpbmdTdW1tYXJ5EjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRTcGVuZGluZ1N1bW1hcnlSZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRTcGVuZGluZ1N1bW1hcnlSZXNwb25zZSImgtPkkwIgEh4vdjEvYW5hbHl0aWNzL3NwZW5kaW5nL3N1bW1hcnkStgEKFUdldFNwZW5kaW5nVGltZVNlcmllcxI3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRpbmdUaW1lU2VyaWVzUmVxdWVzdBo4LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRpbmdUaW1lU2VyaWVzUmVzcG9uc2UiKoLT5JMCJBIiL3YxL2FuYWx5dGljcy9zcGVuZGluZy90aW1lLXNlcmllcxKxAQoUR2V0U3BlbmRpbmdCcmVha2Rvd24SNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFNwZW5kaW5nQnJlYWtkb3duUmVxdWVzdBo3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRpbmdCcmVha2Rvd25SZXNwb25zZSIogtPkkwIiEiAvdjEvYW5hbHl0aWNzL3NwZW5kaW5nL2JyZWFrZG93bhKiAQoOR2V0VG9wU3BlbmRlcnMSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFRvcFNwZW5kZXJzUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0VG9wU3BlbmRlcnNSZXNwb25zZSIrgtPkkwIlEiMvdjEvYW5hbHl0aWNzL3NwZW5kaW5nL3RvcC1zcGVuZGVycxoZykEWYWlnYXRld2F5LnJlZHBhbmRhLmNvbUKDAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCDkFuYWx5dGljc1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_protobuf_timestamp]); + +/** + * SpendingFilters allows filtering analytics queries by multiple dimensions. + * + * @generated from message redpanda.api.aigateway.v1.SpendingFilters + */ +export type SpendingFilters = Message<"redpanda.api.aigateway.v1.SpendingFilters"> & { + /** + * Optional: Filter by specific gateways + * + * @generated from field: repeated string gateways = 1; + */ + gateways: string[]; + + /** + * Optional: Filter by specific providers + * + * @generated from field: repeated string providers = 2; + */ + providers: string[]; + + /** + * Optional: Filter by specific models + * + * @generated from field: repeated string models = 3; + */ + models: string[]; + + /** + * Optional: Filter by specific teams (JSONB extraction) + * + * @generated from field: repeated string teams = 4; + */ + teams: string[]; + + /** + * Optional: Filter by specific organizations (JSONB extraction) + * + * @generated from field: repeated string organizations = 5; + */ + organizations: string[]; + + /** + * Optional: Filter by specific users (JSONB extraction) + * + * @generated from field: repeated string users = 6; + */ + users: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendingFilters. + * Use `create(SpendingFiltersSchema)` to create a new message. + */ +export const SpendingFiltersSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 0); + +/** + * Request message for GetSpendingSummary + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingSummaryRequest + */ +export type GetSpendingSummaryRequest = Message<"redpanda.api.aigateway.v1.GetSpendingSummaryRequest"> & { + /** + * Required: Time range for the summary + * + * @generated from field: redpanda.api.aigateway.v1.TimeRange time_range = 1; + */ + timeRange: TimeRange; + + /** + * Optional: Custom start date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp start_date = 2; + */ + startDate?: Timestamp; + + /** + * Optional: Custom end date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp end_date = 3; + */ + endDate?: Timestamp; + + /** + * Optional: Filters to apply + * + * @generated from field: redpanda.api.aigateway.v1.SpendingFilters filters = 4; + */ + filters?: SpendingFilters; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingSummaryRequest. + * Use `create(GetSpendingSummaryRequestSchema)` to create a new message. + */ +export const GetSpendingSummaryRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 1); + +/** + * Response message for GetSpendingSummary + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingSummaryResponse + */ +export type GetSpendingSummaryResponse = Message<"redpanda.api.aigateway.v1.GetSpendingSummaryResponse"> & { + /** + * Current period metrics + * + * @generated from field: redpanda.api.aigateway.v1.SpendingSummary current = 1; + */ + current?: SpendingSummary; + + /** + * Previous period metrics (for trend calculation) + * + * @generated from field: redpanda.api.aigateway.v1.SpendingSummary previous = 2; + */ + previous?: SpendingSummary; + + /** + * Percentage change from previous period + * + * @generated from field: redpanda.api.aigateway.v1.TrendMetrics trends = 3; + */ + trends?: TrendMetrics; + + /** + * Top model by cost in current period + * + * @generated from field: string top_model = 4; + */ + topModel: string; + + /** + * Top provider by cost in current period + * + * @generated from field: string top_provider = 5; + */ + topProvider: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingSummaryResponse. + * Use `create(GetSpendingSummaryResponseSchema)` to create a new message. + */ +export const GetSpendingSummaryResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 2); + +/** + * SpendingSummary contains aggregated metrics for a time period. + * + * @generated from message redpanda.api.aigateway.v1.SpendingSummary + */ +export type SpendingSummary = Message<"redpanda.api.aigateway.v1.SpendingSummary"> & { + /** + * Total cost in cents + * + * @generated from field: int64 total_cost_cents = 1; + */ + totalCostCents: bigint; + + /** + * Total number of requests + * + * @generated from field: int64 total_requests = 2; + */ + totalRequests: bigint; + + /** + * Total input tokens + * + * @generated from field: int64 total_input_tokens = 3; + */ + totalInputTokens: bigint; + + /** + * Total output tokens + * + * @generated from field: int64 total_output_tokens = 4; + */ + totalOutputTokens: bigint; + + /** + * Total tokens (input + output) + * + * @generated from field: int64 total_tokens = 5; + */ + totalTokens: bigint; + + /** + * Average cost per request in cents + * + * @generated from field: int64 avg_cost_per_request_cents = 6; + */ + avgCostPerRequestCents: bigint; + + /** + * Average tokens per request + * + * @generated from field: int64 avg_tokens_per_request = 7; + */ + avgTokensPerRequest: bigint; + + /** + * Period start time + * + * @generated from field: google.protobuf.Timestamp period_start = 8; + */ + periodStart?: Timestamp; + + /** + * Period end time + * + * @generated from field: google.protobuf.Timestamp period_end = 9; + */ + periodEnd?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendingSummary. + * Use `create(SpendingSummarySchema)` to create a new message. + */ +export const SpendingSummarySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 3); + +/** + * TrendMetrics contains percentage changes compared to previous period. + * + * @generated from message redpanda.api.aigateway.v1.TrendMetrics + */ +export type TrendMetrics = Message<"redpanda.api.aigateway.v1.TrendMetrics"> & { + /** + * Cost change percentage (-100 to +infinity) + * + * @generated from field: double cost_change_percent = 1; + */ + costChangePercent: number; + + /** + * Requests change percentage + * + * @generated from field: double requests_change_percent = 2; + */ + requestsChangePercent: number; + + /** + * Tokens change percentage + * + * @generated from field: double tokens_change_percent = 3; + */ + tokensChangePercent: number; + + /** + * Average cost per request change percentage + * + * @generated from field: double avg_cost_change_percent = 4; + */ + avgCostChangePercent: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TrendMetrics. + * Use `create(TrendMetricsSchema)` to create a new message. + */ +export const TrendMetricsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 4); + +/** + * Request message for GetSpendingTimeSeries + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest + */ +export type GetSpendingTimeSeriesRequest = Message<"redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest"> & { + /** + * Required: Time range + * + * @generated from field: redpanda.api.aigateway.v1.TimeRange time_range = 1; + */ + timeRange: TimeRange; + + /** + * Optional: Custom start date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp start_date = 2; + */ + startDate?: Timestamp; + + /** + * Optional: Custom end date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp end_date = 3; + */ + endDate?: Timestamp; + + /** + * Optional: Filters to apply + * + * @generated from field: redpanda.api.aigateway.v1.SpendingFilters filters = 4; + */ + filters?: SpendingFilters; + + /** + * Optional: Granularity (auto-selected if not specified) + * + * @generated from field: redpanda.api.aigateway.v1.Granularity granularity = 5; + */ + granularity: Granularity; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingTimeSeriesRequest. + * Use `create(GetSpendingTimeSeriesRequestSchema)` to create a new message. + */ +export const GetSpendingTimeSeriesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 5); + +/** + * Response message for GetSpendingTimeSeries + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse + */ +export type GetSpendingTimeSeriesResponse = Message<"redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse"> & { + /** + * Time series data points + * + * @generated from field: repeated redpanda.api.aigateway.v1.TimeSeriesDataPoint data_points = 1; + */ + dataPoints: TimeSeriesDataPoint[]; + + /** + * Granularity used for the time series + * + * @generated from field: redpanda.api.aigateway.v1.Granularity granularity = 2; + */ + granularity: Granularity; + + /** + * Total metrics across all data points + * + * @generated from field: redpanda.api.aigateway.v1.SpendingSummary totals = 3; + */ + totals?: SpendingSummary; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingTimeSeriesResponse. + * Use `create(GetSpendingTimeSeriesResponseSchema)` to create a new message. + */ +export const GetSpendingTimeSeriesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 6); + +/** + * TimeSeriesDataPoint represents metrics for a single time bucket. + * + * @generated from message redpanda.api.aigateway.v1.TimeSeriesDataPoint + */ +export type TimeSeriesDataPoint = Message<"redpanda.api.aigateway.v1.TimeSeriesDataPoint"> & { + /** + * Timestamp for this bucket (start of period) + * + * @generated from field: google.protobuf.Timestamp timestamp = 1; + */ + timestamp?: Timestamp; + + /** + * Cost in cents for this period + * + * @generated from field: int64 cost_cents = 2; + */ + costCents: bigint; + + /** + * Number of requests in this period + * + * @generated from field: int64 requests = 3; + */ + requests: bigint; + + /** + * Total tokens in this period + * + * @generated from field: int64 tokens = 4; + */ + tokens: bigint; + + /** + * Input tokens in this period + * + * @generated from field: int64 input_tokens = 5; + */ + inputTokens: bigint; + + /** + * Output tokens in this period + * + * @generated from field: int64 output_tokens = 6; + */ + outputTokens: bigint; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TimeSeriesDataPoint. + * Use `create(TimeSeriesDataPointSchema)` to create a new message. + */ +export const TimeSeriesDataPointSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 7); + +/** + * Request message for GetSpendingBreakdown + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingBreakdownRequest + */ +export type GetSpendingBreakdownRequest = Message<"redpanda.api.aigateway.v1.GetSpendingBreakdownRequest"> & { + /** + * Required: Dimension to break down by + * + * @generated from field: redpanda.api.aigateway.v1.BreakdownDimension dimension = 1; + */ + dimension: BreakdownDimension; + + /** + * Required: Time range + * + * @generated from field: redpanda.api.aigateway.v1.TimeRange time_range = 2; + */ + timeRange: TimeRange; + + /** + * Optional: Custom start date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp start_date = 3; + */ + startDate?: Timestamp; + + /** + * Optional: Custom end date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp end_date = 4; + */ + endDate?: Timestamp; + + /** + * Optional: Filters to apply + * + * @generated from field: redpanda.api.aigateway.v1.SpendingFilters filters = 5; + */ + filters?: SpendingFilters; + + /** + * Optional: Maximum number of results (default: 20, max: 100) + * + * @generated from field: int32 limit = 6; + */ + limit: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingBreakdownRequest. + * Use `create(GetSpendingBreakdownRequestSchema)` to create a new message. + */ +export const GetSpendingBreakdownRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 8); + +/** + * Response message for GetSpendingBreakdown + * + * @generated from message redpanda.api.aigateway.v1.GetSpendingBreakdownResponse + */ +export type GetSpendingBreakdownResponse = Message<"redpanda.api.aigateway.v1.GetSpendingBreakdownResponse"> & { + /** + * Breakdown entries sorted by cost descending + * + * @generated from field: repeated redpanda.api.aigateway.v1.BreakdownEntry entries = 1; + */ + entries: BreakdownEntry[]; + + /** + * Total cost across all entries + * + * @generated from field: int64 total_cost_cents = 2; + */ + totalCostCents: bigint; + + /** + * Dimension used for breakdown + * + * @generated from field: redpanda.api.aigateway.v1.BreakdownDimension dimension = 3; + */ + dimension: BreakdownDimension; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendingBreakdownResponse. + * Use `create(GetSpendingBreakdownResponseSchema)` to create a new message. + */ +export const GetSpendingBreakdownResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 9); + +/** + * BreakdownEntry represents spending for a single dimension value. + * + * @generated from message redpanda.api.aigateway.v1.BreakdownEntry + */ +export type BreakdownEntry = Message<"redpanda.api.aigateway.v1.BreakdownEntry"> & { + /** + * Dimension value (e.g., "openai", "gpt-4o", "gateway-1", "team-a") + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Display name (if different from name) + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Cost in cents + * + * @generated from field: int64 cost_cents = 3; + */ + costCents: bigint; + + /** + * Number of requests + * + * @generated from field: int64 requests = 4; + */ + requests: bigint; + + /** + * Total tokens + * + * @generated from field: int64 tokens = 5; + */ + tokens: bigint; + + /** + * Input tokens + * + * @generated from field: int64 input_tokens = 6; + */ + inputTokens: bigint; + + /** + * Output tokens + * + * @generated from field: int64 output_tokens = 7; + */ + outputTokens: bigint; + + /** + * Percentage of total cost + * + * @generated from field: double percentage = 8; + */ + percentage: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.BreakdownEntry. + * Use `create(BreakdownEntrySchema)` to create a new message. + */ +export const BreakdownEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 10); + +/** + * Request message for GetTopSpenders + * + * @generated from message redpanda.api.aigateway.v1.GetTopSpendersRequest + */ +export type GetTopSpendersRequest = Message<"redpanda.api.aigateway.v1.GetTopSpendersRequest"> & { + /** + * Required: Dimension to rank by + * + * @generated from field: redpanda.api.aigateway.v1.BreakdownDimension dimension = 1; + */ + dimension: BreakdownDimension; + + /** + * Required: Time range + * + * @generated from field: redpanda.api.aigateway.v1.TimeRange time_range = 2; + */ + timeRange: TimeRange; + + /** + * Optional: Custom start date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp start_date = 3; + */ + startDate?: Timestamp; + + /** + * Optional: Custom end date (required if time_range = CUSTOM) + * + * @generated from field: google.protobuf.Timestamp end_date = 4; + */ + endDate?: Timestamp; + + /** + * Optional: Filters to apply + * + * @generated from field: redpanda.api.aigateway.v1.SpendingFilters filters = 5; + */ + filters?: SpendingFilters; + + /** + * Optional: Maximum number of results (default: 10, max: 100) + * + * @generated from field: int32 limit = 6; + */ + limit: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTopSpendersRequest. + * Use `create(GetTopSpendersRequestSchema)` to create a new message. + */ +export const GetTopSpendersRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 11); + +/** + * Response message for GetTopSpenders + * + * @generated from message redpanda.api.aigateway.v1.GetTopSpendersResponse + */ +export type GetTopSpendersResponse = Message<"redpanda.api.aigateway.v1.GetTopSpendersResponse"> & { + /** + * Top spenders sorted by cost descending + * + * @generated from field: repeated redpanda.api.aigateway.v1.TopSpenderEntry entries = 1; + */ + entries: TopSpenderEntry[]; + + /** + * Dimension used for ranking + * + * @generated from field: redpanda.api.aigateway.v1.BreakdownDimension dimension = 2; + */ + dimension: BreakdownDimension; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTopSpendersResponse. + * Use `create(GetTopSpendersResponseSchema)` to create a new message. + */ +export const GetTopSpendersResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 12); + +/** + * TopSpenderEntry represents a single top spender. + * + * @generated from message redpanda.api.aigateway.v1.TopSpenderEntry + */ +export type TopSpenderEntry = Message<"redpanda.api.aigateway.v1.TopSpenderEntry"> & { + /** + * Rank (1 = highest spender) + * + * @generated from field: int32 rank = 1; + */ + rank: number; + + /** + * Dimension value (e.g., user ID, team name) + * + * @generated from field: string name = 2; + */ + name: string; + + /** + * Display name (if different from name) + * + * @generated from field: string display_name = 3; + */ + displayName: string; + + /** + * Cost in cents + * + * @generated from field: int64 cost_cents = 4; + */ + costCents: bigint; + + /** + * Number of requests + * + * @generated from field: int64 requests = 5; + */ + requests: bigint; + + /** + * Total tokens + * + * @generated from field: int64 tokens = 6; + */ + tokens: bigint; + + /** + * Average cost per request in cents + * + * @generated from field: int64 avg_cost_per_request_cents = 7; + */ + avgCostPerRequestCents: bigint; + + /** + * Most used model + * + * @generated from field: string top_model = 8; + */ + topModel: string; + + /** + * Most used provider + * + * @generated from field: string top_provider = 9; + */ + topProvider: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TopSpenderEntry. + * Use `create(TopSpenderEntrySchema)` to create a new message. + */ +export const TopSpenderEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_analytics, 13); + +/** + * TimeRange specifies predefined time windows for analytics queries. + * + * @generated from enum redpanda.api.aigateway.v1.TimeRange + */ +export enum TimeRange { + /** + * @generated from enum value: TIME_RANGE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Last 24 hours + * + * @generated from enum value: TIME_RANGE_LAST_24H = 1; + */ + LAST_24H = 1, + + /** + * Last 7 days + * + * @generated from enum value: TIME_RANGE_LAST_7D = 2; + */ + LAST_7D = 2, + + /** + * Last 30 days + * + * @generated from enum value: TIME_RANGE_LAST_30D = 3; + */ + LAST_30D = 3, + + /** + * Custom start/end dates + * + * @generated from enum value: TIME_RANGE_CUSTOM = 4; + */ + CUSTOM = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.TimeRange. + */ +export const TimeRangeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_analytics, 0); + +/** + * BreakdownDimension specifies how to group spending data. + * + * @generated from enum redpanda.api.aigateway.v1.BreakdownDimension + */ +export enum BreakdownDimension { + /** + * @generated from enum value: BREAKDOWN_DIMENSION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Group by LLM provider (openai, anthropic) + * + * @generated from enum value: BREAKDOWN_DIMENSION_PROVIDER = 1; + */ + PROVIDER = 1, + + /** + * Group by model ID (gpt-4o, claude-3-5-sonnet) + * + * @generated from enum value: BREAKDOWN_DIMENSION_MODEL = 2; + */ + MODEL = 2, + + /** + * Group by gateway/frontend ID + * + * @generated from enum value: BREAKDOWN_DIMENSION_GATEWAY = 3; + */ + GATEWAY = 3, + + /** + * Group by team from OIDC claims + * + * @generated from enum value: BREAKDOWN_DIMENSION_TEAM = 4; + */ + TEAM = 4, + + /** + * Group by organization from OIDC claims + * + * @generated from enum value: BREAKDOWN_DIMENSION_ORGANIZATION = 5; + */ + ORGANIZATION = 5, + + /** + * Group by user from OIDC claims + * + * @generated from enum value: BREAKDOWN_DIMENSION_USER = 6; + */ + USER = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.BreakdownDimension. + */ +export const BreakdownDimensionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_analytics, 1); + +/** + * Granularity specifies the time bucket size for time series data. + * + * @generated from enum redpanda.api.aigateway.v1.Granularity + */ +export enum Granularity { + /** + * @generated from enum value: GRANULARITY_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Hourly buckets + * + * @generated from enum value: GRANULARITY_HOUR = 1; + */ + HOUR = 1, + + /** + * Daily buckets + * + * @generated from enum value: GRANULARITY_DAY = 2; + */ + DAY = 2, + + /** + * Weekly buckets + * + * @generated from enum value: GRANULARITY_WEEK = 3; + */ + WEEK = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.Granularity. + */ +export const GranularitySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_analytics, 2); + +/** + * AnalyticsService provides spending analytics and insights across all gateways. + * It aggregates token usage and cost data from the token tracker database. + * + * @generated from service redpanda.api.aigateway.v1.AnalyticsService + */ +export const AnalyticsService: GenService<{ + /** + * GetSpendingSummary returns high-level spending metrics for the dashboard. + * Includes total cost, requests, tokens, and trends compared to previous period. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingSummary + */ + getSpendingSummary: { + methodKind: "unary"; + input: typeof GetSpendingSummaryRequestSchema; + output: typeof GetSpendingSummaryResponseSchema; + }, + /** + * GetSpendingTimeSeries returns spending over time for line charts. + * Automatically selects granularity (hour/day/week) based on time range. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingTimeSeries + */ + getSpendingTimeSeries: { + methodKind: "unary"; + input: typeof GetSpendingTimeSeriesRequestSchema; + output: typeof GetSpendingTimeSeriesResponseSchema; + }, + /** + * GetSpendingBreakdown returns spending grouped by a dimension (provider, model, etc). + * Used for pie charts and bar charts showing distribution. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetSpendingBreakdown + */ + getSpendingBreakdown: { + methodKind: "unary"; + input: typeof GetSpendingBreakdownRequestSchema; + output: typeof GetSpendingBreakdownResponseSchema; + }, + /** + * GetTopSpenders returns the highest spending entities for a given dimension. + * Used for tables showing top users, teams, organizations, etc. + * + * @generated from rpc redpanda.api.aigateway.v1.AnalyticsService.GetTopSpenders + */ + getTopSpenders: { + methodKind: "unary"; + input: typeof GetTopSpendersRequestSchema; + output: typeof GetTopSpendersResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_analytics, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/audit-AuditService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/audit-AuditService_connectquery.ts new file mode 100644 index 0000000000..5a7e1b3fbb --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/audit-AuditService_connectquery.ts @@ -0,0 +1,19 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/audit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { AuditService } from "./audit_pb"; + +/** + * ListAuditLogs returns audit log entries for a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.AuditService.ListAuditLogs + */ +export const listAuditLogs = AuditService.method.listAuditLogs; + +/** + * GetAuditLog returns a single audit log entry. + * + * @generated from rpc redpanda.api.aigateway.v1.AuditService.GetAuditLog + */ +export const getAuditLog = AuditService.method.getAuditLog; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/audit_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/audit_pb.ts new file mode 100644 index 0000000000..87ef2ccad9 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/audit_pb.ts @@ -0,0 +1,651 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/audit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import type { Timestamp, Value } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/audit.proto. + */ +export const file_redpanda_api_aigateway_v1_audit: GenFile = /*@__PURE__*/ + fileDesc("CiVyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2F1ZGl0LnByb3RvEhlyZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxIv4FCghBdWRpdExvZxIKCgJpZBgBIAEoCRIRCgljbGFzc191aWQYAiABKAUSFAoMY2F0ZWdvcnlfdWlkGAMgASgFEkEKC2FjdGl2aXR5X2lkGAQgASgOMiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdWRpdEFjdGl2aXR5VHlwZRIQCgh0eXBlX3VpZBgFIAEoAxIQCghhY3Rpdml0eRgGIAEoCRIoCgR0aW1lGAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpzdGFydF90aW1lGAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRfdGltZRgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASPQoLc2V2ZXJpdHlfaWQYFCABKA4yKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkF1ZGl0U2V2ZXJpdHkSEAoIc2V2ZXJpdHkYFSABKAkSOQoJc3RhdHVzX2lkGBYgASgOMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdWRpdFN0YXR1cxIOCgZzdGF0dXMYFyABKAkSFQoNc3RhdHVzX2RldGFpbBgYIAEoCRI0CgVhY3RvchgeIAEoCzIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXVkaXRBY3RvchI2CgZlbnRpdHkYKCABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkF1ZGl0RW50aXR5Ej0KDWVudGl0eV9yZXN1bHQYKSABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkF1ZGl0RW50aXR5EjgKCHVubWFwcGVkGDIgAygLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5GaWVsZENoYW5nZRIPCgdtZXNzYWdlGDwgASgJEg8KB2NvbW1lbnQYPSABKAkSEgoKZ2F0ZXdheV9pZBg+IAEoCSKMAQoKQXVkaXRBY3RvchIyCgR1c2VyGAEgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdWRpdFVzZXISOAoHc2Vzc2lvbhgCIAEoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXVkaXRTZXNzaW9uEhAKCGFwcF9uYW1lGAMgASgJIjUKCUF1ZGl0VXNlchILCgN1aWQYASABKAkSDQoFZW1haWwYAiABKAkSDAoEbmFtZRgDIAEoCSIbCgxBdWRpdFNlc3Npb24SCwoDdWlkGAEgASgJIl0KC0F1ZGl0RW50aXR5EgsKA3VpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBHR5cGUYAyABKAkSJQoEZGF0YRgEIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QicgoLRmllbGRDaGFuZ2USDQoFZmllbGQYASABKAkSKQoJb2xkX3ZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlEikKCW5ld192YWx1ZRgDIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSL3AQoUTGlzdEF1ZGl0TG9nc1JlcXVlc3QSFwoGcGFyZW50GAEgASgJQge6SARyAhABEhMKC2VudGl0eV90eXBlGAIgASgJEkEKC2FjdGl2aXR5X2lkGAMgASgOMiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdWRpdEFjdGl2aXR5VHlwZRIQCghhY3Rvcl9pZBgEIAEoCRIpCgVzaW5jZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASHQoJcGFnZV9zaXplGAYgASgFQgq6SAcaBRjIASgAEhIKCnBhZ2VfdG9rZW4YByABKAkifgoVTGlzdEF1ZGl0TG9nc1Jlc3BvbnNlEjcKCmF1ZGl0X2xvZ3MYASADKAsyIy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkF1ZGl0TG9nEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoBSIrChJHZXRBdWRpdExvZ1JlcXVlc3QSFQoEbmFtZRgBIAEoCUIHukgEcgIQASJNChNHZXRBdWRpdExvZ1Jlc3BvbnNlEjYKCWF1ZGl0X2xvZxgBIAEoCzIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXVkaXRMb2cq9wEKEUF1ZGl0QWN0aXZpdHlUeXBlEiMKH0FVRElUX0FDVElWSVRZX1RZUEVfVU5TUEVDSUZJRUQQABIeChpBVURJVF9BQ1RJVklUWV9UWVBFX0NSRUFURRABEhwKGEFVRElUX0FDVElWSVRZX1RZUEVfUkVBRBACEh4KGkFVRElUX0FDVElWSVRZX1RZUEVfVVBEQVRFEAMSHgoaQVVESVRfQUNUSVZJVFlfVFlQRV9ERUxFVEUQBBIeChpBVURJVF9BQ1RJVklUWV9UWVBFX0VOQUJMRRAIEh8KG0FVRElUX0FDVElWSVRZX1RZUEVfRElTQUJMRRAJKtQBCg1BdWRpdFNldmVyaXR5Eh4KGkFVRElUX1NFVkVSSVRZX1VOU1BFQ0lGSUVEEAASIAocQVVESVRfU0VWRVJJVFlfSU5GT1JNQVRJT05BTBABEhYKEkFVRElUX1NFVkVSSVRZX0xPVxACEhkKFUFVRElUX1NFVkVSSVRZX01FRElVTRADEhcKE0FVRElUX1NFVkVSSVRZX0hJR0gQBBIbChdBVURJVF9TRVZFUklUWV9DUklUSUNBTBAFEhgKFEFVRElUX1NFVkVSSVRZX0ZBVEFMEAYqXwoLQXVkaXRTdGF0dXMSHAoYQVVESVRfU1RBVFVTX1VOU1BFQ0lGSUVEEAASGAoUQVVESVRfU1RBVFVTX1NVQ0NFU1MQARIYChRBVURJVF9TVEFUVVNfRkFJTFVSRRACMvABCgxBdWRpdFNlcnZpY2UScgoNTGlzdEF1ZGl0TG9ncxIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdEF1ZGl0TG9nc1JlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RBdWRpdExvZ3NSZXNwb25zZRJsCgtHZXRBdWRpdExvZxItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0QXVkaXRMb2dSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRBdWRpdExvZ1Jlc3BvbnNlQv8BCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUIKQXVkaXRQcm90b1ABWktnby5wYW5kYS5kZXYvcmVkcGFuZGEtYWlndy9wcm90b3MvZ2VuL3JlZHBhbmRhL2FwaS9haWdhdGV3YXkvdjE7YWlnYXRld2F5djGiAgNSQUGqAhlSZWRwYW5kYS5BcGkuQWlnYXRld2F5LlYxygIZUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMeICJVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjFcR1BCTWV0YWRhdGHqAhxSZWRwYW5kYTo6QXBpOjpBaWdhdGV3YXk6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_protobuf_timestamp, file_google_protobuf_struct]); + +/** + * AuditLog represents an OCSF Entity Management event (class 3004). + * https://schema.ocsf.io/1.0.0/classes/entity_management + * + * @generated from message redpanda.api.aigateway.v1.AuditLog + */ +export type AuditLog = Message<"redpanda.api.aigateway.v1.AuditLog"> & { + /** + * Unique identifier for this audit log entry. + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * OCSF Base Event fields + * + * 3004 = Entity Management + * + * @generated from field: int32 class_uid = 2; + */ + classUid: number; + + /** + * 3 = Identity & Access Management + * + * @generated from field: int32 category_uid = 3; + */ + categoryUid: number; + + /** + * @generated from field: redpanda.api.aigateway.v1.AuditActivityType activity_id = 4; + */ + activityId: AuditActivityType; + + /** + * class_uid * 100 + activity_id + * + * @generated from field: int64 type_uid = 5; + */ + typeUid: bigint; + + /** + * Human-readable: "Create", "Update", "Delete" + * + * @generated from field: string activity = 6; + */ + activity: string; + + /** + * Temporal + * + * @generated from field: google.protobuf.Timestamp time = 10; + */ + time?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp start_time = 11; + */ + startTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp end_time = 12; + */ + endTime?: Timestamp; + + /** + * Severity & Status + * + * @generated from field: redpanda.api.aigateway.v1.AuditSeverity severity_id = 20; + */ + severityId: AuditSeverity; + + /** + * "Informational", "Low", etc. + * + * @generated from field: string severity = 21; + */ + severity: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.AuditStatus status_id = 22; + */ + statusId: AuditStatus; + + /** + * "Success", "Failure" + * + * @generated from field: string status = 23; + */ + status: string; + + /** + * Error message if failed + * + * @generated from field: string status_detail = 24; + */ + statusDetail: string; + + /** + * Actor (who performed the action) + * + * @generated from field: redpanda.api.aigateway.v1.AuditActor actor = 30; + */ + actor?: AuditActor; + + /** + * Entity (resource being managed) + * + * @generated from field: redpanda.api.aigateway.v1.AuditEntity entity = 40; + */ + entity?: AuditEntity; + + /** + * State after change + * + * @generated from field: redpanda.api.aigateway.v1.AuditEntity entity_result = 41; + */ + entityResult?: AuditEntity; + + /** + * Field-level changes (stored in OCSF unmapped field) + * + * @generated from field: repeated redpanda.api.aigateway.v1.FieldChange unmapped = 50; + */ + unmapped: FieldChange[]; + + /** + * Context + * + * Human-readable event description + * + * @generated from field: string message = 60; + */ + message: string; + + /** + * User-provided rationale + * + * @generated from field: string comment = 61; + */ + comment: string; + + /** + * Parent gateway ID for scoping + * + * @generated from field: string gateway_id = 62; + */ + gatewayId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuditLog. + * Use `create(AuditLogSchema)` to create a new message. + */ +export const AuditLogSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 0); + +/** + * AuditActor represents who performed the action (OCSF Actor object). + * + * @generated from message redpanda.api.aigateway.v1.AuditActor + */ +export type AuditActor = Message<"redpanda.api.aigateway.v1.AuditActor"> & { + /** + * The user who performed the action + * + * @generated from field: redpanda.api.aigateway.v1.AuditUser user = 1; + */ + user?: AuditUser; + + /** + * Session information + * + * @generated from field: redpanda.api.aigateway.v1.AuditSession session = 2; + */ + session?: AuditSession; + + /** + * Application name (e.g., "webui", "api", "cli") + * + * @generated from field: string app_name = 3; + */ + appName: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuditActor. + * Use `create(AuditActorSchema)` to create a new message. + */ +export const AuditActorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 1); + +/** + * AuditUser represents the authenticated user info in audit context. + * + * @generated from message redpanda.api.aigateway.v1.AuditUser + */ +export type AuditUser = Message<"redpanda.api.aigateway.v1.AuditUser"> & { + /** + * User unique identifier + * + * @generated from field: string uid = 1; + */ + uid: string; + + /** + * User email address + * + * @generated from field: string email = 2; + */ + email: string; + + /** + * User display name + * + * @generated from field: string name = 3; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuditUser. + * Use `create(AuditUserSchema)` to create a new message. + */ +export const AuditUserSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 2); + +/** + * AuditSession represents the session context (OCSF Session object). + * + * @generated from message redpanda.api.aigateway.v1.AuditSession + */ +export type AuditSession = Message<"redpanda.api.aigateway.v1.AuditSession"> & { + /** + * Session unique identifier + * + * @generated from field: string uid = 1; + */ + uid: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuditSession. + * Use `create(AuditSessionSchema)` to create a new message. + */ +export const AuditSessionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 3); + +/** + * AuditEntity represents the managed resource (OCSF Managed Entity object). + * + * @generated from message redpanda.api.aigateway.v1.AuditEntity + */ +export type AuditEntity = Message<"redpanda.api.aigateway.v1.AuditEntity"> & { + /** + * Resource unique identifier + * + * @generated from field: string uid = 1; + */ + uid: string; + + /** + * Full resource name path (e.g., "gateways/xxx/backendPools/yyy") + * + * @generated from field: string name = 2; + */ + name: string; + + /** + * Resource type (e.g., "gateway", "backend_pool", "routing_rule") + * + * @generated from field: string type = 3; + */ + type: string; + + /** + * Resource data/state as a JSON structure + * + * @generated from field: google.protobuf.Struct data = 4; + */ + data?: JsonObject; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuditEntity. + * Use `create(AuditEntitySchema)` to create a new message. + */ +export const AuditEntitySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 4); + +/** + * FieldChange represents a single field that was changed. + * + * @generated from message redpanda.api.aigateway.v1.FieldChange + */ +export type FieldChange = Message<"redpanda.api.aigateway.v1.FieldChange"> & { + /** + * The name of the field that changed. + * + * @generated from field: string field = 1; + */ + field: string; + + /** + * The old value (before the change). + * + * @generated from field: google.protobuf.Value old_value = 2; + */ + oldValue?: Value; + + /** + * The new value (after the change). + * + * @generated from field: google.protobuf.Value new_value = 3; + */ + newValue?: Value; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.FieldChange. + * Use `create(FieldChangeSchema)` to create a new message. + */ +export const FieldChangeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 5); + +/** + * ListAuditLogsRequest is the request for ListAuditLogs. + * + * @generated from message redpanda.api.aigateway.v1.ListAuditLogsRequest + */ +export type ListAuditLogsRequest = Message<"redpanda.api.aigateway.v1.ListAuditLogsRequest"> & { + /** + * Required. The gateway to list audit logs for. + * Format: gateways/{gateway_id} + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Optional. Filter by entity type (e.g., "backend_pool", "routing_rule"). + * + * @generated from field: string entity_type = 2; + */ + entityType: string; + + /** + * Optional. Filter by activity type. + * + * @generated from field: redpanda.api.aigateway.v1.AuditActivityType activity_id = 3; + */ + activityId: AuditActivityType; + + /** + * Optional. Filter by actor (user ID). + * + * @generated from field: string actor_id = 4; + */ + actorId: string; + + /** + * Optional. Only return logs since this timestamp. + * + * @generated from field: google.protobuf.Timestamp since = 5; + */ + since?: Timestamp; + + /** + * Maximum number of results to return. Default: 50, Max: 200. + * + * @generated from field: int32 page_size = 6; + */ + pageSize: number; + + /** + * Page token for pagination. + * + * @generated from field: string page_token = 7; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListAuditLogsRequest. + * Use `create(ListAuditLogsRequestSchema)` to create a new message. + */ +export const ListAuditLogsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 6); + +/** + * ListAuditLogsResponse is the response for ListAuditLogs. + * + * @generated from message redpanda.api.aigateway.v1.ListAuditLogsResponse + */ +export type ListAuditLogsResponse = Message<"redpanda.api.aigateway.v1.ListAuditLogsResponse"> & { + /** + * The audit log entries. + * + * @generated from field: repeated redpanda.api.aigateway.v1.AuditLog audit_logs = 1; + */ + auditLogs: AuditLog[]; + + /** + * Token to retrieve the next page. + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total number of audit logs matching the filter. + * + * @generated from field: int32 total_count = 3; + */ + totalCount: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListAuditLogsResponse. + * Use `create(ListAuditLogsResponseSchema)` to create a new message. + */ +export const ListAuditLogsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 7); + +/** + * GetAuditLogRequest is the request for GetAuditLog. + * + * @generated from message redpanda.api.aigateway.v1.GetAuditLogRequest + */ +export type GetAuditLogRequest = Message<"redpanda.api.aigateway.v1.GetAuditLogRequest"> & { + /** + * Required. The audit log entry to retrieve. + * Format: auditLogs/{audit_log_id} + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAuditLogRequest. + * Use `create(GetAuditLogRequestSchema)` to create a new message. + */ +export const GetAuditLogRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 8); + +/** + * GetAuditLogResponse is the response for GetAuditLog. + * + * @generated from message redpanda.api.aigateway.v1.GetAuditLogResponse + */ +export type GetAuditLogResponse = Message<"redpanda.api.aigateway.v1.GetAuditLogResponse"> & { + /** + * The audit log entry. + * + * @generated from field: redpanda.api.aigateway.v1.AuditLog audit_log = 1; + */ + auditLog?: AuditLog; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetAuditLogResponse. + * Use `create(GetAuditLogResponseSchema)` to create a new message. + */ +export const GetAuditLogResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_audit, 9); + +/** + * OCSF Activity types for Entity Management (class 3004) + * + * @generated from enum redpanda.api.aigateway.v1.AuditActivityType + */ +export enum AuditActivityType { + /** + * @generated from enum value: AUDIT_ACTIVITY_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Resource was created + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_CREATE = 1; + */ + CREATE = 1, + + /** + * Resource was read/accessed + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_READ = 2; + */ + READ = 2, + + /** + * Resource was modified + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_UPDATE = 3; + */ + UPDATE = 3, + + /** + * Resource was deleted + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_DELETE = 4; + */ + DELETE = 4, + + /** + * Resource was enabled + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_ENABLE = 8; + */ + ENABLE = 8, + + /** + * Resource was disabled + * + * @generated from enum value: AUDIT_ACTIVITY_TYPE_DISABLE = 9; + */ + DISABLE = 9, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.AuditActivityType. + */ +export const AuditActivityTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_audit, 0); + +/** + * OCSF Severity levels + * + * @generated from enum redpanda.api.aigateway.v1.AuditSeverity + */ +export enum AuditSeverity { + /** + * @generated from enum value: AUDIT_SEVERITY_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: AUDIT_SEVERITY_INFORMATIONAL = 1; + */ + INFORMATIONAL = 1, + + /** + * @generated from enum value: AUDIT_SEVERITY_LOW = 2; + */ + LOW = 2, + + /** + * @generated from enum value: AUDIT_SEVERITY_MEDIUM = 3; + */ + MEDIUM = 3, + + /** + * @generated from enum value: AUDIT_SEVERITY_HIGH = 4; + */ + HIGH = 4, + + /** + * @generated from enum value: AUDIT_SEVERITY_CRITICAL = 5; + */ + CRITICAL = 5, + + /** + * @generated from enum value: AUDIT_SEVERITY_FATAL = 6; + */ + FATAL = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.AuditSeverity. + */ +export const AuditSeveritySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_audit, 1); + +/** + * OCSF Status values + * + * @generated from enum redpanda.api.aigateway.v1.AuditStatus + */ +export enum AuditStatus { + /** + * @generated from enum value: AUDIT_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: AUDIT_STATUS_SUCCESS = 1; + */ + SUCCESS = 1, + + /** + * @generated from enum value: AUDIT_STATUS_FAILURE = 2; + */ + FAILURE = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.AuditStatus. + */ +export const AuditStatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_audit, 2); + +/** + * AuditService provides access to the OCSF-compliant audit log for tracking resource changes. + * Implements the Entity Management event class (3004) from the Open Cybersecurity Schema Framework. + * + * @generated from service redpanda.api.aigateway.v1.AuditService + */ +export const AuditService: GenService<{ + /** + * ListAuditLogs returns audit log entries for a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.AuditService.ListAuditLogs + */ + listAuditLogs: { + methodKind: "unary"; + input: typeof ListAuditLogsRequestSchema; + output: typeof ListAuditLogsResponseSchema; + }, + /** + * GetAuditLog returns a single audit log entry. + * + * @generated from rpc redpanda.api.aigateway.v1.AuditService.GetAuditLog + */ + getAuditLog: { + methodKind: "unary"; + input: typeof GetAuditLogRequestSchema; + output: typeof GetAuditLogResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_audit, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/auth-AuthService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/auth-AuthService_connectquery.ts new file mode 100644 index 0000000000..fb4b376acc --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/auth-AuthService_connectquery.ts @@ -0,0 +1,101 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/auth.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { AuthService } from "./auth_pb"; + +/** + * Registers a new user with email and password. + * Creates a personal organization for the user. + * Sends email verification link. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Register + */ +export const register = AuthService.method.register; + +/** + * Authenticates a user with email and password. + * Returns session cookie and access token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Login + */ +export const login = AuthService.method.login; + +/** + * Logs out the current user by invalidating their session. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Logout + */ +export const logout = AuthService.method.logout; + +/** + * Refreshes the access token using the session cookie. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RefreshToken + */ +export const refreshToken = AuthService.method.refreshToken; + +/** + * Requests a password reset email. + * Always returns success to prevent email enumeration. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RequestPasswordReset + */ +export const requestPasswordReset = AuthService.method.requestPasswordReset; + +/** + * Resets password using a reset token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ResetPassword + */ +export const resetPassword = AuthService.method.resetPassword; + +/** + * Changes password for authenticated user. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ChangePassword + */ +export const changePassword = AuthService.method.changePassword; + +/** + * Verifies email using verification token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.VerifyEmail + */ +export const verifyEmail = AuthService.method.verifyEmail; + +/** + * Invites a user to join an organization. + * Requires admin permissions in the organization. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.InviteUser + */ +export const inviteUser = AuthService.method.inviteUser; + +/** + * Accepts an invitation and creates user account. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.AcceptInvite + */ +export const acceptInvite = AuthService.method.acceptInvite; + +/** + * Gets the current authenticated user's info. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.GetCurrentUser + */ +export const getCurrentUser = AuthService.method.getCurrentUser; + +/** + * Lists pending invitations for an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ListInvites + */ +export const listInvites = AuthService.method.listInvites; + +/** + * Revokes a pending invitation. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RevokeInvite + */ +export const revokeInvite = AuthService.method.revokeInvite; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/auth_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/auth_pb.ts new file mode 100644 index 0000000000..7a17763b2d --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/auth_pb.ts @@ -0,0 +1,1027 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/auth.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/auth.proto. + */ +export const file_redpanda_api_aigateway_v1_auth: GenFile = /*@__PURE__*/ + fileDesc("CiRyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2F1dGgucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEikgEKD1JlZ2lzdGVyUmVxdWVzdBIZCgVlbWFpbBgBIAEoCUIK4EECukgEcgJgARIfCghwYXNzd29yZBgCIAEoCUIN4EECukgHcgUQCBiAARIjCgxkaXNwbGF5X25hbWUYAyABKAlCDeBBArpIB3IFEAEY/wESHgoRb3JnYW5pemF0aW9uX25hbWUYBCABKAlCA+BBASJNChBSZWdpc3RlclJlc3BvbnNlEg8KB3VzZXJfaWQYASABKAkSFwoPb3JnYW5pemF0aW9uX2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkiRwoMTG9naW5SZXF1ZXN0EhkKBWVtYWlsGAEgASgJQgrgQQK6SARyAmABEhwKCHBhc3N3b3JkGAIgASgJQgrgQQK6SARyAhABIp8BCg1Mb2dpblJlc3BvbnNlEhQKDGFjY2Vzc190b2tlbhgBIAEoCRISCgp0b2tlbl90eXBlGAIgASgJEhIKCmV4cGlyZXNfaW4YAyABKAMSMQoEdXNlchgEIAEoCzIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXV0aFVzZXISHQoVZm9yY2VfcGFzc3dvcmRfY2hhbmdlGAUgASgIIg8KDUxvZ291dFJlcXVlc3QiEAoOTG9nb3V0UmVzcG9uc2UiFQoTUmVmcmVzaFRva2VuUmVxdWVzdCJUChRSZWZyZXNoVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEgoKdG9rZW5fdHlwZRgCIAEoCRISCgpleHBpcmVzX2luGAMgASgDIjgKG1JlcXVlc3RQYXNzd29yZFJlc2V0UmVxdWVzdBIZCgVlbWFpbBgBIAEoCUIK4EECukgEcgJgASIvChxSZXF1ZXN0UGFzc3dvcmRSZXNldFJlc3BvbnNlEg8KB21lc3NhZ2UYASABKAkiVgoUUmVzZXRQYXNzd29yZFJlcXVlc3QSGQoFdG9rZW4YASABKAlCCuBBArpIBHICEAESIwoMbmV3X3Bhc3N3b3JkGAIgASgJQg3gQQK6SAdyBRAIGIABIigKFVJlc2V0UGFzc3dvcmRSZXNwb25zZRIPCgdtZXNzYWdlGAEgASgJImIKFUNoYW5nZVBhc3N3b3JkUmVxdWVzdBIkChBjdXJyZW50X3Bhc3N3b3JkGAEgASgJQgrgQQK6SARyAhABEiMKDG5ld19wYXNzd29yZBgCIAEoCUIN4EECukgHcgUQCBiAASIpChZDaGFuZ2VQYXNzd29yZFJlc3BvbnNlEg8KB21lc3NhZ2UYASABKAkiLwoSVmVyaWZ5RW1haWxSZXF1ZXN0EhkKBXRva2VuGAEgASgJQgrgQQK6SARyAhABIiYKE1ZlcmlmeUVtYWlsUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCSKVAQoRSW52aXRlVXNlclJlcXVlc3QSIAoMb3JnYW5pemF0aW9uGAEgASgJQgrgQQK6SARyAhABEhkKBWVtYWlsGAIgASgJQgrgQQK6SARyAmABEkMKEHRlYW1fYXNzaWdubWVudHMYAyADKAsyKS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW1Bc3NpZ25tZW50IjkKDlRlYW1Bc3NpZ25tZW50EhQKB3RlYW1faWQYASABKAlCA+BBAhIRCgRyb2xlGAIgASgJQgPgQQEiRwoSSW52aXRlVXNlclJlc3BvbnNlEjEKBmludml0ZRgBIAEoCzIhLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSW52aXRlInYKE0FjY2VwdEludml0ZVJlcXVlc3QSGQoFdG9rZW4YASABKAlCCuBBArpIBHICEAESIwoMZGlzcGxheV9uYW1lGAIgASgJQg3gQQK6SAdyBRABGP8BEh8KCHBhc3N3b3JkGAMgASgJQg3gQQK6SAdyBRAIGIABIlEKFEFjY2VwdEludml0ZVJlc3BvbnNlEg8KB3VzZXJfaWQYASABKAkSFwoPb3JnYW5pemF0aW9uX2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkihgEKEkxpc3RJbnZpdGVzUmVxdWVzdBIaCgZwYXJlbnQYASABKAlCCuBBArpIBHICEAESHwoJcGFnZV9zaXplGAIgASgFQgzgQQG6SAYaBBhkKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhoKDXN0YXR1c19maWx0ZXIYBCABKAlCA+BBASJ2ChNMaXN0SW52aXRlc1Jlc3BvbnNlEjIKB2ludml0ZXMYASADKAsyIS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkludml0ZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSIvChNSZXZva2VJbnZpdGVSZXF1ZXN0EhgKBG5hbWUYASABKAlCCuBBArpIBHICEAEiFgoUUmV2b2tlSW52aXRlUmVzcG9uc2UiFwoVR2V0Q3VycmVudFVzZXJSZXF1ZXN0IksKFkdldEN1cnJlbnRVc2VyUmVzcG9uc2USMQoEdXNlchgBIAEoCzIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXV0aFVzZXIiwQEKCEF1dGhVc2VyEgoKAmlkGAEgASgJEg0KBWVtYWlsGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg9vcmdhbml6YXRpb25faWQYBCABKAkSEgoKYWNjb3VudF9pZBgFIAEoCRINCgVyb2xlcxgGIAMoCRIWCg5lbWFpbF92ZXJpZmllZBgHIAEoCBISCgphdmF0YXJfdXJsGAggASgJEhwKFHNvY2lhbF9hdXRoX3Byb3ZpZGVyGAkgASgJIrsCCgZJbnZpdGUSDAoEbmFtZRgBIAEoCRINCgVlbWFpbBgCIAEoCRIZChFvcmdhbml6YXRpb25fbmFtZRgDIAEoCRISCgppbnZpdGVkX2J5GAQgASgJEg4KBnN0YXR1cxgFIAEoCRJDChB0ZWFtX2Fzc2lnbm1lbnRzGAYgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtQXNzaWdubWVudBIuCgpleHBpcmVzX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtjcmVhdGVfdGltZRgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLYWNjZXB0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wMqcPCgtBdXRoU2VydmljZRKBAQoIUmVnaXN0ZXISKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlZ2lzdGVyUmVxdWVzdBorLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVnaXN0ZXJSZXNwb25zZSIcgtPkkwIWOgEqIhEvdjEvYXV0aC9yZWdpc3RlchJ1CgVMb2dpbhInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTG9naW5SZXF1ZXN0GigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Mb2dpblJlc3BvbnNlIhmC0+STAhM6ASoiDi92MS9hdXRoL2xvZ2luEnkKBkxvZ291dBIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTG9nb3V0UmVxdWVzdBopLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTG9nb3V0UmVzcG9uc2UiGoLT5JMCFDoBKiIPL3YxL2F1dGgvbG9nb3V0EowBCgxSZWZyZXNoVG9rZW4SLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlZnJlc2hUb2tlblJlcXVlc3QaLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlZnJlc2hUb2tlblJlc3BvbnNlIhuC0+STAhU6ASoiEC92MS9hdXRoL3JlZnJlc2gSswEKFFJlcXVlc3RQYXNzd29yZFJlc2V0EjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXF1ZXN0UGFzc3dvcmRSZXNldFJlcXVlc3QaNy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlcXVlc3RQYXNzd29yZFJlc2V0UmVzcG9uc2UiKoLT5JMCJDoBKiIfL3YxL2F1dGgvcGFzc3dvcmQvcmVzZXQtcmVxdWVzdBKWAQoNUmVzZXRQYXNzd29yZBIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVzZXRQYXNzd29yZFJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlc2V0UGFzc3dvcmRSZXNwb25zZSIigtPkkwIcOgEqIhcvdjEvYXV0aC9wYXNzd29yZC9yZXNldBKaAQoOQ2hhbmdlUGFzc3dvcmQSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNoYW5nZVBhc3N3b3JkUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ2hhbmdlUGFzc3dvcmRSZXNwb25zZSIjgtPkkwIdOgEqIhgvdjEvYXV0aC9wYXNzd29yZC9jaGFuZ2USjgEKC1ZlcmlmeUVtYWlsEi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5WZXJpZnlFbWFpbFJlcXVlc3QaLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlZlcmlmeUVtYWlsUmVzcG9uc2UiIILT5JMCGjoBKiIVL3YxL2F1dGgvdmVyaWZ5LWVtYWlsEoUBCgpJbnZpdGVVc2VyEiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5JbnZpdGVVc2VyUmVxdWVzdBotLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSW52aXRlVXNlclJlc3BvbnNlIhqC0+STAhQ6ASoiDy92MS9hdXRoL2ludml0ZRKSAQoMQWNjZXB0SW52aXRlEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2NlcHRJbnZpdGVSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY2NlcHRJbnZpdGVSZXNwb25zZSIhgtPkkwIbOgEqIhYvdjEvYXV0aC9pbnZpdGUvYWNjZXB0EooBCg5HZXRDdXJyZW50VXNlchIwLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0Q3VycmVudFVzZXJSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRDdXJyZW50VXNlclJlc3BvbnNlIhOC0+STAg0SCy92MS9hdXRoL21lEqUBCgtMaXN0SW52aXRlcxItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdEludml0ZXNSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0SW52aXRlc1Jlc3BvbnNlIjeC0+STAjESLy92MS97cGFyZW50PWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qfS9pbnZpdGVzEqgBCgxSZXZva2VJbnZpdGUSLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJldm9rZUludml0ZVJlcXVlc3QaLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJldm9rZUludml0ZVJlc3BvbnNlIjeC0+STAjEqLy92MS97bmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKi9pbnZpdGVzLyp9GhnKQRZhaWdhdGV3YXkucmVkcGFuZGEuY29tQv4BCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUIJQXV0aFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_protobuf_timestamp]); + +/** + * Request message for Register RPC. + * + * @generated from message redpanda.api.aigateway.v1.RegisterRequest + */ +export type RegisterRequest = Message<"redpanda.api.aigateway.v1.RegisterRequest"> & { + /** + * Required: Email address (must be unique). + * + * @generated from field: string email = 1; + */ + email: string; + + /** + * Required: Password (min 8 characters). + * + * @generated from field: string password = 2; + */ + password: string; + + /** + * Required: Display name. + * + * @generated from field: string display_name = 3; + */ + displayName: string; + + /** + * Optional: Organization name for the personal org. + * If empty, uses "{display_name}'s Organization". + * + * @generated from field: string organization_name = 4; + */ + organizationName: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RegisterRequest. + * Use `create(RegisterRequestSchema)` to create a new message. + */ +export const RegisterRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 0); + +/** + * Response message for Register RPC. + * + * @generated from message redpanda.api.aigateway.v1.RegisterResponse + */ +export type RegisterResponse = Message<"redpanda.api.aigateway.v1.RegisterResponse"> & { + /** + * The created user's ID. + * + * @generated from field: string user_id = 1; + */ + userId: string; + + /** + * The created organization's ID. + * + * @generated from field: string organization_id = 2; + */ + organizationId: string; + + /** + * Message about email verification. + * + * @generated from field: string message = 3; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RegisterResponse. + * Use `create(RegisterResponseSchema)` to create a new message. + */ +export const RegisterResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 1); + +/** + * Request message for Login RPC. + * + * @generated from message redpanda.api.aigateway.v1.LoginRequest + */ +export type LoginRequest = Message<"redpanda.api.aigateway.v1.LoginRequest"> & { + /** + * Required: Email address. + * + * @generated from field: string email = 1; + */ + email: string; + + /** + * Required: Password. + * + * @generated from field: string password = 2; + */ + password: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LoginRequest. + * Use `create(LoginRequestSchema)` to create a new message. + */ +export const LoginRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 2); + +/** + * Response message for Login RPC. + * + * @generated from message redpanda.api.aigateway.v1.LoginResponse + */ +export type LoginResponse = Message<"redpanda.api.aigateway.v1.LoginResponse"> & { + /** + * JWT access token (also set as cookie). + * + * @generated from field: string access_token = 1; + */ + accessToken: string; + + /** + * Token type (always "Bearer"). + * + * @generated from field: string token_type = 2; + */ + tokenType: string; + + /** + * Seconds until access token expires. + * + * @generated from field: int64 expires_in = 3; + */ + expiresIn: bigint; + + /** + * User information. + * + * @generated from field: redpanda.api.aigateway.v1.AuthUser user = 4; + */ + user?: AuthUser; + + /** + * If true, user must change password before continuing. + * + * @generated from field: bool force_password_change = 5; + */ + forcePasswordChange: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LoginResponse. + * Use `create(LoginResponseSchema)` to create a new message. + */ +export const LoginResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 3); + +/** + * Request message for Logout RPC. + * + * @generated from message redpanda.api.aigateway.v1.LogoutRequest + */ +export type LogoutRequest = Message<"redpanda.api.aigateway.v1.LogoutRequest"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LogoutRequest. + * Use `create(LogoutRequestSchema)` to create a new message. + */ +export const LogoutRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 4); + +/** + * Response message for Logout RPC. + * + * @generated from message redpanda.api.aigateway.v1.LogoutResponse + */ +export type LogoutResponse = Message<"redpanda.api.aigateway.v1.LogoutResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LogoutResponse. + * Use `create(LogoutResponseSchema)` to create a new message. + */ +export const LogoutResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 5); + +/** + * Request message for RefreshToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RefreshTokenRequest + */ +export type RefreshTokenRequest = Message<"redpanda.api.aigateway.v1.RefreshTokenRequest"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RefreshTokenRequest. + * Use `create(RefreshTokenRequestSchema)` to create a new message. + */ +export const RefreshTokenRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 6); + +/** + * Response message for RefreshToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RefreshTokenResponse + */ +export type RefreshTokenResponse = Message<"redpanda.api.aigateway.v1.RefreshTokenResponse"> & { + /** + * New JWT access token. + * + * @generated from field: string access_token = 1; + */ + accessToken: string; + + /** + * Token type (always "Bearer"). + * + * @generated from field: string token_type = 2; + */ + tokenType: string; + + /** + * Seconds until access token expires. + * + * @generated from field: int64 expires_in = 3; + */ + expiresIn: bigint; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RefreshTokenResponse. + * Use `create(RefreshTokenResponseSchema)` to create a new message. + */ +export const RefreshTokenResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 7); + +/** + * Request message for RequestPasswordReset RPC. + * + * @generated from message redpanda.api.aigateway.v1.RequestPasswordResetRequest + */ +export type RequestPasswordResetRequest = Message<"redpanda.api.aigateway.v1.RequestPasswordResetRequest"> & { + /** + * Required: Email address to send reset link to. + * + * @generated from field: string email = 1; + */ + email: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RequestPasswordResetRequest. + * Use `create(RequestPasswordResetRequestSchema)` to create a new message. + */ +export const RequestPasswordResetRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 8); + +/** + * Response message for RequestPasswordReset RPC. + * Always returns success to prevent email enumeration. + * + * @generated from message redpanda.api.aigateway.v1.RequestPasswordResetResponse + */ +export type RequestPasswordResetResponse = Message<"redpanda.api.aigateway.v1.RequestPasswordResetResponse"> & { + /** + * @generated from field: string message = 1; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RequestPasswordResetResponse. + * Use `create(RequestPasswordResetResponseSchema)` to create a new message. + */ +export const RequestPasswordResetResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 9); + +/** + * Request message for ResetPassword RPC. + * + * @generated from message redpanda.api.aigateway.v1.ResetPasswordRequest + */ +export type ResetPasswordRequest = Message<"redpanda.api.aigateway.v1.ResetPasswordRequest"> & { + /** + * Required: Password reset token from email link. + * + * @generated from field: string token = 1; + */ + token: string; + + /** + * Required: New password (min 8 characters). + * + * @generated from field: string new_password = 2; + */ + newPassword: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ResetPasswordRequest. + * Use `create(ResetPasswordRequestSchema)` to create a new message. + */ +export const ResetPasswordRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 10); + +/** + * Response message for ResetPassword RPC. + * + * @generated from message redpanda.api.aigateway.v1.ResetPasswordResponse + */ +export type ResetPasswordResponse = Message<"redpanda.api.aigateway.v1.ResetPasswordResponse"> & { + /** + * @generated from field: string message = 1; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ResetPasswordResponse. + * Use `create(ResetPasswordResponseSchema)` to create a new message. + */ +export const ResetPasswordResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 11); + +/** + * Request message for ChangePassword RPC. + * + * @generated from message redpanda.api.aigateway.v1.ChangePasswordRequest + */ +export type ChangePasswordRequest = Message<"redpanda.api.aigateway.v1.ChangePasswordRequest"> & { + /** + * Required: Current password for verification. + * + * @generated from field: string current_password = 1; + */ + currentPassword: string; + + /** + * Required: New password (min 8 characters). + * + * @generated from field: string new_password = 2; + */ + newPassword: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ChangePasswordRequest. + * Use `create(ChangePasswordRequestSchema)` to create a new message. + */ +export const ChangePasswordRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 12); + +/** + * Response message for ChangePassword RPC. + * + * @generated from message redpanda.api.aigateway.v1.ChangePasswordResponse + */ +export type ChangePasswordResponse = Message<"redpanda.api.aigateway.v1.ChangePasswordResponse"> & { + /** + * @generated from field: string message = 1; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ChangePasswordResponse. + * Use `create(ChangePasswordResponseSchema)` to create a new message. + */ +export const ChangePasswordResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 13); + +/** + * Request message for VerifyEmail RPC. + * + * @generated from message redpanda.api.aigateway.v1.VerifyEmailRequest + */ +export type VerifyEmailRequest = Message<"redpanda.api.aigateway.v1.VerifyEmailRequest"> & { + /** + * Required: Email verification token from email link. + * + * @generated from field: string token = 1; + */ + token: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.VerifyEmailRequest. + * Use `create(VerifyEmailRequestSchema)` to create a new message. + */ +export const VerifyEmailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 14); + +/** + * Response message for VerifyEmail RPC. + * + * @generated from message redpanda.api.aigateway.v1.VerifyEmailResponse + */ +export type VerifyEmailResponse = Message<"redpanda.api.aigateway.v1.VerifyEmailResponse"> & { + /** + * @generated from field: string message = 1; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.VerifyEmailResponse. + * Use `create(VerifyEmailResponseSchema)` to create a new message. + */ +export const VerifyEmailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 15); + +/** + * Request message for InviteUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.InviteUserRequest + */ +export type InviteUserRequest = Message<"redpanda.api.aigateway.v1.InviteUserRequest"> & { + /** + * Required: Organization to invite user to. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string organization = 1; + */ + organization: string; + + /** + * Required: Email address to invite. + * + * @generated from field: string email = 2; + */ + email: string; + + /** + * Optional: Team assignments for the invited user. + * + * @generated from field: repeated redpanda.api.aigateway.v1.TeamAssignment team_assignments = 3; + */ + teamAssignments: TeamAssignment[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.InviteUserRequest. + * Use `create(InviteUserRequestSchema)` to create a new message. + */ +export const InviteUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 16); + +/** + * Team assignment for invited user. + * + * @generated from message redpanda.api.aigateway.v1.TeamAssignment + */ +export type TeamAssignment = Message<"redpanda.api.aigateway.v1.TeamAssignment"> & { + /** + * Team ID to add user to. + * + * @generated from field: string team_id = 1; + */ + teamId: string; + + /** + * Role in the team (e.g., "member", "admin"). + * + * @generated from field: string role = 2; + */ + role: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TeamAssignment. + * Use `create(TeamAssignmentSchema)` to create a new message. + */ +export const TeamAssignmentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 17); + +/** + * Response message for InviteUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.InviteUserResponse + */ +export type InviteUserResponse = Message<"redpanda.api.aigateway.v1.InviteUserResponse"> & { + /** + * The created invite. + * + * @generated from field: redpanda.api.aigateway.v1.Invite invite = 1; + */ + invite?: Invite; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.InviteUserResponse. + * Use `create(InviteUserResponseSchema)` to create a new message. + */ +export const InviteUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 18); + +/** + * Request message for AcceptInvite RPC. + * + * @generated from message redpanda.api.aigateway.v1.AcceptInviteRequest + */ +export type AcceptInviteRequest = Message<"redpanda.api.aigateway.v1.AcceptInviteRequest"> & { + /** + * Required: Invite token from email link. + * + * @generated from field: string token = 1; + */ + token: string; + + /** + * Required: Display name for the new user. + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Required: Password for the new account. + * + * @generated from field: string password = 3; + */ + password: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AcceptInviteRequest. + * Use `create(AcceptInviteRequestSchema)` to create a new message. + */ +export const AcceptInviteRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 19); + +/** + * Response message for AcceptInvite RPC. + * + * @generated from message redpanda.api.aigateway.v1.AcceptInviteResponse + */ +export type AcceptInviteResponse = Message<"redpanda.api.aigateway.v1.AcceptInviteResponse"> & { + /** + * The created user's ID. + * + * @generated from field: string user_id = 1; + */ + userId: string; + + /** + * The organization the user joined. + * + * @generated from field: string organization_id = 2; + */ + organizationId: string; + + /** + * @generated from field: string message = 3; + */ + message: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AcceptInviteResponse. + * Use `create(AcceptInviteResponseSchema)` to create a new message. + */ +export const AcceptInviteResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 20); + +/** + * Request message for ListInvites RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListInvitesRequest + */ +export type ListInvitesRequest = Message<"redpanda.api.aigateway.v1.ListInvitesRequest"> & { + /** + * Required: Parent organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number to return (max 100). + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from previous call. + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter by status: pending, accepted, expired, revoked. + * + * @generated from field: string status_filter = 4; + */ + statusFilter: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListInvitesRequest. + * Use `create(ListInvitesRequestSchema)` to create a new message. + */ +export const ListInvitesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 21); + +/** + * Response message for ListInvites RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListInvitesResponse + */ +export type ListInvitesResponse = Message<"redpanda.api.aigateway.v1.ListInvitesResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.Invite invites = 1; + */ + invites: Invite[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListInvitesResponse. + * Use `create(ListInvitesResponseSchema)` to create a new message. + */ +export const ListInvitesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 22); + +/** + * Request message for RevokeInvite RPC. + * + * @generated from message redpanda.api.aigateway.v1.RevokeInviteRequest + */ +export type RevokeInviteRequest = Message<"redpanda.api.aigateway.v1.RevokeInviteRequest"> & { + /** + * Resource name of the invite. + * Format: `accounts/{account}/organizations/{organization}/invites/{invite}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RevokeInviteRequest. + * Use `create(RevokeInviteRequestSchema)` to create a new message. + */ +export const RevokeInviteRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 23); + +/** + * Response message for RevokeInvite RPC. + * + * @generated from message redpanda.api.aigateway.v1.RevokeInviteResponse + */ +export type RevokeInviteResponse = Message<"redpanda.api.aigateway.v1.RevokeInviteResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RevokeInviteResponse. + * Use `create(RevokeInviteResponseSchema)` to create a new message. + */ +export const RevokeInviteResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 24); + +/** + * Request message for GetCurrentUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetCurrentUserRequest + */ +export type GetCurrentUserRequest = Message<"redpanda.api.aigateway.v1.GetCurrentUserRequest"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetCurrentUserRequest. + * Use `create(GetCurrentUserRequestSchema)` to create a new message. + */ +export const GetCurrentUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 25); + +/** + * Response message for GetCurrentUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetCurrentUserResponse + */ +export type GetCurrentUserResponse = Message<"redpanda.api.aigateway.v1.GetCurrentUserResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.AuthUser user = 1; + */ + user?: AuthUser; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetCurrentUserResponse. + * Use `create(GetCurrentUserResponseSchema)` to create a new message. + */ +export const GetCurrentUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 26); + +/** + * AuthUser represents authenticated user information. + * + * @generated from message redpanda.api.aigateway.v1.AuthUser + */ +export type AuthUser = Message<"redpanda.api.aigateway.v1.AuthUser"> & { + /** + * User ID. + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * User's email address. + * + * @generated from field: string email = 2; + */ + email: string; + + /** + * User's display name. + * + * @generated from field: string display_name = 3; + */ + displayName: string; + + /** + * Organization ID the user belongs to. + * + * @generated from field: string organization_id = 4; + */ + organizationId: string; + + /** + * Account ID the organization belongs to. + * + * @generated from field: string account_id = 5; + */ + accountId: string; + + /** + * User's roles (e.g., ["admin", "member"]). + * + * @generated from field: repeated string roles = 6; + */ + roles: string[]; + + /** + * Whether email is verified. + * + * @generated from field: bool email_verified = 7; + */ + emailVerified: boolean; + + /** + * Profile picture URL (if available). + * + * @generated from field: string avatar_url = 8; + */ + avatarUrl: string; + + /** + * OAuth provider if logged in via social auth. + * + * @generated from field: string social_auth_provider = 9; + */ + socialAuthProvider: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuthUser. + * Use `create(AuthUserSchema)` to create a new message. + */ +export const AuthUserSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 27); + +/** + * Invite represents a user invitation. + * + * @generated from message redpanda.api.aigateway.v1.Invite + */ +export type Invite = Message<"redpanda.api.aigateway.v1.Invite"> & { + /** + * Resource name. + * Format: `accounts/{account}/organizations/{organization}/invites/{invite}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Email address invited. + * + * @generated from field: string email = 2; + */ + email: string; + + /** + * Organization display name. + * + * @generated from field: string organization_name = 3; + */ + organizationName: string; + + /** + * User ID who sent the invite. + * + * @generated from field: string invited_by = 4; + */ + invitedBy: string; + + /** + * Invite status: pending, accepted, expired, revoked. + * + * @generated from field: string status = 5; + */ + status: string; + + /** + * Team assignments. + * + * @generated from field: repeated redpanda.api.aigateway.v1.TeamAssignment team_assignments = 6; + */ + teamAssignments: TeamAssignment[]; + + /** + * When the invite expires. + * + * @generated from field: google.protobuf.Timestamp expires_at = 7; + */ + expiresAt?: Timestamp; + + /** + * When the invite was created. + * + * @generated from field: google.protobuf.Timestamp create_time = 8; + */ + createTime?: Timestamp; + + /** + * When the invite was accepted (if applicable). + * + * @generated from field: google.protobuf.Timestamp accepted_at = 9; + */ + acceptedAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Invite. + * Use `create(InviteSchema)` to create a new message. + */ +export const InviteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_auth, 28); + +/** + * AuthService provides authentication and session management. + * Handles email/password login, registration, password reset, and invitations. + * Social OAuth (Google, GitHub) uses HTTP redirects and is handled separately. + * + * @generated from service redpanda.api.aigateway.v1.AuthService + */ +export const AuthService: GenService<{ + /** + * Registers a new user with email and password. + * Creates a personal organization for the user. + * Sends email verification link. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Register + */ + register: { + methodKind: "unary"; + input: typeof RegisterRequestSchema; + output: typeof RegisterResponseSchema; + }, + /** + * Authenticates a user with email and password. + * Returns session cookie and access token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Login + */ + login: { + methodKind: "unary"; + input: typeof LoginRequestSchema; + output: typeof LoginResponseSchema; + }, + /** + * Logs out the current user by invalidating their session. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.Logout + */ + logout: { + methodKind: "unary"; + input: typeof LogoutRequestSchema; + output: typeof LogoutResponseSchema; + }, + /** + * Refreshes the access token using the session cookie. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RefreshToken + */ + refreshToken: { + methodKind: "unary"; + input: typeof RefreshTokenRequestSchema; + output: typeof RefreshTokenResponseSchema; + }, + /** + * Requests a password reset email. + * Always returns success to prevent email enumeration. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RequestPasswordReset + */ + requestPasswordReset: { + methodKind: "unary"; + input: typeof RequestPasswordResetRequestSchema; + output: typeof RequestPasswordResetResponseSchema; + }, + /** + * Resets password using a reset token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ResetPassword + */ + resetPassword: { + methodKind: "unary"; + input: typeof ResetPasswordRequestSchema; + output: typeof ResetPasswordResponseSchema; + }, + /** + * Changes password for authenticated user. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ChangePassword + */ + changePassword: { + methodKind: "unary"; + input: typeof ChangePasswordRequestSchema; + output: typeof ChangePasswordResponseSchema; + }, + /** + * Verifies email using verification token. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.VerifyEmail + */ + verifyEmail: { + methodKind: "unary"; + input: typeof VerifyEmailRequestSchema; + output: typeof VerifyEmailResponseSchema; + }, + /** + * Invites a user to join an organization. + * Requires admin permissions in the organization. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.InviteUser + */ + inviteUser: { + methodKind: "unary"; + input: typeof InviteUserRequestSchema; + output: typeof InviteUserResponseSchema; + }, + /** + * Accepts an invitation and creates user account. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.AcceptInvite + */ + acceptInvite: { + methodKind: "unary"; + input: typeof AcceptInviteRequestSchema; + output: typeof AcceptInviteResponseSchema; + }, + /** + * Gets the current authenticated user's info. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.GetCurrentUser + */ + getCurrentUser: { + methodKind: "unary"; + input: typeof GetCurrentUserRequestSchema; + output: typeof GetCurrentUserResponseSchema; + }, + /** + * Lists pending invitations for an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.ListInvites + */ + listInvites: { + methodKind: "unary"; + input: typeof ListInvitesRequestSchema; + output: typeof ListInvitesResponseSchema; + }, + /** + * Revokes a pending invitation. + * + * @generated from rpc redpanda.api.aigateway.v1.AuthService.RevokeInvite + */ + revokeInvite: { + methodKind: "unary"; + input: typeof RevokeInviteRequestSchema; + output: typeof RevokeInviteResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_auth, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool-BackendPoolService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool-BackendPoolService_connectquery.ts new file mode 100644 index 0000000000..928cc09fb1 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool-BackendPoolService_connectquery.ts @@ -0,0 +1,40 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/backend_pool.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { BackendPoolService } from "./backend_pool_pb"; + +/** + * Creates a new backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool + */ +export const createBackendPool = BackendPoolService.method.createBackendPool; + +/** + * Gets a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool + */ +export const getBackendPool = BackendPoolService.method.getBackendPool; + +/** + * Lists backend pools. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools + */ +export const listBackendPools = BackendPoolService.method.listBackendPools; + +/** + * Updates a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool + */ +export const updateBackendPool = BackendPoolService.method.updateBackendPool; + +/** + * Deletes a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool + */ +export const deleteBackendPool = BackendPoolService.method.deleteBackendPool; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool_pb.ts new file mode 100644 index 0000000000..04993e48a7 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/backend_pool_pb.ts @@ -0,0 +1,1134 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/backend_pool.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/backend_pool.proto. + */ +export const file_redpanda_api_aigateway_v1_backend_pool: GenFile = /*@__PURE__*/ + fileDesc("CixyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2JhY2tlbmRfcG9vbC5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJZChlDcmVhdGVCYWNrZW5kUG9vbFJlc3BvbnNlEjwKDGJhY2tlbmRfcG9vbBgBIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQmFja2VuZFBvb2wiVgoWR2V0QmFja2VuZFBvb2xSZXNwb25zZRI8CgxiYWNrZW5kX3Bvb2wYASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkJhY2tlbmRQb29sIlkKGVVwZGF0ZUJhY2tlbmRQb29sUmVzcG9uc2USPAoMYmFja2VuZF9wb29sGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5CYWNrZW5kUG9vbCIbChlEZWxldGVCYWNrZW5kUG9vbFJlc3BvbnNlItsICgtCYWNrZW5kUG9vbBIRCgRuYW1lGAEgASgJQgPgQQgSGQoMZGlzcGxheV9uYW1lGAIgASgJQgPgQQISEwoLZGVzY3JpcHRpb24YAyABKAkSOwoIYmFsYW5jZXIYBCABKAsyKS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkJhbGFuY2VyQ29uZmlnEjIKB3NlcnZlcnMYBSADKAsyIS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNlcnZlchIaChJyZXF1ZXN0X3RyYW5zZm9ybXMYBiADKAkSGwoTcmVzcG9uc2VfdHJhbnNmb3JtcxgHIAMoCRI5CgdyZXdyaXRlGAggASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXdyaXRlQ29uZmlnEkIKDGhlYWx0aF9jaGVjaxgJIAEoCzIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSGVhbHRoQ2hlY2tDb25maWcSQAoLaHR0cF9jbGllbnQYCiABKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkhUVFBDbGllbnRDb25maWcSDwoHZW5hYmxlZBgLIAEoCBJGCghtZXRhZGF0YRgMIAMoCzI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQmFja2VuZFBvb2wuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxJGCgxiYWNrZW5kX3R5cGUYDyABKA4yJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkJhY2tlbmRUeXBlQgi6SAWCAQIQARIVCg1kZWZlcl9sb2FkaW5nGBAgASgIEhQKDGxvYWRfdXBmcm9udBgRIAMoCRIrChp0b29sX2luZGV4X3JlZnJlc2hfc2Vjb25kcxgSIAEoBUIHukgEGgIoABIkCg9zZXNzaW9uX3RpbWVvdXQYEyABKAVCC7pICBoGGICjBSgAEkwKD3Nlc3Npb25fbWFuYWdlchgUIAEoCzIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU2Vzc2lvbk1hbmFnZXJDb25maWdCAhgBEhoKEmZvcndhcmRfb2lkY190b2tlbhgVIAEoCBovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAE6dupBcwoiYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9CYWNrZW5kUG9vbBIvZ2F0ZXdheXMve2dhdGV3YXl9L2JhY2tlbmQtcG9vbHMve2JhY2tlbmRfcG9vbH0SHGJhY2tlbmQtcG9vbHMve2JhY2tlbmRfcG9vbH0ixwQKBlNlcnZlchIPCgJpZBgBIAEoCUID4EECEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIWCgl0cmFuc3BvcnQYAyABKAlCA+BBAhIPCgdhZGRyZXNzGAQgASgJEg8KB2NvbW1hbmQYBSABKAkSDAoEYXJncxgGIAMoCRI3CgNlbnYYByADKAsyKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNlcnZlci5FbnZFbnRyeRI5CgdyZXdyaXRlGAggASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXdyaXRlQ29uZmlnEhcKD3RpbWVvdXRfc2Vjb25kcxgJIAEoBRITCgttYXhfcmV0cmllcxgKIAEoBRIOCgZ3ZWlnaHQYCyABKAUSPAoKdGxzX3ZlcmlmeRgMIAEoDjIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVExTVmVyaWZ5TW9kZRIzCgRhdXRoGA0gASgLMiUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdXRoQ29uZmlnEg8KB2VuYWJsZWQYDiABKAgSGgoSZm9yd2FyZF9vaWRjX3Rva2VuGA8gASgIEiMKFmRlZmVyX2xvYWRpbmdfb3ZlcnJpZGUYECABKAhIAIgBARIQCghwcm92aWRlchgRIAEoCRoqCghFbnZFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQhkKF19kZWZlcl9sb2FkaW5nX292ZXJyaWRlIngKDkJhbGFuY2VyQ29uZmlnEkIKCHN0cmF0ZWd5GAEgASgOMjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Mb2FkQmFsYW5jaW5nU3RyYXRlZ3kSIgoVc3RyYXRlZ3lfZGlzcGxheV9uYW1lGAIgASgJQgPgQQMixQEKCkF1dGhDb25maWcSMQoEdHlwZRgBIAEoDjIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXV0aFR5cGUSDwoHYXBpX2tleRgCIAEoCRJDCgdoZWFkZXJzGAMgAygLMjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BdXRoQ29uZmlnLkhlYWRlcnNFbnRyeRouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKAAQoNUmV3cml0ZUNvbmZpZxI0CgRwYXRoGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5QYXRoUmV3cml0ZRI5CgdoZWFkZXJzGAIgASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5IZWFkZXJSZXdyaXRlIi8KC1BhdGhSZXdyaXRlEg8KB3BhdHRlcm4YASABKAkSDwoHcmVwbGFjZRgCIAEoCSL3AQoNSGVhZGVyUmV3cml0ZRI+CgNzZXQYASADKAsyMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkhlYWRlclJld3JpdGUuU2V0RW50cnkSPgoDYWRkGAIgAygLMjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5IZWFkZXJSZXdyaXRlLkFkZEVudHJ5Eg4KBnJlbW92ZRgDIAMoCRoqCghTZXRFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGioKCEFkZEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEipAEKEUhlYWx0aENoZWNrQ29uZmlnEhsKE3VuaGVhbHRoeV90aHJlc2hvbGQYASABKAUSGQoRaGVhbHRoeV90aHJlc2hvbGQYAiABKAUSGQoRcmVjb3ZlcnlfaW50ZXJ2YWwYAyABKAkSPAoGYWN0aXZlGAQgASgLMiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BY3RpdmVIZWFsdGhDaGVjayKPAQoRQWN0aXZlSGVhbHRoQ2hlY2sSDwoHZW5hYmxlZBgBIAEoCBIMCgR0eXBlGAIgASgJEhAKCGludGVydmFsGAMgASgJEg8KB3RpbWVvdXQYBCABKAkSOAoEaHR0cBgFIAEoCzIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSFRUUEhlYWx0aENoZWNrIkgKD0hUVFBIZWFsdGhDaGVjaxIOCgZtZXRob2QYASABKAkSDAoEcGF0aBgCIAEoCRIXCg9leHBlY3RlZF9zdGF0dXMYAyABKAUizwIKEEhUVFBDbGllbnRDb25maWcSFgoObWF4X2lkbGVfY29ubnMYASABKAUSIQoZbWF4X2lkbGVfY29ubnNfcGVyX3NlcnZlchgCIAEoBRIcChRtYXhfY29ubnNfcGVyX3NlcnZlchgDIAEoBRIZChFpZGxlX2Nvbm5fdGltZW91dBgEIAEoBRIXCg9jb25uZWN0X3RpbWVvdXQYBSABKAUSHQoVdGxzX2hhbmRzaGFrZV90aW1lb3V0GAYgASgFEh8KF3Jlc3BvbnNlX2hlYWRlcl90aW1lb3V0GAcgASgFEh8KF2V4cGVjdF9jb250aW51ZV90aW1lb3V0GAggASgFEhsKE2Rpc2FibGVfY29tcHJlc3Npb24YCSABKAgSGwoTZGlzYWJsZV9rZWVwX2FsaXZlcxgKIAEoCBITCgtmb3JjZV9odHRwMhgLIAEoCCJ3ChRTZXNzaW9uTWFuYWdlckNvbmZpZxITCgdlbmFibGVkGAEgASgIQgIYARIpChhlbmZvcmNlX2lkZW50aXR5X2JpbmRpbmcYAyABKAhCAhgBSACIAQE6AhgBQhsKGV9lbmZvcmNlX2lkZW50aXR5X2JpbmRpbmcihAEKGENyZWF0ZUJhY2tlbmRQb29sUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSQQoMYmFja2VuZF9wb29sGAMgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5CYWNrZW5kUG9vbEID4EECSgQIAhADUg9iYWNrZW5kX3Bvb2xfaWQiUQoVR2V0QmFja2VuZFBvb2xSZXF1ZXN0EjgKBG5hbWUYASABKAlCKuBBAvpBJAoiYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9CYWNrZW5kUG9vbCJyChdMaXN0QmFja2VuZFBvb2xzUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSEQoJcGFnZV9zaXplGAIgASgFEhIKCnBhZ2VfdG9rZW4YAyABKAkSDgoGZmlsdGVyGAQgASgJEhAKCG9yZGVyX2J5GAUgASgJIoYBChhMaXN0QmFja2VuZFBvb2xzUmVzcG9uc2USPQoNYmFja2VuZF9wb29scxgBIAMoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQmFja2VuZFBvb2wSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUijgEKGFVwZGF0ZUJhY2tlbmRQb29sUmVxdWVzdBJBCgxiYWNrZW5kX3Bvb2wYASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkJhY2tlbmRQb29sQgPgQQISLwoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIlQKGERlbGV0ZUJhY2tlbmRQb29sUmVxdWVzdBI4CgRuYW1lGAEgASgJQirgQQL6QSQKImFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQmFja2VuZFBvb2wqlAIKFUxvYWRCYWxhbmNpbmdTdHJhdGVneRInCiNMT0FEX0JBTEFOQ0lOR19TVFJBVEVHWV9VTlNQRUNJRklFRBAAEicKI0xPQURfQkFMQU5DSU5HX1NUUkFURUdZX1JPVU5EX1JPQklOEAESMAosTE9BRF9CQUxBTkNJTkdfU1RSQVRFR1lfV0VJR0hURURfUk9VTkRfUk9CSU4QAhItCilMT0FEX0JBTEFOQ0lOR19TVFJBVEVHWV9MRUFTVF9DT05ORUNUSU9OUxADEiIKHkxPQURfQkFMQU5DSU5HX1NUUkFURUdZX1JBTkRPTRAEEiQKIExPQURfQkFMQU5DSU5HX1NUUkFURUdZX0ZBSUxPVkVSEAUqZAoNVExTVmVyaWZ5TW9kZRIfChtUTFNfVkVSSUZZX01PREVfVU5TUEVDSUZJRUQQABIYChRUTFNfVkVSSUZZX01PREVfRlVMTBABEhgKFFRMU19WRVJJRllfTU9ERV9TS0lQEAIqaAoIQXV0aFR5cGUSGQoVQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASFAoQQVVUSF9UWVBFX0JFQVJFUhABEhUKEUFVVEhfVFlQRV9BUElfS0VZEAISFAoQQVVUSF9UWVBFX0NVU1RPTRADKlgKC0JhY2tlbmRUeXBlEhwKGEJBQ0tFTkRfVFlQRV9VTlNQRUNJRklFRBAAEhUKEUJBQ0tFTkRfVFlQRV9IVFRQEAESFAoQQkFDS0VORF9UWVBFX01DUBACMuoIChJCYWNrZW5kUG9vbFNlcnZpY2US3gEKEUNyZWF0ZUJhY2tlbmRQb29sEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVCYWNrZW5kUG9vbFJlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZUJhY2tlbmRQb29sUmVzcG9uc2UiXoLT5JMCWDoMYmFja2VuZF9wb29sWiE6DGJhY2tlbmRfcG9vbCIRL3YxL2JhY2tlbmQtcG9vbHMiJS92MS97cGFyZW50PWdhdGV3YXlzLyp9L2JhY2tlbmQtcG9vbHMSwgEKDkdldEJhY2tlbmRQb29sEjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRCYWNrZW5kUG9vbFJlcXVlc3QaMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEJhY2tlbmRQb29sUmVzcG9uc2UiS4LT5JMCRVocEhovdjEve25hbWU9YmFja2VuZC1wb29scy8qfRIlL3YxL3tuYW1lPWdhdGV3YXlzLyovYmFja2VuZC1wb29scy8qfRK/AQoQTGlzdEJhY2tlbmRQb29scxIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdEJhY2tlbmRQb29sc1JlcXVlc3QaMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RCYWNrZW5kUG9vbHNSZXNwb25zZSJCgtPkkwI8WhMSES92MS9iYWNrZW5kLXBvb2xzEiUvdjEve3BhcmVudD1nYXRld2F5cy8qfS9iYWNrZW5kLXBvb2xzEoICChFVcGRhdGVCYWNrZW5kUG9vbBIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlQmFja2VuZFBvb2xSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVCYWNrZW5kUG9vbFJlc3BvbnNlIoEBgtPkkwJ7OgxiYWNrZW5kX3Bvb2xaNzoMYmFja2VuZF9wb29sMicvdjEve2JhY2tlbmRfcG9vbC5uYW1lPWJhY2tlbmQtcG9vbHMvKn0yMi92MS97YmFja2VuZF9wb29sLm5hbWU9Z2F0ZXdheXMvKi9iYWNrZW5kLXBvb2xzLyp9EssBChFEZWxldGVCYWNrZW5kUG9vbBIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlQmFja2VuZFBvb2xSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVCYWNrZW5kUG9vbFJlc3BvbnNlIkuC0+STAkVaHCoaL3YxL3tuYW1lPWJhY2tlbmQtcG9vbHMvKn0qJS92MS97bmFtZT1nYXRld2F5cy8qL2JhY2tlbmQtcG9vbHMvKn0aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21ChQIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQhBCYWNrZW5kUG9vbFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateBackendPool RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateBackendPoolResponse + */ +export type CreateBackendPoolResponse = Message<"redpanda.api.aigateway.v1.CreateBackendPoolResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 1; + */ + backendPool?: BackendPool; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateBackendPoolResponse. + * Use `create(CreateBackendPoolResponseSchema)` to create a new message. + */ +export const CreateBackendPoolResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 0); + +/** + * Response message for GetBackendPool RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetBackendPoolResponse + */ +export type GetBackendPoolResponse = Message<"redpanda.api.aigateway.v1.GetBackendPoolResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 1; + */ + backendPool?: BackendPool; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetBackendPoolResponse. + * Use `create(GetBackendPoolResponseSchema)` to create a new message. + */ +export const GetBackendPoolResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 1); + +/** + * Response message for UpdateBackendPool RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateBackendPoolResponse + */ +export type UpdateBackendPoolResponse = Message<"redpanda.api.aigateway.v1.UpdateBackendPoolResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 1; + */ + backendPool?: BackendPool; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateBackendPoolResponse. + * Use `create(UpdateBackendPoolResponseSchema)` to create a new message. + */ +export const UpdateBackendPoolResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 2); + +/** + * Response message for DeleteBackendPool RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteBackendPoolResponse + */ +export type DeleteBackendPoolResponse = Message<"redpanda.api.aigateway.v1.DeleteBackendPoolResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteBackendPoolResponse. + * Use `create(DeleteBackendPoolResponseSchema)` to create a new message. + */ +export const DeleteBackendPoolResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 3); + +/** + * BackendPool represents a group of LLM provider servers. + * + * @generated from message redpanda.api.aigateway.v1.BackendPool + */ +export type BackendPool = Message<"redpanda.api.aigateway.v1.BackendPool"> & { + /** + * Resource name. + * Format: `gateways/{gateway}/backend-pools/{backend_pool}` or `backend-pools/{backend_pool}` (global) + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Optional: Load balancing configuration + * + * @generated from field: redpanda.api.aigateway.v1.BalancerConfig balancer = 4; + */ + balancer?: BalancerConfig; + + /** + * Servers in this pool + * + * @generated from field: repeated redpanda.api.aigateway.v1.Server servers = 5; + */ + servers: Server[]; + + /** + * Request body transformations (applied before forwarding to backend) + * Examples: "strip_model_prefix", "openai_to_anthropic" + * + * @generated from field: repeated string request_transforms = 6; + */ + requestTransforms: string[]; + + /** + * Response body transformations (applied before returning to client) + * Examples: "anthropic_to_openai" + * + * @generated from field: repeated string response_transforms = 7; + */ + responseTransforms: string[]; + + /** + * Optional: HTTP request/response rewriting for all servers in this pool + * + * @generated from field: redpanda.api.aigateway.v1.RewriteConfig rewrite = 8; + */ + rewrite?: RewriteConfig; + + /** + * Optional: Health checking configuration (passive and active) + * + * @generated from field: redpanda.api.aigateway.v1.HealthCheckConfig health_check = 9; + */ + healthCheck?: HealthCheckConfig; + + /** + * Optional: HTTP client configuration for backend connections + * + * @generated from field: redpanda.api.aigateway.v1.HTTPClientConfig http_client = 10; + */ + httpClient?: HTTPClientConfig; + + /** + * Whether this backend pool is active + * + * @generated from field: bool enabled = 11; + */ + enabled: boolean; + + /** + * Metadata + * + * @generated from field: map metadata = 12; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 13; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 14; + */ + updateTime?: Timestamp; + + /** + * Backend protocol type (default: HTTP for LLM APIs, MCP for tool servers) + * + * @generated from field: redpanda.api.aigateway.v1.BackendType backend_type = 15; + */ + backendType: BackendType; + + /** + * Enable deferred tool loading (MCP backends only) + * When enabled, tools are loaded lazily via tool_search instead of all upfront + * Reduces token usage by ~85% for large tool catalogs (1000+ tools) + * + * @generated from field: bool defer_loading = 16; + */ + deferLoading: boolean; + + /** + * Glob patterns for tools to load immediately (allowlist for critical tools) + * Used with defer_loading to specify essential tools + * Supports wildcards: * (any chars), ? (single char) + * Examples: ["filesystem:*", "orchestrator:execute", "*:read_*"] + * + * @generated from field: repeated string load_upfront = 17; + */ + loadUpfront: string[]; + + /** + * Tool index refresh interval in seconds (MCP backends with defer_loading only) + * How often to refresh the tool index in the background (default: 300 = 5 minutes) + * 0 means use server default + * + * @generated from field: int32 tool_index_refresh_seconds = 18; + */ + toolIndexRefreshSeconds: number; + + /** + * Session idle timeout in seconds (for stateful backends like MCP) + * Default: 3600 (1 hour), max: 86400 (24 hours) + * + * @generated from field: int32 session_timeout = 19; + */ + sessionTimeout: number; + + /** + * DEPRECATED: Per-backend session_manager is no longer supported. + * Session management for MCP backends is now configured globally via the + * mcp_gateway.session_manager section in config.yaml. This field is retained + * for backward compatibility but is ignored by the gateway. + * See: https://docs.redpanda.com/aigateway/mcp-gateway-configuration + * + * @generated from field: redpanda.api.aigateway.v1.SessionManagerConfig session_manager = 20 [deprecated = true]; + * @deprecated + */ + sessionManager?: SessionManagerConfig; + + /** + * Forward OIDC token to all servers in this backend pool + * Can be overridden at the individual server level + * + * @generated from field: bool forward_oidc_token = 21; + */ + forwardOidcToken: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.BackendPool. + * Use `create(BackendPoolSchema)` to create a new message. + */ +export const BackendPoolSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 4); + +/** + * Server represents an individual LLM provider endpoint. + * + * @generated from message redpanda.api.aigateway.v1.Server + */ +export type Server = Message<"redpanda.api.aigateway.v1.Server"> & { + /** + * Required: Unique server identifier within the backend pool + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * Optional: Human-readable display name + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Transport protocol: "http" (default) or "stdio" (for MCP tools) + * + * @generated from field: string transport = 3; + */ + transport: string; + + /** + * Server address (required for http transport) + * Supports http://, https://, and builtin:// schemes + * + * @generated from field: string address = 4; + */ + address: string; + + /** + * Command to execute (required for stdio transport, e.g., "npx") + * + * @generated from field: string command = 5; + */ + command: string; + + /** + * Command arguments (for stdio transport, e.g., ["@modelcontextprotocol/server-memory"]) + * + * @generated from field: repeated string args = 6; + */ + args: string[]; + + /** + * Environment variables for the process (for stdio transport) + * + * @generated from field: map env = 7; + */ + env: { [key: string]: string }; + + /** + * Optional: Per-server HTTP rewrite configuration (overrides backend-level) + * + * @generated from field: redpanda.api.aigateway.v1.RewriteConfig rewrite = 8; + */ + rewrite?: RewriteConfig; + + /** + * Optional: Request timeout in seconds (default: 30s, max: 3600s) + * + * @generated from field: int32 timeout_seconds = 9; + */ + timeoutSeconds: number; + + /** + * Optional: Maximum retry attempts on failure (default: 0, max: 10) + * + * @generated from field: int32 max_retries = 10; + */ + maxRetries: number; + + /** + * Optional: Load balancer weight (default: 100, max: 1000) + * + * @generated from field: int32 weight = 11; + */ + weight: number; + + /** + * Optional: TLS verification mode + * + * @generated from field: redpanda.api.aigateway.v1.TLSVerifyMode tls_verify = 12; + */ + tlsVerify: TLSVerifyMode; + + /** + * Optional: Authentication configuration + * + * @generated from field: redpanda.api.aigateway.v1.AuthConfig auth = 13; + */ + auth?: AuthConfig; + + /** + * Whether this server is enabled + * + * @generated from field: bool enabled = 14; + */ + enabled: boolean; + + /** + * Optional: Forward OIDC token to this specific server + * + * @generated from field: bool forward_oidc_token = 15; + */ + forwardOidcToken: boolean; + + /** + * Optional: Override backend-level defer_loading for this server (MCP servers only) + * When null, inherits from BackendPool.defer_loading + * When explicitly set, overrides backend setting for this specific server + * + * @generated from field: optional bool defer_loading_override = 16; + */ + deferLoadingOverride?: boolean; + + /** + * Optional: Provider identifier (e.g., "openai", "anthropic", "google", "mistral") + * Used for UI display and filtering. When not specified, provider is auto-detected + * from the server address URL. Use this field for custom endpoints or proxies + * where URL-based detection doesn't work. + * + * @generated from field: string provider = 17; + */ + provider: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Server. + * Use `create(ServerSchema)` to create a new message. + */ +export const ServerSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 5); + +/** + * BalancerConfig configures load balancing across servers + * + * @generated from message redpanda.api.aigateway.v1.BalancerConfig + */ +export type BalancerConfig = Message<"redpanda.api.aigateway.v1.BalancerConfig"> & { + /** + * Load balancing strategy + * + * @generated from field: redpanda.api.aigateway.v1.LoadBalancingStrategy strategy = 1; + */ + strategy: LoadBalancingStrategy; + + /** + * Output only. Human-readable strategy name (e.g., "Round Robin", "Weighted") + * + * @generated from field: string strategy_display_name = 2; + */ + strategyDisplayName: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.BalancerConfig. + * Use `create(BalancerConfigSchema)` to create a new message. + */ +export const BalancerConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.AuthConfig + */ +export type AuthConfig = Message<"redpanda.api.aigateway.v1.AuthConfig"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.AuthType type = 1; + */ + type: AuthType; + + /** + * @generated from field: string api_key = 2; + */ + apiKey: string; + + /** + * @generated from field: map headers = 3; + */ + headers: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AuthConfig. + * Use `create(AuthConfigSchema)` to create a new message. + */ +export const AuthConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 7); + +/** + * RewriteConfig defines HTTP request rewriting rules. + * + * @generated from message redpanda.api.aigateway.v1.RewriteConfig + */ +export type RewriteConfig = Message<"redpanda.api.aigateway.v1.RewriteConfig"> & { + /** + * Optional: Path rewriting configuration + * + * @generated from field: redpanda.api.aigateway.v1.PathRewrite path = 1; + */ + path?: PathRewrite; + + /** + * Optional: Header manipulation configuration + * + * @generated from field: redpanda.api.aigateway.v1.HeaderRewrite headers = 2; + */ + headers?: HeaderRewrite; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RewriteConfig. + * Use `create(RewriteConfigSchema)` to create a new message. + */ +export const RewriteConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 8); + +/** + * PathRewrite defines path rewriting rules. + * + * @generated from message redpanda.api.aigateway.v1.PathRewrite + */ +export type PathRewrite = Message<"redpanda.api.aigateway.v1.PathRewrite"> & { + /** + * Regex pattern to match against the request path + * + * @generated from field: string pattern = 1; + */ + pattern: string; + + /** + * Replacement string (can use $1, $2 for regex capture groups) + * + * @generated from field: string replace = 2; + */ + replace: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PathRewrite. + * Use `create(PathRewriteSchema)` to create a new message. + */ +export const PathRewriteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 9); + +/** + * HeaderRewrite defines header manipulation rules. + * + * @generated from message redpanda.api.aigateway.v1.HeaderRewrite + */ +export type HeaderRewrite = Message<"redpanda.api.aigateway.v1.HeaderRewrite"> & { + /** + * Headers to set (overwrite if present) + * + * @generated from field: map set = 1; + */ + set: { [key: string]: string }; + + /** + * Headers to add (only if not already present) + * + * @generated from field: map add = 2; + */ + add: { [key: string]: string }; + + /** + * Headers to remove + * + * @generated from field: repeated string remove = 3; + */ + remove: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.HeaderRewrite. + * Use `create(HeaderRewriteSchema)` to create a new message. + */ +export const HeaderRewriteSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 10); + +/** + * HealthCheckConfig configures passive and active health checking. + * + * @generated from message redpanda.api.aigateway.v1.HealthCheckConfig + */ +export type HealthCheckConfig = Message<"redpanda.api.aigateway.v1.HealthCheckConfig"> & { + /** + * Number of consecutive failures before marking server unhealthy (default: 3) + * + * @generated from field: int32 unhealthy_threshold = 1; + */ + unhealthyThreshold: number; + + /** + * Number of consecutive successes before marking server healthy (default: 2) + * + * @generated from field: int32 healthy_threshold = 2; + */ + healthyThreshold: number; + + /** + * Time before retrying an unhealthy server (e.g., "30s", "5m") + * + * @generated from field: string recovery_interval = 3; + */ + recoveryInterval: string; + + /** + * Optional: Active health checking (periodic probing) + * + * @generated from field: redpanda.api.aigateway.v1.ActiveHealthCheck active = 4; + */ + active?: ActiveHealthCheck; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.HealthCheckConfig. + * Use `create(HealthCheckConfigSchema)` to create a new message. + */ +export const HealthCheckConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 11); + +/** + * ActiveHealthCheck configures periodic probing of backend servers. + * + * @generated from message redpanda.api.aigateway.v1.ActiveHealthCheck + */ +export type ActiveHealthCheck = Message<"redpanda.api.aigateway.v1.ActiveHealthCheck"> & { + /** + * Enable active health checking + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * Health check protocol type (e.g., "http") + * + * @generated from field: string type = 2; + */ + type: string; + + /** + * Probe interval (e.g., "10s") + * + * @generated from field: string interval = 3; + */ + interval: string; + + /** + * Probe timeout (e.g., "5s") + * + * @generated from field: string timeout = 4; + */ + timeout: string; + + /** + * HTTP-specific health check configuration + * + * @generated from field: redpanda.api.aigateway.v1.HTTPHealthCheck http = 5; + */ + http?: HTTPHealthCheck; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ActiveHealthCheck. + * Use `create(ActiveHealthCheckSchema)` to create a new message. + */ +export const ActiveHealthCheckSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 12); + +/** + * HTTPHealthCheck configures HTTP-based active health checks. + * + * @generated from message redpanda.api.aigateway.v1.HTTPHealthCheck + */ +export type HTTPHealthCheck = Message<"redpanda.api.aigateway.v1.HTTPHealthCheck"> & { + /** + * HTTP method for health check request (default: "GET") + * + * @generated from field: string method = 1; + */ + method: string; + + /** + * Health check endpoint path (default: "/health") + * + * @generated from field: string path = 2; + */ + path: string; + + /** + * Expected HTTP status code indicating health (default: 200) + * + * @generated from field: int32 expected_status = 3; + */ + expectedStatus: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.HTTPHealthCheck. + * Use `create(HTTPHealthCheckSchema)` to create a new message. + */ +export const HTTPHealthCheckSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 13); + +/** + * HTTPClientConfig configures the HTTP client for backend requests. + * + * @generated from message redpanda.api.aigateway.v1.HTTPClientConfig + */ +export type HTTPClientConfig = Message<"redpanda.api.aigateway.v1.HTTPClientConfig"> & { + /** + * Connection pool settings + * + * @generated from field: int32 max_idle_conns = 1; + */ + maxIdleConns: number; + + /** + * @generated from field: int32 max_idle_conns_per_server = 2; + */ + maxIdleConnsPerServer: number; + + /** + * @generated from field: int32 max_conns_per_server = 3; + */ + maxConnsPerServer: number; + + /** + * seconds + * + * @generated from field: int32 idle_conn_timeout = 4; + */ + idleConnTimeout: number; + + /** + * Timeout settings (all in seconds, 0 = use default) + * + * @generated from field: int32 connect_timeout = 5; + */ + connectTimeout: number; + + /** + * @generated from field: int32 tls_handshake_timeout = 6; + */ + tlsHandshakeTimeout: number; + + /** + * @generated from field: int32 response_header_timeout = 7; + */ + responseHeaderTimeout: number; + + /** + * @generated from field: int32 expect_continue_timeout = 8; + */ + expectContinueTimeout: number; + + /** + * Feature flags + * + * @generated from field: bool disable_compression = 9; + */ + disableCompression: boolean; + + /** + * @generated from field: bool disable_keep_alives = 10; + */ + disableKeepAlives: boolean; + + /** + * @generated from field: bool force_http2 = 11; + */ + forceHttp2: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.HTTPClientConfig. + * Use `create(HTTPClientConfigSchema)` to create a new message. + */ +export const HTTPClientConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 14); + +/** + * DEPRECATED: SessionManagerConfig is deprecated. + * Session management for MCP backends is now configured globally via the + * mcp_gateway.session_manager section in config.yaml. + * + * Storage auto-detection: + * 1. If mcp_gateway.session_manager.storage_id is set → Uses that Redis instance + * 2. If storage.redis[] is configured → Auto-detects first Redis instance + * 3. Otherwise → Falls back to in-memory storage + * + * This message is retained for backward compatibility but is ignored by the gateway. + * All MCP backends share the same session storage configuration from mcp_gateway. + * + * @generated from message redpanda.api.aigateway.v1.SessionManagerConfig + * @deprecated + */ +export type SessionManagerConfig = Message<"redpanda.api.aigateway.v1.SessionManagerConfig"> & { + /** + * DEPRECATED: Session management is always enabled for MCP backends + * + * @generated from field: bool enabled = 1 [deprecated = true]; + * @deprecated + */ + enabled: boolean; + + /** + * DEPRECATED: Use mcp_gateway.session_manager.enforce_identity_binding instead + * Bind MCP sessions to OIDC subject claim (secure by default) + * When enabled, each OIDC user gets their own isolated session + * + * @generated from field: optional bool enforce_identity_binding = 3 [deprecated = true]; + * @deprecated + */ + enforceIdentityBinding?: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SessionManagerConfig. + * Use `create(SessionManagerConfigSchema)` to create a new message. + * @deprecated + */ +export const SessionManagerConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 15); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateBackendPoolRequest + */ +export type CreateBackendPoolRequest = Message<"redpanda.api.aigateway.v1.CreateBackendPoolRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 3; + */ + backendPool?: BackendPool; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateBackendPoolRequest. + * Use `create(CreateBackendPoolRequestSchema)` to create a new message. + */ +export const CreateBackendPoolRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 16); + +/** + * @generated from message redpanda.api.aigateway.v1.GetBackendPoolRequest + */ +export type GetBackendPoolRequest = Message<"redpanda.api.aigateway.v1.GetBackendPoolRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetBackendPoolRequest. + * Use `create(GetBackendPoolRequestSchema)` to create a new message. + */ +export const GetBackendPoolRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 17); + +/** + * @generated from message redpanda.api.aigateway.v1.ListBackendPoolsRequest + */ +export type ListBackendPoolsRequest = Message<"redpanda.api.aigateway.v1.ListBackendPoolsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListBackendPoolsRequest. + * Use `create(ListBackendPoolsRequestSchema)` to create a new message. + */ +export const ListBackendPoolsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 18); + +/** + * @generated from message redpanda.api.aigateway.v1.ListBackendPoolsResponse + */ +export type ListBackendPoolsResponse = Message<"redpanda.api.aigateway.v1.ListBackendPoolsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.BackendPool backend_pools = 1; + */ + backendPools: BackendPool[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListBackendPoolsResponse. + * Use `create(ListBackendPoolsResponseSchema)` to create a new message. + */ +export const ListBackendPoolsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 19); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateBackendPoolRequest + */ +export type UpdateBackendPoolRequest = Message<"redpanda.api.aigateway.v1.UpdateBackendPoolRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 1; + */ + backendPool?: BackendPool; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateBackendPoolRequest. + * Use `create(UpdateBackendPoolRequestSchema)` to create a new message. + */ +export const UpdateBackendPoolRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 20); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteBackendPoolRequest + */ +export type DeleteBackendPoolRequest = Message<"redpanda.api.aigateway.v1.DeleteBackendPoolRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteBackendPoolRequest. + * Use `create(DeleteBackendPoolRequestSchema)` to create a new message. + */ +export const DeleteBackendPoolRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_backend_pool, 21); + +/** + * @generated from enum redpanda.api.aigateway.v1.LoadBalancingStrategy + */ +export enum LoadBalancingStrategy { + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_ROUND_ROBIN = 1; + */ + ROUND_ROBIN = 1, + + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_WEIGHTED_ROUND_ROBIN = 2; + */ + WEIGHTED_ROUND_ROBIN = 2, + + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_LEAST_CONNECTIONS = 3; + */ + LEAST_CONNECTIONS = 3, + + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_RANDOM = 4; + */ + RANDOM = 4, + + /** + * @generated from enum value: LOAD_BALANCING_STRATEGY_FAILOVER = 5; + */ + FAILOVER = 5, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.LoadBalancingStrategy. + */ +export const LoadBalancingStrategySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_backend_pool, 0); + +/** + * @generated from enum redpanda.api.aigateway.v1.TLSVerifyMode + */ +export enum TLSVerifyMode { + /** + * @generated from enum value: TLS_VERIFY_MODE_UNSPECIFIED = 0; + */ + TLS_VERIFY_MODE_UNSPECIFIED = 0, + + /** + * @generated from enum value: TLS_VERIFY_MODE_FULL = 1; + */ + TLS_VERIFY_MODE_FULL = 1, + + /** + * @generated from enum value: TLS_VERIFY_MODE_SKIP = 2; + */ + TLS_VERIFY_MODE_SKIP = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.TLSVerifyMode. + */ +export const TLSVerifyModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_backend_pool, 1); + +/** + * @generated from enum redpanda.api.aigateway.v1.AuthType + */ +export enum AuthType { + /** + * @generated from enum value: AUTH_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: AUTH_TYPE_BEARER = 1; + */ + BEARER = 1, + + /** + * @generated from enum value: AUTH_TYPE_API_KEY = 2; + */ + API_KEY = 2, + + /** + * @generated from enum value: AUTH_TYPE_CUSTOM = 3; + */ + CUSTOM = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.AuthType. + */ +export const AuthTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_backend_pool, 2); + +/** + * BackendType specifies the backend protocol/implementation. + * + * @generated from enum redpanda.api.aigateway.v1.BackendType + */ +export enum BackendType { + /** + * Default/unspecified (defaults to HTTP) + * + * @generated from enum value: BACKEND_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * HTTP/HTTPS backends (LLM REST APIs like OpenAI, Anthropic) + * + * @generated from enum value: BACKEND_TYPE_HTTP = 1; + */ + HTTP = 1, + + /** + * Model Context Protocol backends (MCP tool servers) + * + * @generated from enum value: BACKEND_TYPE_MCP = 2; + */ + MCP = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.BackendType. + */ +export const BackendTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_backend_pool, 3); + +/** + * @generated from service redpanda.api.aigateway.v1.BackendPoolService + */ +export const BackendPoolService: GenService<{ + /** + * Creates a new backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.CreateBackendPool + */ + createBackendPool: { + methodKind: "unary"; + input: typeof CreateBackendPoolRequestSchema; + output: typeof CreateBackendPoolResponseSchema; + }, + /** + * Gets a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.GetBackendPool + */ + getBackendPool: { + methodKind: "unary"; + input: typeof GetBackendPoolRequestSchema; + output: typeof GetBackendPoolResponseSchema; + }, + /** + * Lists backend pools. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.ListBackendPools + */ + listBackendPools: { + methodKind: "unary"; + input: typeof ListBackendPoolsRequestSchema; + output: typeof ListBackendPoolsResponseSchema; + }, + /** + * Updates a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.UpdateBackendPool + */ + updateBackendPool: { + methodKind: "unary"; + input: typeof UpdateBackendPoolRequestSchema; + output: typeof UpdateBackendPoolResponseSchema; + }, + /** + * Deletes a backend pool. + * + * @generated from rpc redpanda.api.aigateway.v1.BackendPoolService.DeleteBackendPool + */ + deleteBackendPool: { + methodKind: "unary"; + input: typeof DeleteBackendPoolRequestSchema; + output: typeof DeleteBackendPoolResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_backend_pool, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/config-ConfigService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/config-ConfigService_connectquery.ts new file mode 100644 index 0000000000..a3a335d5fa --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/config-ConfigService_connectquery.ts @@ -0,0 +1,61 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { ConfigService } from "./config_pb"; + +/** + * Stages a configuration (assembles entities, validates, stores immutably) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.StageConfiguration + */ +export const stageConfiguration = ConfigService.method.stageConfiguration; + +/** + * Publishes a staged configuration (packages and distributes) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.PublishConfiguration + */ +export const publishConfiguration = ConfigService.method.publishConfiguration; + +/** + * Deploys a published configuration (places near gateway instances) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.DeployConfiguration + */ +export const deployConfiguration = ConfigService.method.deployConfiguration; + +/** + * Releases a deployed configuration (activates it) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration + */ +export const releaseConfiguration = ConfigService.method.releaseConfiguration; + +/** + * Rolls back to a previous configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration + */ +export const rollbackConfiguration = ConfigService.method.rollbackConfiguration; + +/** + * Gets a configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.GetConfiguration + */ +export const getConfiguration = ConfigService.method.getConfiguration; + +/** + * Lists configurations + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.ListConfigurations + */ +export const listConfigurations = ConfigService.method.listConfigurations; + +/** + * Gets the currently active configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration + */ +export const getActiveConfiguration = ConfigService.method.getActiveConfiguration; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/config_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/config_pb.ts new file mode 100644 index 0000000000..38f9537cbd --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/config_pb.ts @@ -0,0 +1,780 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/config.proto. + */ +export const file_redpanda_api_aigateway_v1_config: GenFile = /*@__PURE__*/ + fileDesc("CiZyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2NvbmZpZy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJdChpTdGFnZUNvbmZpZ3VyYXRpb25SZXNwb25zZRI/Cg1jb25maWd1cmF0aW9uGAEgASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Db25maWd1cmF0aW9uIl8KHFB1Ymxpc2hDb25maWd1cmF0aW9uUmVzcG9uc2USPwoNY29uZmlndXJhdGlvbhgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvbiJeChtEZXBsb3lDb25maWd1cmF0aW9uUmVzcG9uc2USPwoNY29uZmlndXJhdGlvbhgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvbiJfChxSZWxlYXNlQ29uZmlndXJhdGlvblJlc3BvbnNlEj8KDWNvbmZpZ3VyYXRpb24YASABKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNvbmZpZ3VyYXRpb24iYAodUm9sbGJhY2tDb25maWd1cmF0aW9uUmVzcG9uc2USPwoNY29uZmlndXJhdGlvbhgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvbiJbChhHZXRDb25maWd1cmF0aW9uUmVzcG9uc2USPwoNY29uZmlndXJhdGlvbhgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvbiJhCh5HZXRBY3RpdmVDb25maWd1cmF0aW9uUmVzcG9uc2USPwoNY29uZmlndXJhdGlvbhgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvbiKiCAoNQ29uZmlndXJhdGlvbhIRCgRuYW1lGAEgASgJQgPgQQgSGAoLdmVyc2lvbl90YWcYAiABKAlCA+BBAhIYCgtjb25maWdfeWFtbBgDIAEoCUID4EEDEhgKC2NvbmZpZ19oYXNoGAQgASgJQgPgQQMSGwoOc2NoZW1hX3ZlcnNpb24YBSABKAlCA+BBAxI5CgZwYXJlbnQYBiABKAlCKfpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uEkMKBnN0YXR1cxgHIAEoDjIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlndXJhdGlvblN0YXR1c0ID4EEDEhYKCWlzX2FjdGl2ZRgIIAEoCEID4EEDEhMKC2Rlc2NyaXB0aW9uGAkgASgJEl4KEWVudGl0aWVzX3NuYXBzaG90GAogAygLMj4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Db25maWd1cmF0aW9uLkVudGl0aWVzU25hcHNob3RFbnRyeUID4EEDEkgKCG1ldGFkYXRhGAsgAygLMjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Db25maWd1cmF0aW9uLk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgNIAEoCUID4EEDEjQKC3N0YWdlZF90aW1lGA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjcKDnB1Ymxpc2hlZF90aW1lGA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjYKDWRlcGxveWVkX3RpbWUYECABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNgoNcmVsZWFzZWRfdGltZRgRIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxpiChVFbnRpdGllc1NuYXBzaG90RW50cnkSCwoDa2V5GAEgASgJEjgKBXZhbHVlGAIgASgLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5FbnRpdHlTbmFwc2hvdDoCOAEaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOnzqQXkKJGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQ29uZmlndXJhdGlvbhIxZ2F0ZXdheXMve2dhdGV3YXl9L2NvbmZpZ3VyYXRpb25zL3tjb25maWd1cmF0aW9ufRIeY29uZmlndXJhdGlvbnMve2NvbmZpZ3VyYXRpb259IjsKDkVudGl0eVNuYXBzaG90EhMKC2VudGl0eV90eXBlGAEgASgJEhQKDGVudGl0eV9uYW1lcxgCIAMoCSJeChBWYWxpZGF0aW9uUmVzdWx0EhAKCGlzX3ZhbGlkGAEgASgIEg4KBmVycm9ycxgCIAMoCRIQCgh3YXJuaW5ncxgDIAMoCRIWCg5zY2hlbWFfdmVyc2lvbhgEIAEoCSJEChJEaXN0cmlidXRpb25SZXN1bHQSDgoGdGFyZ2V0GAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSDQoFZXJyb3IYAyABKAkiTAoQRGVwbG95bWVudFJlc3VsdBIYChBnYXRld2F5X2luc3RhbmNlGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSDQoFZXJyb3IYAyABKAkiZAoNUmVsZWFzZVJlc3VsdBIYChBnYXRld2F5X2luc3RhbmNlGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSDQoFZXJyb3IYAyABKAkSGQoRc2NoZW1hX2NvbXBhdGlibGUYBCABKAgi4QEKGVN0YWdlQ29uZmlndXJhdGlvblJlcXVlc3QSDgoGcGFyZW50GAEgASgJEhgKC3ZlcnNpb25fdGFnGAIgASgJQgPgQQISEwoLZGVzY3JpcHRpb24YAyABKAkSVAoIbWV0YWRhdGEYBCADKAsyQi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlN0YWdlQ29uZmlndXJhdGlvblJlcXVlc3QuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEidwobUHVibGlzaENvbmZpZ3VyYXRpb25SZXF1ZXN0EjoKBG5hbWUYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uEhwKFGRpc3RyaWJ1dGlvbl90YXJnZXRzGAIgAygJInEKGkRlcGxveUNvbmZpZ3VyYXRpb25SZXF1ZXN0EjoKBG5hbWUYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uEhcKD3RhcmdldF9nYXRld2F5cxgCIAMoCSKLAQobUmVsZWFzZUNvbmZpZ3VyYXRpb25SZXF1ZXN0EjoKBG5hbWUYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uEhcKD3RhcmdldF9nYXRld2F5cxgCIAMoCRIXCg9ncmFjZWZ1bF9yZWxvYWQYAyABKAgiuwEKHFJvbGxiYWNrQ29uZmlndXJhdGlvblJlcXVlc3QSOgoEbmFtZRgBIAEoCUIs4EEC+kEmCiRhaWdhdGV3YXkucmVkcGFuZGEuY29tL0NvbmZpZ3VyYXRpb24SSgoUdGFyZ2V0X2NvbmZpZ3VyYXRpb24YAiABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uEhMKC2Rlc2NyaXB0aW9uGAMgASgJIlUKF0dldENvbmZpZ3VyYXRpb25SZXF1ZXN0EjoKBG5hbWUYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Db25maWd1cmF0aW9uInQKGUxpc3RDb25maWd1cmF0aW9uc1JlcXVlc3QSDgoGcGFyZW50GAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoBRISCgpwYWdlX3Rva2VuGAMgASgJEg4KBmZpbHRlchgEIAEoCRIQCghvcmRlcl9ieRgFIAEoCSKLAQoaTGlzdENvbmZpZ3VyYXRpb25zUmVzcG9uc2USQAoOY29uZmlndXJhdGlvbnMYASADKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNvbmZpZ3VyYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUiNAodR2V0QWN0aXZlQ29uZmlndXJhdGlvblJlcXVlc3QSEwoGcGFyZW50GAEgASgJQgPgQQIqiwIKE0NvbmZpZ3VyYXRpb25TdGF0dXMSJAogQ09ORklHVVJBVElPTl9TVEFUVVNfVU5TUEVDSUZJRUQQABIeChpDT05GSUdVUkFUSU9OX1NUQVRVU19EUkFGVBABEh8KG0NPTkZJR1VSQVRJT05fU1RBVFVTX1NUQUdFRBACEiIKHkNPTkZJR1VSQVRJT05fU1RBVFVTX1BVQkxJU0hFRBADEiEKHUNPTkZJR1VSQVRJT05fU1RBVFVTX0RFUExPWUVEEAQSIQodQ09ORklHVVJBVElPTl9TVEFUVVNfUkVMRUFTRUQQBRIjCh9DT05GSUdVUkFUSU9OX1NUQVRVU19TVVBFUlNFREVEEAYyqA4KDUNvbmZpZ1NlcnZpY2US2QEKElN0YWdlQ29uZmlndXJhdGlvbhI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3RhZ2VDb25maWd1cmF0aW9uUmVxdWVzdBo1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3RhZ2VDb25maWd1cmF0aW9uUmVzcG9uc2UiVoLT5JMCUDoBKlodOgEqIhgvdjEvY29uZmlndXJhdGlvbnM6c3RhZ2UiLC92MS97cGFyZW50PWdhdGV3YXlzLyp9L2NvbmZpZ3VyYXRpb25zOnN0YWdlEuwBChRQdWJsaXNoQ29uZmlndXJhdGlvbhI2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHVibGlzaENvbmZpZ3VyYXRpb25SZXF1ZXN0GjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5QdWJsaXNoQ29uZmlndXJhdGlvblJlc3BvbnNlImOC0+STAl06ASpaKDoBKiIjL3YxL3tuYW1lPWNvbmZpZ3VyYXRpb25zLyp9OnB1Ymxpc2giLi92MS97bmFtZT1nYXRld2F5cy8qL2NvbmZpZ3VyYXRpb25zLyp9OnB1Ymxpc2gS5wEKE0RlcGxveUNvbmZpZ3VyYXRpb24SNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlcGxveUNvbmZpZ3VyYXRpb25SZXF1ZXN0GjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZXBsb3lDb25maWd1cmF0aW9uUmVzcG9uc2UiYYLT5JMCWzoBKlonOgEqIiIvdjEve25hbWU9Y29uZmlndXJhdGlvbnMvKn06ZGVwbG95Ii0vdjEve25hbWU9Z2F0ZXdheXMvKi9jb25maWd1cmF0aW9ucy8qfTpkZXBsb3kS7AEKFFJlbGVhc2VDb25maWd1cmF0aW9uEjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZWxlYXNlQ29uZmlndXJhdGlvblJlcXVlc3QaNy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlbGVhc2VDb25maWd1cmF0aW9uUmVzcG9uc2UiY4LT5JMCXToBKlooOgEqIiMvdjEve25hbWU9Y29uZmlndXJhdGlvbnMvKn06cmVsZWFzZSIuL3YxL3tuYW1lPWdhdGV3YXlzLyovY29uZmlndXJhdGlvbnMvKn06cmVsZWFzZRLxAQoVUm9sbGJhY2tDb25maWd1cmF0aW9uEjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb2xsYmFja0NvbmZpZ3VyYXRpb25SZXF1ZXN0GjgucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb2xsYmFja0NvbmZpZ3VyYXRpb25SZXNwb25zZSJlgtPkkwJfOgEqWik6ASoiJC92MS97bmFtZT1jb25maWd1cmF0aW9ucy8qfTpyb2xsYmFjayIvL3YxL3tuYW1lPWdhdGV3YXlzLyovY29uZmlndXJhdGlvbnMvKn06cm9sbGJhY2sSygEKEEdldENvbmZpZ3VyYXRpb24SMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldENvbmZpZ3VyYXRpb25SZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRDb25maWd1cmF0aW9uUmVzcG9uc2UiTYLT5JMCR1odEhsvdjEve25hbWU9Y29uZmlndXJhdGlvbnMvKn0SJi92MS97bmFtZT1nYXRld2F5cy8qL2NvbmZpZ3VyYXRpb25zLyp9EscBChJMaXN0Q29uZmlndXJhdGlvbnMSNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RDb25maWd1cmF0aW9uc1JlcXVlc3QaNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RDb25maWd1cmF0aW9uc1Jlc3BvbnNlIkSC0+STAj5aFBISL3YxL2NvbmZpZ3VyYXRpb25zEiYvdjEve3BhcmVudD1nYXRld2F5cy8qfS9jb25maWd1cmF0aW9ucxLnAQoWR2V0QWN0aXZlQ29uZmlndXJhdGlvbhI4LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0QWN0aXZlQ29uZmlndXJhdGlvblJlcXVlc3QaOS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEFjdGl2ZUNvbmZpZ3VyYXRpb25SZXNwb25zZSJYgtPkkwJSWh4SHC92MS9jb25maWd1cmF0aW9uczpnZXRBY3RpdmUSMC92MS97cGFyZW50PWdhdGV3YXlzLyp9L2NvbmZpZ3VyYXRpb25zOmdldEFjdGl2ZUKAAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCC0NvbmZpZ1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_timestamp]); + +/** + * Response message for StageConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.StageConfigurationResponse + */ +export type StageConfigurationResponse = Message<"redpanda.api.aigateway.v1.StageConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.StageConfigurationResponse. + * Use `create(StageConfigurationResponseSchema)` to create a new message. + */ +export const StageConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 0); + +/** + * Response message for PublishConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.PublishConfigurationResponse + */ +export type PublishConfigurationResponse = Message<"redpanda.api.aigateway.v1.PublishConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PublishConfigurationResponse. + * Use `create(PublishConfigurationResponseSchema)` to create a new message. + */ +export const PublishConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 1); + +/** + * Response message for DeployConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeployConfigurationResponse + */ +export type DeployConfigurationResponse = Message<"redpanda.api.aigateway.v1.DeployConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeployConfigurationResponse. + * Use `create(DeployConfigurationResponseSchema)` to create a new message. + */ +export const DeployConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 2); + +/** + * Response message for ReleaseConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.ReleaseConfigurationResponse + */ +export type ReleaseConfigurationResponse = Message<"redpanda.api.aigateway.v1.ReleaseConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ReleaseConfigurationResponse. + * Use `create(ReleaseConfigurationResponseSchema)` to create a new message. + */ +export const ReleaseConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 3); + +/** + * Response message for RollbackConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.RollbackConfigurationResponse + */ +export type RollbackConfigurationResponse = Message<"redpanda.api.aigateway.v1.RollbackConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RollbackConfigurationResponse. + * Use `create(RollbackConfigurationResponseSchema)` to create a new message. + */ +export const RollbackConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 4); + +/** + * Response message for GetConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetConfigurationResponse + */ +export type GetConfigurationResponse = Message<"redpanda.api.aigateway.v1.GetConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetConfigurationResponse. + * Use `create(GetConfigurationResponseSchema)` to create a new message. + */ +export const GetConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 5); + +/** + * Response message for GetActiveConfiguration RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetActiveConfigurationResponse + */ +export type GetActiveConfigurationResponse = Message<"redpanda.api.aigateway.v1.GetActiveConfigurationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Configuration configuration = 1; + */ + configuration?: Configuration; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetActiveConfigurationResponse. + * Use `create(GetActiveConfigurationResponseSchema)` to create a new message. + */ +export const GetActiveConfigurationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 6); + +/** + * Configuration represents an immutable configuration version. + * + * @generated from message redpanda.api.aigateway.v1.Configuration + */ +export type Configuration = Message<"redpanda.api.aigateway.v1.Configuration"> & { + /** + * Resource name. Format: `gateways/{gateway}/configurations/{configuration}` or `configurations/{configuration}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Semantic version tag (e.g., "v1.0.0") + * + * @generated from field: string version_tag = 2; + */ + versionTag: string; + + /** + * Output only. Assembled YAML configuration + * + * @generated from field: string config_yaml = 3; + */ + configYaml: string; + + /** + * Output only. SHA-256 hash of config_yaml + * + * @generated from field: string config_hash = 4; + */ + configHash: string; + + /** + * Output only. CUE schema version used for validation + * + * @generated from field: string schema_version = 5; + */ + schemaVersion: string; + + /** + * Parent configuration (for lineage tracking) + * + * @generated from field: string parent = 6; + */ + parent: string; + + /** + * Current status + * + * @generated from field: redpanda.api.aigateway.v1.ConfigurationStatus status = 7; + */ + status: ConfigurationStatus; + + /** + * Whether this is the active configuration + * + * @generated from field: bool is_active = 8; + */ + isActive: boolean; + + /** + * Optional description + * + * @generated from field: string description = 9; + */ + description: string; + + /** + * Output only. Snapshot of entity names included + * + * @generated from field: map entities_snapshot = 10; + */ + entitiesSnapshot: { [key: string]: EntitySnapshot }; + + /** + * Metadata + * + * @generated from field: map metadata = 11; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 12; + */ + createTime?: Timestamp; + + /** + * Output only. Creator's OIDC subject + * + * @generated from field: string creator = 13; + */ + creator: string; + + /** + * Output only. Lifecycle timestamps + * + * @generated from field: google.protobuf.Timestamp staged_time = 14; + */ + stagedTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp published_time = 15; + */ + publishedTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp deployed_time = 16; + */ + deployedTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp released_time = 17; + */ + releasedTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Configuration. + * Use `create(ConfigurationSchema)` to create a new message. + */ +export const ConfigurationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.EntitySnapshot + */ +export type EntitySnapshot = Message<"redpanda.api.aigateway.v1.EntitySnapshot"> & { + /** + * @generated from field: string entity_type = 1; + */ + entityType: string; + + /** + * @generated from field: repeated string entity_names = 2; + */ + entityNames: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EntitySnapshot. + * Use `create(EntitySnapshotSchema)` to create a new message. + */ +export const EntitySnapshotSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.ValidationResult + */ +export type ValidationResult = Message<"redpanda.api.aigateway.v1.ValidationResult"> & { + /** + * @generated from field: bool is_valid = 1; + */ + isValid: boolean; + + /** + * @generated from field: repeated string errors = 2; + */ + errors: string[]; + + /** + * @generated from field: repeated string warnings = 3; + */ + warnings: string[]; + + /** + * @generated from field: string schema_version = 4; + */ + schemaVersion: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ValidationResult. + * Use `create(ValidationResultSchema)` to create a new message. + */ +export const ValidationResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DistributionResult + */ +export type DistributionResult = Message<"redpanda.api.aigateway.v1.DistributionResult"> & { + /** + * @generated from field: string target = 1; + */ + target: string; + + /** + * @generated from field: bool success = 2; + */ + success: boolean; + + /** + * @generated from field: string error = 3; + */ + error: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DistributionResult. + * Use `create(DistributionResultSchema)` to create a new message. + */ +export const DistributionResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 10); + +/** + * @generated from message redpanda.api.aigateway.v1.DeploymentResult + */ +export type DeploymentResult = Message<"redpanda.api.aigateway.v1.DeploymentResult"> & { + /** + * @generated from field: string gateway_instance = 1; + */ + gatewayInstance: string; + + /** + * @generated from field: bool success = 2; + */ + success: boolean; + + /** + * @generated from field: string error = 3; + */ + error: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeploymentResult. + * Use `create(DeploymentResultSchema)` to create a new message. + */ +export const DeploymentResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 11); + +/** + * @generated from message redpanda.api.aigateway.v1.ReleaseResult + */ +export type ReleaseResult = Message<"redpanda.api.aigateway.v1.ReleaseResult"> & { + /** + * @generated from field: string gateway_instance = 1; + */ + gatewayInstance: string; + + /** + * @generated from field: bool success = 2; + */ + success: boolean; + + /** + * @generated from field: string error = 3; + */ + error: string; + + /** + * @generated from field: bool schema_compatible = 4; + */ + schemaCompatible: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ReleaseResult. + * Use `create(ReleaseResultSchema)` to create a new message. + */ +export const ReleaseResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 12); + +/** + * @generated from message redpanda.api.aigateway.v1.StageConfigurationRequest + */ +export type StageConfigurationRequest = Message<"redpanda.api.aigateway.v1.StageConfigurationRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: string version_tag = 2; + */ + versionTag: string; + + /** + * @generated from field: string description = 3; + */ + description: string; + + /** + * @generated from field: map metadata = 4; + */ + metadata: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.StageConfigurationRequest. + * Use `create(StageConfigurationRequestSchema)` to create a new message. + */ +export const StageConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 13); + +/** + * @generated from message redpanda.api.aigateway.v1.PublishConfigurationRequest + */ +export type PublishConfigurationRequest = Message<"redpanda.api.aigateway.v1.PublishConfigurationRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: repeated string distribution_targets = 2; + */ + distributionTargets: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PublishConfigurationRequest. + * Use `create(PublishConfigurationRequestSchema)` to create a new message. + */ +export const PublishConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 14); + +/** + * @generated from message redpanda.api.aigateway.v1.DeployConfigurationRequest + */ +export type DeployConfigurationRequest = Message<"redpanda.api.aigateway.v1.DeployConfigurationRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: repeated string target_gateways = 2; + */ + targetGateways: string[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeployConfigurationRequest. + * Use `create(DeployConfigurationRequestSchema)` to create a new message. + */ +export const DeployConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 15); + +/** + * @generated from message redpanda.api.aigateway.v1.ReleaseConfigurationRequest + */ +export type ReleaseConfigurationRequest = Message<"redpanda.api.aigateway.v1.ReleaseConfigurationRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: repeated string target_gateways = 2; + */ + targetGateways: string[]; + + /** + * @generated from field: bool graceful_reload = 3; + */ + gracefulReload: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ReleaseConfigurationRequest. + * Use `create(ReleaseConfigurationRequestSchema)` to create a new message. + */ +export const ReleaseConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 16); + +/** + * @generated from message redpanda.api.aigateway.v1.RollbackConfigurationRequest + */ +export type RollbackConfigurationRequest = Message<"redpanda.api.aigateway.v1.RollbackConfigurationRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string target_configuration = 2; + */ + targetConfiguration: string; + + /** + * @generated from field: string description = 3; + */ + description: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RollbackConfigurationRequest. + * Use `create(RollbackConfigurationRequestSchema)` to create a new message. + */ +export const RollbackConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 17); + +/** + * @generated from message redpanda.api.aigateway.v1.GetConfigurationRequest + */ +export type GetConfigurationRequest = Message<"redpanda.api.aigateway.v1.GetConfigurationRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetConfigurationRequest. + * Use `create(GetConfigurationRequestSchema)` to create a new message. + */ +export const GetConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 18); + +/** + * @generated from message redpanda.api.aigateway.v1.ListConfigurationsRequest + */ +export type ListConfigurationsRequest = Message<"redpanda.api.aigateway.v1.ListConfigurationsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListConfigurationsRequest. + * Use `create(ListConfigurationsRequestSchema)` to create a new message. + */ +export const ListConfigurationsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 19); + +/** + * @generated from message redpanda.api.aigateway.v1.ListConfigurationsResponse + */ +export type ListConfigurationsResponse = Message<"redpanda.api.aigateway.v1.ListConfigurationsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.Configuration configurations = 1; + */ + configurations: Configuration[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListConfigurationsResponse. + * Use `create(ListConfigurationsResponseSchema)` to create a new message. + */ +export const ListConfigurationsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 20); + +/** + * @generated from message redpanda.api.aigateway.v1.GetActiveConfigurationRequest + */ +export type GetActiveConfigurationRequest = Message<"redpanda.api.aigateway.v1.GetActiveConfigurationRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetActiveConfigurationRequest. + * Use `create(GetActiveConfigurationRequestSchema)` to create a new message. + */ +export const GetActiveConfigurationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_config, 21); + +/** + * @generated from enum redpanda.api.aigateway.v1.ConfigurationStatus + */ +export enum ConfigurationStatus { + /** + * @generated from enum value: CONFIGURATION_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: CONFIGURATION_STATUS_DRAFT = 1; + */ + DRAFT = 1, + + /** + * @generated from enum value: CONFIGURATION_STATUS_STAGED = 2; + */ + STAGED = 2, + + /** + * @generated from enum value: CONFIGURATION_STATUS_PUBLISHED = 3; + */ + PUBLISHED = 3, + + /** + * @generated from enum value: CONFIGURATION_STATUS_DEPLOYED = 4; + */ + DEPLOYED = 4, + + /** + * @generated from enum value: CONFIGURATION_STATUS_RELEASED = 5; + */ + RELEASED = 5, + + /** + * @generated from enum value: CONFIGURATION_STATUS_SUPERSEDED = 6; + */ + SUPERSEDED = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.ConfigurationStatus. + */ +export const ConfigurationStatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_config, 0); + +/** + * @generated from service redpanda.api.aigateway.v1.ConfigService + */ +export const ConfigService: GenService<{ + /** + * Stages a configuration (assembles entities, validates, stores immutably) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.StageConfiguration + */ + stageConfiguration: { + methodKind: "unary"; + input: typeof StageConfigurationRequestSchema; + output: typeof StageConfigurationResponseSchema; + }, + /** + * Publishes a staged configuration (packages and distributes) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.PublishConfiguration + */ + publishConfiguration: { + methodKind: "unary"; + input: typeof PublishConfigurationRequestSchema; + output: typeof PublishConfigurationResponseSchema; + }, + /** + * Deploys a published configuration (places near gateway instances) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.DeployConfiguration + */ + deployConfiguration: { + methodKind: "unary"; + input: typeof DeployConfigurationRequestSchema; + output: typeof DeployConfigurationResponseSchema; + }, + /** + * Releases a deployed configuration (activates it) + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.ReleaseConfiguration + */ + releaseConfiguration: { + methodKind: "unary"; + input: typeof ReleaseConfigurationRequestSchema; + output: typeof ReleaseConfigurationResponseSchema; + }, + /** + * Rolls back to a previous configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.RollbackConfiguration + */ + rollbackConfiguration: { + methodKind: "unary"; + input: typeof RollbackConfigurationRequestSchema; + output: typeof RollbackConfigurationResponseSchema; + }, + /** + * Gets a configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.GetConfiguration + */ + getConfiguration: { + methodKind: "unary"; + input: typeof GetConfigurationRequestSchema; + output: typeof GetConfigurationResponseSchema; + }, + /** + * Lists configurations + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.ListConfigurations + */ + listConfigurations: { + methodKind: "unary"; + input: typeof ListConfigurationsRequestSchema; + output: typeof ListConfigurationsResponseSchema; + }, + /** + * Gets the currently active configuration + * + * @generated from rpc redpanda.api.aigateway.v1.ConfigService.GetActiveConfiguration + */ + getActiveConfiguration: { + methodKind: "unary"; + input: typeof GetActiveConfigurationRequestSchema; + output: typeof GetActiveConfigurationResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_config, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery.ts new file mode 100644 index 0000000000..d5dc965635 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery.ts @@ -0,0 +1,40 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/gateway.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { GatewayService } from "./gateway_pb"; + +/** + * Creates a new gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.CreateGateway + */ +export const createGateway = GatewayService.method.createGateway; + +/** + * Gets a gateway by name. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.GetGateway + */ +export const getGateway = GatewayService.method.getGateway; + +/** + * Lists gateways. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.ListGateways + */ +export const listGateways = GatewayService.method.listGateways; + +/** + * Updates a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.UpdateGateway + */ +export const updateGateway = GatewayService.method.updateGateway; + +/** + * Deletes a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.DeleteGateway + */ +export const deleteGateway = GatewayService.method.deleteGateway; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config-GatewayConfigService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config-GatewayConfigService_connectquery.ts new file mode 100644 index 0000000000..93c3546f1a --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config-GatewayConfigService_connectquery.ts @@ -0,0 +1,14 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/gateway_config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { GatewayConfigService } from "./gateway_config_pb"; + +/** + * FetchConfig retrieves the current configuration snapshot. + * Use this for simple polling-based updates or initial bootstrap. + * For real-time updates, prefer StreamConfig. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig + */ +export const fetchConfig = GatewayConfigService.method.fetchConfig; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config_pb.ts new file mode 100644 index 0000000000..30079d0e98 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_config_pb.ts @@ -0,0 +1,593 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/gateway_config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { BackendPool } from "./backend_pool_pb"; +import { file_redpanda_api_aigateway_v1_backend_pool } from "./backend_pool_pb"; +import type { RateLimit } from "./ratelimit_pb"; +import { file_redpanda_api_aigateway_v1_ratelimit } from "./ratelimit_pb"; +import type { RoutingRule } from "./routing_pb"; +import { file_redpanda_api_aigateway_v1_routing } from "./routing_pb"; +import type { SpendLimit } from "./spend_limit_pb"; +import { file_redpanda_api_aigateway_v1_spend_limit } from "./spend_limit_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/gateway_config.proto. + */ +export const file_redpanda_api_aigateway_v1_gateway_config: GenFile = /*@__PURE__*/ + fileDesc("Ci5yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2dhdGV3YXlfY29uZmlnLnByb3RvEhlyZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxIu8BChNTdHJlYW1Db25maWdSZXF1ZXN0Ei0KBG5vZGUYASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk5vZGUSFAoMbGFzdF92ZXJzaW9uGAIgASgJEhYKDnJlc3BvbnNlX25vbmNlGAMgASgJEjoKBWVycm9yGAQgASgLMisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Db25maWdBcHBseUVycm9yEj8KDnJlc291cmNlX3R5cGVzGAUgAygOMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXNvdXJjZVR5cGUigwIKFFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEhQKB3ZlcnNpb24YASABKAlCA+BBAhISCgVub25jZRgCIAEoCUID4EECEj0KBHR5cGUYAyABKA4yJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVR5cGVCCLpIBYIBAhABEjsKCXJlc291cmNlcxgEIAMoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVzb3VyY2VEZWx0YRI0CgtzZXJ2ZXJfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIPCgdnYXRld2F5GAYgASgJIsADCg1SZXNvdXJjZURlbHRhEkgKCW9wZXJhdGlvbhgBIAEoDjIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsdGFPcGVyYXRpb25CCrpIB4IBBBABIAASPgoMYmFja2VuZF9wb29sGAIgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5CYWNrZW5kUG9vbEgAEj4KDHJvdXRpbmdfcnVsZRgDIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm91dGluZ1J1bGVIABI6CgpyYXRlX2xpbWl0GAQgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SYXRlTGltaXRIABI8CgtzcGVuZF9saW1pdBgFIAEoCzIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdEgAEhUKDXJlc291cmNlX25hbWUYBiABKAkSSAoNcmVzb3VyY2VfdHlwZRgHIAEoDjInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVzb3VyY2VUeXBlQgi6SAWCAQIQAUIKCghyZXNvdXJjZSK4AQoETm9kZRIWCgJpZBgBIAEoCUIK4EECukgEcgIQARIPCgdjbHVzdGVyGAIgASgJEhUKDWJ1aWxkX3ZlcnNpb24YAyABKAkSPwoIbWV0YWRhdGEYBCADKAsyLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk5vZGUuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiwwEKEENvbmZpZ0FwcGx5RXJyb3ISRwoEY29kZRgBIAEoDjIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ29uZmlnQXBwbHlFcnJvckNvZGVCCLpIBYIBAhABEg8KB21lc3NhZ2UYAiABKAkSFQoNcmVzb3VyY2VfbmFtZRgDIAEoCRI+Cg1yZXNvdXJjZV90eXBlGAQgASgOMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXNvdXJjZVR5cGUioAEKEkZldGNoQ29uZmlnUmVxdWVzdBIyCgRub2RlGAEgASgLMh8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Ob2RlQgPgQQISFQoNc2luY2VfdmVyc2lvbhgCIAEoCRI/Cg5yZXNvdXJjZV90eXBlcxgDIAMoDjInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVzb3VyY2VUeXBlIt0BChNGZXRjaENvbmZpZ1Jlc3BvbnNlEhQKB3ZlcnNpb24YASABKAlCA+BBAhI9CgR0eXBlGAIgASgOMiUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVUeXBlQgi6SAWCAQIQARI7CglyZXNvdXJjZXMYAyADKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlc291cmNlRGVsdGESNAoLc2VydmVyX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMqWgoKVXBkYXRlVHlwZRIbChdVUERBVEVfVFlQRV9VTlNQRUNJRklFRBAAEhgKFFVQREFURV9UWVBFX1NOQVBTSE9UEAESFQoRVVBEQVRFX1RZUEVfREVMVEEQAiqCAQoORGVsdGFPcGVyYXRpb24SHwobREVMVEFfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASFwoTREVMVEFfT1BFUkFUSU9OX0FERBABEhoKFkRFTFRBX09QRVJBVElPTl9VUERBVEUQAhIaChZERUxUQV9PUEVSQVRJT05fUkVNT1ZFEAMqqgEKDFJlc291cmNlVHlwZRIdChlSRVNPVVJDRV9UWVBFX1VOU1BFQ0lGSUVEEAASHgoaUkVTT1VSQ0VfVFlQRV9CQUNLRU5EX1BPT0wQARIeChpSRVNPVVJDRV9UWVBFX1JPVVRJTkdfUlVMRRACEhwKGFJFU09VUkNFX1RZUEVfUkFURV9MSU1JVBADEh0KGVJFU09VUkNFX1RZUEVfU1BFTkRfTElNSVQQBCrbAQoUQ29uZmlnQXBwbHlFcnJvckNvZGUSJwojQ09ORklHX0FQUExZX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABImCiJDT05GSUdfQVBQTFlfRVJST1JfQ09ERV9WQUxJREFUSU9OEAESJgoiQ09ORklHX0FQUExZX0VSUk9SX0NPREVfREVQRU5ERU5DWRACEiQKIENPTkZJR19BUFBMWV9FUlJPUl9DT0RFX0NPTkZMSUNUEAMSJAogQ09ORklHX0FQUExZX0VSUk9SX0NPREVfSU5URVJOQUwQBDKfAgoUR2F0ZXdheUNvbmZpZ1NlcnZpY2UScwoMU3RyZWFtQ29uZmlnEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TdHJlYW1Db25maWdSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TdHJlYW1Db25maWdSZXNwb25zZSgBMAESkQEKC0ZldGNoQ29uZmlnEi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5GZXRjaENvbmZpZ1JlcXVlc3QaLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkZldGNoQ29uZmlnUmVzcG9uc2UiI4LT5JMCHToBKiIYL3YxL2dhdGV3YXktY29uZmlnOmZldGNoQocCCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUISR2F0ZXdheUNvbmZpZ1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_field_behavior, file_google_protobuf_timestamp, file_redpanda_api_aigateway_v1_backend_pool, file_redpanda_api_aigateway_v1_ratelimit, file_redpanda_api_aigateway_v1_routing, file_redpanda_api_aigateway_v1_spend_limit]); + +/** + * StreamConfigRequest is sent by gateways to subscribe and acknowledge updates. + * + * @generated from message redpanda.api.aigateway.v1.StreamConfigRequest + */ +export type StreamConfigRequest = Message<"redpanda.api.aigateway.v1.StreamConfigRequest"> & { + /** + * Node information identifying this gateway instance. + * Required on first message, optional on subsequent ACKs. + * + * @generated from field: redpanda.api.aigateway.v1.Node node = 1; + */ + node?: Node; + + /** + * Last successfully applied version. + * Empty on initial connection (requests full snapshot). + * Set on reconnection to resume from last known state. + * + * @generated from field: string last_version = 2; + */ + lastVersion: string; + + /** + * Response nonce being acknowledged. + * Matches the nonce in the corresponding StreamConfigResponse. + * Empty on initial request. + * + * @generated from field: string response_nonce = 3; + */ + responseNonce: string; + + /** + * Optional error if the gateway failed to apply the previous update. + * Control plane may resend the update or take corrective action. + * + * @generated from field: redpanda.api.aigateway.v1.ConfigApplyError error = 4; + */ + error?: ConfigApplyError; + + /** + * Optional: Filter by resource types. + * If empty, subscribes to all resource types. + * Only used on initial request. + * + * @generated from field: repeated redpanda.api.aigateway.v1.ResourceType resource_types = 5; + */ + resourceTypes: ResourceType[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.StreamConfigRequest. + * Use `create(StreamConfigRequestSchema)` to create a new message. + */ +export const StreamConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 0); + +/** + * StreamConfigResponse contains configuration updates streamed from control plane. + * + * @generated from message redpanda.api.aigateway.v1.StreamConfigResponse + */ +export type StreamConfigResponse = Message<"redpanda.api.aigateway.v1.StreamConfigResponse"> & { + /** + * Monotonically increasing version identifier. + * Format: "{timestamp_unix_nanos}_{sequence}" + * Gateways should persist this to resume on reconnection. + * + * @generated from field: string version = 1; + */ + version: string; + + /** + * Unique identifier for this response. + * Gateway must echo this in the next StreamConfigRequest.response_nonce. + * + * @generated from field: string nonce = 2; + */ + nonce: string; + + /** + * Type of update being sent. + * + * @generated from field: redpanda.api.aigateway.v1.UpdateType type = 3; + */ + type: UpdateType; + + /** + * Resource deltas (changes since last version or full snapshot). + * For SNAPSHOT type: contains all current resources. + * For DELTA type: contains only changed resources. + * + * @generated from field: repeated redpanda.api.aigateway.v1.ResourceDelta resources = 4; + */ + resources: ResourceDelta[]; + + /** + * Server timestamp when this update was generated. + * + * @generated from field: google.protobuf.Timestamp server_time = 5; + */ + serverTime?: Timestamp; + + /** + * Gateway resource name this config applies to. + * Format: "gateways/{gateway_id}" + * + * @generated from field: string gateway = 6; + */ + gateway: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.StreamConfigResponse. + * Use `create(StreamConfigResponseSchema)` to create a new message. + */ +export const StreamConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 1); + +/** + * ResourceDelta represents a single resource change. + * + * @generated from message redpanda.api.aigateway.v1.ResourceDelta + */ +export type ResourceDelta = Message<"redpanda.api.aigateway.v1.ResourceDelta"> & { + /** + * Type of operation for this resource. + * + * @generated from field: redpanda.api.aigateway.v1.DeltaOperation operation = 1; + */ + operation: DeltaOperation; + + /** + * The resource being changed. + * Exactly one of the resource fields must be set based on resource_type. + * + * @generated from oneof redpanda.api.aigateway.v1.ResourceDelta.resource + */ + resource: { + /** + * @generated from field: redpanda.api.aigateway.v1.BackendPool backend_pool = 2; + */ + value: BackendPool; + case: "backendPool"; + } | { + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 3; + */ + value: RoutingRule; + case: "routingRule"; + } | { + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 4; + */ + value: RateLimit; + case: "rateLimit"; + } | { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 5; + */ + value: SpendLimit; + case: "spendLimit"; + } | { case: undefined; value?: undefined }; + + /** + * For REMOVE operations, the resource name to remove. + * Only used when the resource oneof is not set. + * + * @generated from field: string resource_name = 6; + */ + resourceName: string; + + /** + * Resource type hint (useful for REMOVE operations). + * + * @generated from field: redpanda.api.aigateway.v1.ResourceType resource_type = 7; + */ + resourceType: ResourceType; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ResourceDelta. + * Use `create(ResourceDeltaSchema)` to create a new message. + */ +export const ResourceDeltaSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 2); + +/** + * Node contains information about the subscribing gateway instance. + * + * @generated from message redpanda.api.aigateway.v1.Node + */ +export type Node = Message<"redpanda.api.aigateway.v1.Node"> & { + /** + * Unique identifier for this gateway instance. + * Format: "gateways/{gateway_id}" + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * Human-readable cluster/deployment name for debugging. + * + * @generated from field: string cluster = 2; + */ + cluster: string; + + /** + * Build version of the gateway binary. + * + * @generated from field: string build_version = 3; + */ + buildVersion: string; + + /** + * Arbitrary metadata (e.g., region, availability_zone). + * + * @generated from field: map metadata = 4; + */ + metadata: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Node. + * Use `create(NodeSchema)` to create a new message. + */ +export const NodeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 3); + +/** + * ConfigApplyError reports errors when applying configuration updates. + * + * @generated from message redpanda.api.aigateway.v1.ConfigApplyError + */ +export type ConfigApplyError = Message<"redpanda.api.aigateway.v1.ConfigApplyError"> & { + /** + * Error code categorizing the failure. + * + * @generated from field: redpanda.api.aigateway.v1.ConfigApplyErrorCode code = 1; + */ + code: ConfigApplyErrorCode; + + /** + * Human-readable error message. + * + * @generated from field: string message = 2; + */ + message: string; + + /** + * Resource name that caused the error (if applicable). + * + * @generated from field: string resource_name = 3; + */ + resourceName: string; + + /** + * Resource type that caused the error (if applicable). + * + * @generated from field: redpanda.api.aigateway.v1.ResourceType resource_type = 4; + */ + resourceType: ResourceType; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ConfigApplyError. + * Use `create(ConfigApplyErrorSchema)` to create a new message. + */ +export const ConfigApplyErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 4); + +/** + * FetchConfigRequest is used for single-shot configuration retrieval. + * + * @generated from message redpanda.api.aigateway.v1.FetchConfigRequest + */ +export type FetchConfigRequest = Message<"redpanda.api.aigateway.v1.FetchConfigRequest"> & { + /** + * Node information identifying this gateway instance. + * + * @generated from field: redpanda.api.aigateway.v1.Node node = 1; + */ + node?: Node; + + /** + * Optional: Only return resources changed since this version. + * If empty, returns full snapshot. + * + * @generated from field: string since_version = 2; + */ + sinceVersion: string; + + /** + * Optional: Filter by resource types. + * If empty, returns all resource types. + * + * @generated from field: repeated redpanda.api.aigateway.v1.ResourceType resource_types = 3; + */ + resourceTypes: ResourceType[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.FetchConfigRequest. + * Use `create(FetchConfigRequestSchema)` to create a new message. + */ +export const FetchConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 5); + +/** + * FetchConfigResponse contains the requested configuration snapshot. + * + * @generated from message redpanda.api.aigateway.v1.FetchConfigResponse + */ +export type FetchConfigResponse = Message<"redpanda.api.aigateway.v1.FetchConfigResponse"> & { + /** + * Current version of the configuration. + * + * @generated from field: string version = 1; + */ + version: string; + + /** + * Type of response (SNAPSHOT or DELTA based on since_version). + * + * @generated from field: redpanda.api.aigateway.v1.UpdateType type = 2; + */ + type: UpdateType; + + /** + * The configuration resources. + * + * @generated from field: repeated redpanda.api.aigateway.v1.ResourceDelta resources = 3; + */ + resources: ResourceDelta[]; + + /** + * Server timestamp when this snapshot was generated. + * + * @generated from field: google.protobuf.Timestamp server_time = 4; + */ + serverTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.FetchConfigResponse. + * Use `create(FetchConfigResponseSchema)` to create a new message. + */ +export const FetchConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway_config, 6); + +/** + * UpdateType specifies whether this is a full snapshot or incremental delta. + * + * @generated from enum redpanda.api.aigateway.v1.UpdateType + */ +export enum UpdateType { + /** + * @generated from enum value: UPDATE_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Full configuration snapshot. + * Replaces all existing resources of each type included. + * + * @generated from enum value: UPDATE_TYPE_SNAPSHOT = 1; + */ + SNAPSHOT = 1, + + /** + * Incremental delta update. + * Only contains resources that changed since last version. + * + * @generated from enum value: UPDATE_TYPE_DELTA = 2; + */ + DELTA = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.UpdateType. + */ +export const UpdateTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_gateway_config, 0); + +/** + * DeltaOperation specifies what change to apply to a resource. + * + * @generated from enum redpanda.api.aigateway.v1.DeltaOperation + */ +export enum DeltaOperation { + /** + * @generated from enum value: DELTA_OPERATION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Add a new resource or update if it exists. + * Idempotent: applying the same ADD twice results in the same state. + * + * @generated from enum value: DELTA_OPERATION_ADD = 1; + */ + ADD = 1, + + /** + * Update an existing resource. + * Same as ADD semantically; explicit for logging/metrics. + * + * @generated from enum value: DELTA_OPERATION_UPDATE = 2; + */ + UPDATE = 2, + + /** + * Remove a resource by name. + * Idempotent: removing a non-existent resource is a no-op. + * + * @generated from enum value: DELTA_OPERATION_REMOVE = 3; + */ + REMOVE = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.DeltaOperation. + */ +export const DeltaOperationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_gateway_config, 1); + +/** + * ResourceType identifies the type of configuration resource. + * + * @generated from enum redpanda.api.aigateway.v1.ResourceType + */ +export enum ResourceType { + /** + * @generated from enum value: RESOURCE_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: RESOURCE_TYPE_BACKEND_POOL = 1; + */ + BACKEND_POOL = 1, + + /** + * @generated from enum value: RESOURCE_TYPE_ROUTING_RULE = 2; + */ + ROUTING_RULE = 2, + + /** + * @generated from enum value: RESOURCE_TYPE_RATE_LIMIT = 3; + */ + RATE_LIMIT = 3, + + /** + * @generated from enum value: RESOURCE_TYPE_SPEND_LIMIT = 4; + */ + SPEND_LIMIT = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.ResourceType. + */ +export const ResourceTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_gateway_config, 2); + +/** + * ConfigApplyErrorCode categorizes configuration application failures. + * + * @generated from enum redpanda.api.aigateway.v1.ConfigApplyErrorCode + */ +export enum ConfigApplyErrorCode { + /** + * @generated from enum value: CONFIG_APPLY_ERROR_CODE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Resource validation failed (e.g., invalid CEL expression). + * + * @generated from enum value: CONFIG_APPLY_ERROR_CODE_VALIDATION = 1; + */ + VALIDATION = 1, + + /** + * Resource dependency not found (e.g., backend_pool for routing rule). + * + * @generated from enum value: CONFIG_APPLY_ERROR_CODE_DEPENDENCY = 2; + */ + DEPENDENCY = 2, + + /** + * Resource conflict (e.g., duplicate ID). + * + * @generated from enum value: CONFIG_APPLY_ERROR_CODE_CONFLICT = 3; + */ + CONFLICT = 3, + + /** + * Internal error applying the configuration. + * + * @generated from enum value: CONFIG_APPLY_ERROR_CODE_INTERNAL = 4; + */ + INTERNAL = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.ConfigApplyErrorCode. + */ +export const ConfigApplyErrorCodeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_gateway_config, 3); + +/** + * GatewayConfigService provides streaming configuration updates to data plane gateways. + * + * This is an xDS-inspired protocol for incremental configuration distribution: + * - Gateways connect and subscribe to configuration updates + * - Control plane streams delta updates (add/update/remove resources) + * - Each update includes a version for consistency tracking + * - Gateways acknowledge received updates to enable flow control + * + * The service supports both full snapshots (initial sync) and delta updates + * (ongoing changes), minimizing bandwidth and processing overhead. + * + * Note: This service uses bidirectional streaming for efficient ACK/NACK flow. + * It is intended for internal gateway-to-control-plane communication (Go services), + * not for web clients. Web clients should use the REST CRUD APIs. + * + * @generated from service redpanda.api.aigateway.v1.GatewayConfigService + */ +export const GatewayConfigService: GenService<{ + /** + * StreamConfig establishes a bidirectional stream for configuration updates. + * + * Flow: + * 1. Gateway sends StreamConfigRequest with node info and optional last_version + * 2. Control plane sends initial StreamConfigResponse with full snapshot (if no version) + * or delta updates since last_version + * 3. Gateway sends ACK with received version + * 4. Control plane streams delta updates as resources change + * 5. Gateway ACKs each update + * + * On reconnection, gateway sends last successfully applied version to resume + * from where it left off. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayConfigService.StreamConfig + */ + streamConfig: { + methodKind: "bidi_streaming"; + input: typeof StreamConfigRequestSchema; + output: typeof StreamConfigResponseSchema; + }, + /** + * FetchConfig retrieves the current configuration snapshot. + * Use this for simple polling-based updates or initial bootstrap. + * For real-time updates, prefer StreamConfig. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayConfigService.FetchConfig + */ + fetchConfig: { + methodKind: "unary"; + input: typeof FetchConfigRequestSchema; + output: typeof FetchConfigResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_gateway_config, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_pb.ts new file mode 100644 index 0000000000..0f04b1e249 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/gateway_pb.ts @@ -0,0 +1,425 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/gateway.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/gateway.proto. + */ +export const file_redpanda_api_aigateway_v1_gateway: GenFile = /*@__PURE__*/ + fileDesc("CidyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2dhdGV3YXkucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiTAoVQ3JlYXRlR2F0ZXdheVJlc3BvbnNlEjMKB2dhdGV3YXkYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXkiSQoSR2V0R2F0ZXdheVJlc3BvbnNlEjMKB2dhdGV3YXkYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXkiTAoVVXBkYXRlR2F0ZXdheVJlc3BvbnNlEjMKB2dhdGV3YXkYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXkiFwoVRGVsZXRlR2F0ZXdheVJlc3BvbnNlIsADCgdHYXRld2F5EhEKBG5hbWUYASABKAlCA+BBCBIZCgxkaXNwbGF5X25hbWUYAiABKAlCA+BBAhIYCgtkZXNjcmlwdGlvbhgDIAEoCUID4EEBEg8KB2VuYWJsZWQYBCABKAgSQgoIbWV0YWRhdGEYBSADKAsyMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXkuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGAggASgJQgPgQQMSFAoHdXBkYXRlchgJIAEoCUID4EEDEhYKCXdvcmtzcGFjZRgKIAEoCUID4EECGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATo36kE0Ch5haWdhdGV3YXkucmVkcGFuZGEuY29tL0dhdGV3YXkSEmdhdGV3YXlzL3tnYXRld2F5fSJ3ChRDcmVhdGVHYXRld2F5UmVxdWVzdBITCgZwYXJlbnQYASABKAlCA+BBAhI4CgdnYXRld2F5GAMgASgLMiIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HYXRld2F5QgPgQQJKBAgCEANSCmdhdGV3YXlfaWQiSQoRR2V0R2F0ZXdheVJlcXVlc3QSNAoEbmFtZRgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0dhdGV3YXkihwEKE0xpc3RHYXRld2F5c1JlcXVlc3QSEwoGcGFyZW50GAEgASgJQgPgQQESFgoJcGFnZV9zaXplGAIgASgFQgPgQQESFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhMKBmZpbHRlchgEIAEoCUID4EEBEhUKCG9yZGVyX2J5GAUgASgJQgPgQQEieQoUTGlzdEdhdGV3YXlzUmVzcG9uc2USNAoIZ2F0ZXdheXMYASADKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUihgEKFFVwZGF0ZUdhdGV3YXlSZXF1ZXN0EjgKB2dhdGV3YXkYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdhdGV3YXlCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJgChREZWxldGVHYXRld2F5UmVxdWVzdBI0CgRuYW1lGAEgASgJQibgQQL6QSAKHmFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vR2F0ZXdheRISCgVmb3JjZRgCIAEoCEID4EEBMosGCg5HYXRld2F5U2VydmljZRKRAQoNQ3JlYXRlR2F0ZXdheRIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlR2F0ZXdheVJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZUdhdGV3YXlSZXNwb25zZSIdgtPkkwIXOgdnYXRld2F5IgwvdjEvZ2F0ZXdheXMSiAEKCkdldEdhdGV3YXkSLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEdhdGV3YXlSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRHYXRld2F5UmVzcG9uc2UiHYLT5JMCFxIVL3YxL3tuYW1lPWdhdGV3YXlzLyp9EoUBCgxMaXN0R2F0ZXdheXMSLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RHYXRld2F5c1JlcXVlc3QaLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RHYXRld2F5c1Jlc3BvbnNlIhSC0+STAg4SDC92MS9nYXRld2F5cxKiAQoNVXBkYXRlR2F0ZXdheRIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlR2F0ZXdheVJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUdhdGV3YXlSZXNwb25zZSIugtPkkwIoOgdnYXRld2F5Mh0vdjEve2dhdGV3YXkubmFtZT1nYXRld2F5cy8qfRKRAQoNRGVsZXRlR2F0ZXdheRIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlR2F0ZXdheVJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZUdhdGV3YXlSZXNwb25zZSIdgtPkkwIXKhUvdjEve25hbWU9Z2F0ZXdheXMvKn0aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21CgQIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQgxHYXRld2F5UHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateGateway RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateGatewayResponse + */ +export type CreateGatewayResponse = Message<"redpanda.api.aigateway.v1.CreateGatewayResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Gateway gateway = 1; + */ + gateway?: Gateway; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateGatewayResponse. + * Use `create(CreateGatewayResponseSchema)` to create a new message. + */ +export const CreateGatewayResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 0); + +/** + * Response message for GetGateway RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetGatewayResponse + */ +export type GetGatewayResponse = Message<"redpanda.api.aigateway.v1.GetGatewayResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Gateway gateway = 1; + */ + gateway?: Gateway; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetGatewayResponse. + * Use `create(GetGatewayResponseSchema)` to create a new message. + */ +export const GetGatewayResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 1); + +/** + * Response message for UpdateGateway RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateGatewayResponse + */ +export type UpdateGatewayResponse = Message<"redpanda.api.aigateway.v1.UpdateGatewayResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Gateway gateway = 1; + */ + gateway?: Gateway; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateGatewayResponse. + * Use `create(UpdateGatewayResponseSchema)` to create a new message. + */ +export const UpdateGatewayResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 2); + +/** + * Response message for DeleteGateway RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteGatewayResponse + */ +export type DeleteGatewayResponse = Message<"redpanda.api.aigateway.v1.DeleteGatewayResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteGatewayResponse. + * Use `create(DeleteGatewayResponseSchema)` to create a new message. + */ +export const DeleteGatewayResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 3); + +/** + * Gateway represents a virtual gateway with isolated configuration. + * + * @generated from message redpanda.api.aigateway.v1.Gateway + */ +export type Gateway = Message<"redpanda.api.aigateway.v1.Gateway"> & { + /** + * Resource name. Format: `gateways/{gateway_id}` + * Gateway ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Whether this gateway is active + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 5; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 6; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 7; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator's OIDC subject (if available) + * + * @generated from field: string creator = 8; + */ + creator: string; + + /** + * Output only. Last updater's OIDC subject (if available) + * + * @generated from field: string updater = 9; + */ + updater: string; + + /** + * Required: Parent workspace for this gateway. + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * + * @generated from field: string workspace = 10; + */ + workspace: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Gateway. + * Use `create(GatewaySchema)` to create a new message. + */ +export const GatewaySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateGatewayRequest + */ +export type CreateGatewayRequest = Message<"redpanda.api.aigateway.v1.CreateGatewayRequest"> & { + /** + * Required: The parent workspace where this gateway will be created. + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The gateway resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Gateway gateway = 3; + */ + gateway?: Gateway; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateGatewayRequest. + * Use `create(CreateGatewayRequestSchema)` to create a new message. + */ +export const CreateGatewayRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.GetGatewayRequest + */ +export type GetGatewayRequest = Message<"redpanda.api.aigateway.v1.GetGatewayRequest"> & { + /** + * Resource name of the gateway. + * Format: `gateways/{gateway}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetGatewayRequest. + * Use `create(GetGatewayRequestSchema)` to create a new message. + */ +export const GetGatewayRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.ListGatewaysRequest + */ +export type ListGatewaysRequest = Message<"redpanda.api.aigateway.v1.ListGatewaysRequest"> & { + /** + * Optional: Filter by workspace. + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * If empty, lists all gateways the caller has access to. + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of gateways to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListGateways call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * Examples: + * enabled = true + * display_name = "production-gateway" + * create_time > timestamp("2024-01-01T00:00:00Z") + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * Examples: "create_time desc", "display_name" + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListGatewaysRequest. + * Use `create(ListGatewaysRequestSchema)` to create a new message. + */ +export const ListGatewaysRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.ListGatewaysResponse + */ +export type ListGatewaysResponse = Message<"redpanda.api.aigateway.v1.ListGatewaysResponse"> & { + /** + * The list of gateways + * + * @generated from field: repeated redpanda.api.aigateway.v1.Gateway gateways = 1; + */ + gateways: Gateway[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count (if requested via filter) + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListGatewaysResponse. + * Use `create(ListGatewaysResponseSchema)` to create a new message. + */ +export const ListGatewaysResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateGatewayRequest + */ +export type UpdateGatewayRequest = Message<"redpanda.api.aigateway.v1.UpdateGatewayRequest"> & { + /** + * The gateway resource to update. + * The gateway's name field is used to identify the resource. + * + * @generated from field: redpanda.api.aigateway.v1.Gateway gateway = 1; + */ + gateway?: Gateway; + + /** + * The fields to update. + * If omitted, all mutable fields are updated. + * Allowed fields: display_name, description, enabled, metadata + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateGatewayRequest. + * Use `create(UpdateGatewayRequestSchema)` to create a new message. + */ +export const UpdateGatewayRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteGatewayRequest + */ +export type DeleteGatewayRequest = Message<"redpanda.api.aigateway.v1.DeleteGatewayRequest"> & { + /** + * Resource name of the gateway to delete. + * Format: `gateways/{gateway}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all child resources (backend pools, routing rules, etc.) + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteGatewayRequest. + * Use `create(DeleteGatewayRequestSchema)` to create a new message. + */ +export const DeleteGatewayRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_gateway, 10); + +/** + * @generated from service redpanda.api.aigateway.v1.GatewayService + */ +export const GatewayService: GenService<{ + /** + * Creates a new gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.CreateGateway + */ + createGateway: { + methodKind: "unary"; + input: typeof CreateGatewayRequestSchema; + output: typeof CreateGatewayResponseSchema; + }, + /** + * Gets a gateway by name. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.GetGateway + */ + getGateway: { + methodKind: "unary"; + input: typeof GetGatewayRequestSchema; + output: typeof GetGatewayResponseSchema; + }, + /** + * Lists gateways. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.ListGateways + */ + listGateways: { + methodKind: "unary"; + input: typeof ListGatewaysRequestSchema; + output: typeof ListGatewaysResponseSchema; + }, + /** + * Updates a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.UpdateGateway + */ + updateGateway: { + methodKind: "unary"; + input: typeof UpdateGatewayRequestSchema; + output: typeof UpdateGatewayResponseSchema; + }, + /** + * Deletes a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.GatewayService.DeleteGateway + */ + deleteGateway: { + methodKind: "unary"; + input: typeof DeleteGatewayRequestSchema; + output: typeof DeleteGatewayResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_gateway, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail-GuardrailService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail-GuardrailService_connectquery.ts new file mode 100644 index 0000000000..cce0607eb7 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail-GuardrailService_connectquery.ts @@ -0,0 +1,30 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/guardrail.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { GuardrailService } from "./guardrail_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail + */ +export const createGuardrail = GuardrailService.method.createGuardrail; + +/** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.GetGuardrail + */ +export const getGuardrail = GuardrailService.method.getGuardrail; + +/** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.ListGuardrails + */ +export const listGuardrails = GuardrailService.method.listGuardrails; + +/** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail + */ +export const updateGuardrail = GuardrailService.method.updateGuardrail; + +/** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail + */ +export const deleteGuardrail = GuardrailService.method.deleteGuardrail; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail_pb.ts new file mode 100644 index 0000000000..6d89b962a9 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/guardrail_pb.ts @@ -0,0 +1,502 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/guardrail.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/guardrail.proto. + */ +export const file_redpanda_api_aigateway_v1_guardrail: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2d1YXJkcmFpbC5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJSChdDcmVhdGVHdWFyZHJhaWxSZXNwb25zZRI3CglndWFyZHJhaWwYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkd1YXJkcmFpbCJPChRHZXRHdWFyZHJhaWxSZXNwb25zZRI3CglndWFyZHJhaWwYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkd1YXJkcmFpbCJSChdVcGRhdGVHdWFyZHJhaWxSZXNwb25zZRI3CglndWFyZHJhaWwYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkd1YXJkcmFpbCIZChdEZWxldGVHdWFyZHJhaWxSZXNwb25zZSKzBQoJR3VhcmRyYWlsEhEKBG5hbWUYASABKAlCA+BBCBIZCgxkaXNwbGF5X25hbWUYAiABKAlCA+BBAhITCgtkZXNjcmlwdGlvbhgDIAEoCRI7CgR0eXBlGAQgASgOMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HdWFyZHJhaWxUeXBlQgPgQQISHQoQbWF0Y2hfZXhwcmVzc2lvbhgFIAEoCUID4EECEjsKCHBhdHRlcm5zGAYgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Db250ZW50UGF0dGVybhI/CgZhY3Rpb24YByABKA4yKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkd1YXJkcmFpbEFjdGlvbkID4EECEhQKDHNjYW5fcmVxdWVzdBgIIAEoCBIVCg1zY2FuX3Jlc3BvbnNlGAkgASgIEg8KB2VuYWJsZWQYCiABKAgSRAoIbWV0YWRhdGEYCyADKAsyMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkd1YXJkcmFpbC5NZXRhZGF0YUVudHJ5EjQKC2NyZWF0ZV90aW1lGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpo6kFlCiBhaWdhdGV3YXkucmVkcGFuZGEuY29tL0d1YXJkcmFpbBIpZ2F0ZXdheXMve2dhdGV3YXl9L2d1YXJkcmFpbHMve2d1YXJkcmFpbH0SFmd1YXJkcmFpbHMve2d1YXJkcmFpbH0ibQoOQ29udGVudFBhdHRlcm4SNAoEdHlwZRgBIAEoDjImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUGF0dGVyblR5cGUSDQoFdmFsdWUYAiABKAkSFgoOY2FzZV9zZW5zaXRpdmUYAyABKAgifAoWQ3JlYXRlR3VhcmRyYWlsUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSFAoMZ3VhcmRyYWlsX2lkGAIgASgJEjwKCWd1YXJkcmFpbBgDIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR3VhcmRyYWlsQgPgQQIiTQoTR2V0R3VhcmRyYWlsUmVxdWVzdBI2CgRuYW1lGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vR3VhcmRyYWlsInAKFUxpc3RHdWFyZHJhaWxzUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSEQoJcGFnZV9zaXplGAIgASgFEhIKCnBhZ2VfdG9rZW4YAyABKAkSDgoGZmlsdGVyGAQgASgJEhAKCG9yZGVyX2J5GAUgASgJIn8KFkxpc3RHdWFyZHJhaWxzUmVzcG9uc2USOAoKZ3VhcmRyYWlscxgBIAMoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR3VhcmRyYWlsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIocBChZVcGRhdGVHdWFyZHJhaWxSZXF1ZXN0EjwKCWd1YXJkcmFpbBgBIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR3VhcmRyYWlsQgPgQQISLwoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIlAKFkRlbGV0ZUd1YXJkcmFpbFJlcXVlc3QSNgoEbmFtZRgBIAEoCUIo4EEC+kEiCiBhaWdhdGV3YXkucmVkcGFuZGEuY29tL0d1YXJkcmFpbCqEAgoNR3VhcmRyYWlsVHlwZRIeChpHVUFSRFJBSUxfVFlQRV9VTlNQRUNJRklFRBAAEiAKHEdVQVJEUkFJTF9UWVBFX1BJSV9ERVRFQ1RJT04QARIgChxHVUFSRFJBSUxfVFlQRV9UT1hJQ19DT05URU5UEAISIwofR1VBUkRSQUlMX1RZUEVfUFJPTVBUX0lOSkVDVElPThADEiMKH0dVQVJEUkFJTF9UWVBFX1NFTlNJVElWRV9UT1BJQ1MQBBIfChtHVUFSRFJBSUxfVFlQRV9DVVNUT01fUkVHRVgQBRIkCiBHVUFSRFJBSUxfVFlQRV9LRVlXT1JEX0JMT0NLTElTVBAGKqIBCg9HdWFyZHJhaWxBY3Rpb24SIAocR1VBUkRSQUlMX0FDVElPTl9VTlNQRUNJRklFRBAAEhoKFkdVQVJEUkFJTF9BQ1RJT05fQkxPQ0sQARIbChdHVUFSRFJBSUxfQUNUSU9OX1JFREFDVBACEhgKFEdVQVJEUkFJTF9BQ1RJT05fTE9HEAMSGgoWR1VBUkRSQUlMX0FDVElPTl9BTEVSVBAEKngKC1BhdHRlcm5UeXBlEhwKGFBBVFRFUk5fVFlQRV9VTlNQRUNJRklFRBAAEhYKElBBVFRFUk5fVFlQRV9SRUdFWBABEhgKFFBBVFRFUk5fVFlQRV9LRVlXT1JEEAISGQoVUEFUVEVSTl9UWVBFX1dJTERDQVJEEAMy/gcKEEd1YXJkcmFpbFNlcnZpY2USzAEKD0NyZWF0ZUd1YXJkcmFpbBIxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlR3VhcmRyYWlsUmVxdWVzdBoyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlR3VhcmRyYWlsUmVzcG9uc2UiUoLT5JMCTDoJZ3VhcmRyYWlsWhs6CWd1YXJkcmFpbCIOL3YxL2d1YXJkcmFpbHMiIi92MS97cGFyZW50PWdhdGV3YXlzLyp9L2d1YXJkcmFpbHMStgEKDEdldEd1YXJkcmFpbBIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0R3VhcmRyYWlsUmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0R3VhcmRyYWlsUmVzcG9uc2UiRYLT5JMCP1oZEhcvdjEve25hbWU9Z3VhcmRyYWlscy8qfRIiL3YxL3tuYW1lPWdhdGV3YXlzLyovZ3VhcmRyYWlscy8qfRKzAQoOTGlzdEd1YXJkcmFpbHMSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RHdWFyZHJhaWxzUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdEd1YXJkcmFpbHNSZXNwb25zZSI8gtPkkwI2WhASDi92MS9ndWFyZHJhaWxzEiIvdjEve3BhcmVudD1nYXRld2F5cy8qfS9ndWFyZHJhaWxzEukBCg9VcGRhdGVHdWFyZHJhaWwSMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUd1YXJkcmFpbFJlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUd1YXJkcmFpbFJlc3BvbnNlIm+C0+STAmk6CWd1YXJkcmFpbFouOglndWFyZHJhaWwyIS92MS97Z3VhcmRyYWlsLm5hbWU9Z3VhcmRyYWlscy8qfTIsL3YxL3tndWFyZHJhaWwubmFtZT1nYXRld2F5cy8qL2d1YXJkcmFpbHMvKn0SvwEKD0RlbGV0ZUd1YXJkcmFpbBIxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlR3VhcmRyYWlsUmVxdWVzdBoyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlR3VhcmRyYWlsUmVzcG9uc2UiRYLT5JMCP1oZKhcvdjEve25hbWU9Z3VhcmRyYWlscy8qfSoiL3YxL3tuYW1lPWdhdGV3YXlzLyovZ3VhcmRyYWlscy8qfUKDAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCDkd1YXJkcmFpbFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateGuardrail RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateGuardrailResponse + */ +export type CreateGuardrailResponse = Message<"redpanda.api.aigateway.v1.CreateGuardrailResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Guardrail guardrail = 1; + */ + guardrail?: Guardrail; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateGuardrailResponse. + * Use `create(CreateGuardrailResponseSchema)` to create a new message. + */ +export const CreateGuardrailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 0); + +/** + * Response message for GetGuardrail RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetGuardrailResponse + */ +export type GetGuardrailResponse = Message<"redpanda.api.aigateway.v1.GetGuardrailResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Guardrail guardrail = 1; + */ + guardrail?: Guardrail; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetGuardrailResponse. + * Use `create(GetGuardrailResponseSchema)` to create a new message. + */ +export const GetGuardrailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 1); + +/** + * Response message for UpdateGuardrail RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateGuardrailResponse + */ +export type UpdateGuardrailResponse = Message<"redpanda.api.aigateway.v1.UpdateGuardrailResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Guardrail guardrail = 1; + */ + guardrail?: Guardrail; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateGuardrailResponse. + * Use `create(UpdateGuardrailResponseSchema)` to create a new message. + */ +export const UpdateGuardrailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 2); + +/** + * Response message for DeleteGuardrail RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteGuardrailResponse + */ +export type DeleteGuardrailResponse = Message<"redpanda.api.aigateway.v1.DeleteGuardrailResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteGuardrailResponse. + * Use `create(DeleteGuardrailResponseSchema)` to create a new message. + */ +export const DeleteGuardrailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 3); + +/** + * @generated from message redpanda.api.aigateway.v1.Guardrail + */ +export type Guardrail = Message<"redpanda.api.aigateway.v1.Guardrail"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * @generated from field: string description = 3; + */ + description: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.GuardrailType type = 4; + */ + type: GuardrailType; + + /** + * @generated from field: string match_expression = 5; + */ + matchExpression: string; + + /** + * @generated from field: repeated redpanda.api.aigateway.v1.ContentPattern patterns = 6; + */ + patterns: ContentPattern[]; + + /** + * @generated from field: redpanda.api.aigateway.v1.GuardrailAction action = 7; + */ + action: GuardrailAction; + + /** + * @generated from field: bool scan_request = 8; + */ + scanRequest: boolean; + + /** + * @generated from field: bool scan_response = 9; + */ + scanResponse: boolean; + + /** + * @generated from field: bool enabled = 10; + */ + enabled: boolean; + + /** + * @generated from field: map metadata = 11; + */ + metadata: { [key: string]: string }; + + /** + * @generated from field: google.protobuf.Timestamp create_time = 12; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 13; + */ + updateTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Guardrail. + * Use `create(GuardrailSchema)` to create a new message. + */ +export const GuardrailSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.ContentPattern + */ +export type ContentPattern = Message<"redpanda.api.aigateway.v1.ContentPattern"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.PatternType type = 1; + */ + type: PatternType; + + /** + * @generated from field: string value = 2; + */ + value: string; + + /** + * @generated from field: bool case_sensitive = 3; + */ + caseSensitive: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ContentPattern. + * Use `create(ContentPatternSchema)` to create a new message. + */ +export const ContentPatternSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateGuardrailRequest + */ +export type CreateGuardrailRequest = Message<"redpanda.api.aigateway.v1.CreateGuardrailRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: string guardrail_id = 2; + */ + guardrailId: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.Guardrail guardrail = 3; + */ + guardrail?: Guardrail; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateGuardrailRequest. + * Use `create(CreateGuardrailRequestSchema)` to create a new message. + */ +export const CreateGuardrailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.GetGuardrailRequest + */ +export type GetGuardrailRequest = Message<"redpanda.api.aigateway.v1.GetGuardrailRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetGuardrailRequest. + * Use `create(GetGuardrailRequestSchema)` to create a new message. + */ +export const GetGuardrailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.ListGuardrailsRequest + */ +export type ListGuardrailsRequest = Message<"redpanda.api.aigateway.v1.ListGuardrailsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListGuardrailsRequest. + * Use `create(ListGuardrailsRequestSchema)` to create a new message. + */ +export const ListGuardrailsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.ListGuardrailsResponse + */ +export type ListGuardrailsResponse = Message<"redpanda.api.aigateway.v1.ListGuardrailsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.Guardrail guardrails = 1; + */ + guardrails: Guardrail[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListGuardrailsResponse. + * Use `create(ListGuardrailsResponseSchema)` to create a new message. + */ +export const ListGuardrailsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateGuardrailRequest + */ +export type UpdateGuardrailRequest = Message<"redpanda.api.aigateway.v1.UpdateGuardrailRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Guardrail guardrail = 1; + */ + guardrail?: Guardrail; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateGuardrailRequest. + * Use `create(UpdateGuardrailRequestSchema)` to create a new message. + */ +export const UpdateGuardrailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 10); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteGuardrailRequest + */ +export type DeleteGuardrailRequest = Message<"redpanda.api.aigateway.v1.DeleteGuardrailRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteGuardrailRequest. + * Use `create(DeleteGuardrailRequestSchema)` to create a new message. + */ +export const DeleteGuardrailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_guardrail, 11); + +/** + * @generated from enum redpanda.api.aigateway.v1.GuardrailType + */ +export enum GuardrailType { + /** + * @generated from enum value: GUARDRAIL_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: GUARDRAIL_TYPE_PII_DETECTION = 1; + */ + PII_DETECTION = 1, + + /** + * @generated from enum value: GUARDRAIL_TYPE_TOXIC_CONTENT = 2; + */ + TOXIC_CONTENT = 2, + + /** + * @generated from enum value: GUARDRAIL_TYPE_PROMPT_INJECTION = 3; + */ + PROMPT_INJECTION = 3, + + /** + * @generated from enum value: GUARDRAIL_TYPE_SENSITIVE_TOPICS = 4; + */ + SENSITIVE_TOPICS = 4, + + /** + * @generated from enum value: GUARDRAIL_TYPE_CUSTOM_REGEX = 5; + */ + CUSTOM_REGEX = 5, + + /** + * @generated from enum value: GUARDRAIL_TYPE_KEYWORD_BLOCKLIST = 6; + */ + KEYWORD_BLOCKLIST = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.GuardrailType. + */ +export const GuardrailTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_guardrail, 0); + +/** + * @generated from enum redpanda.api.aigateway.v1.GuardrailAction + */ +export enum GuardrailAction { + /** + * @generated from enum value: GUARDRAIL_ACTION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: GUARDRAIL_ACTION_BLOCK = 1; + */ + BLOCK = 1, + + /** + * @generated from enum value: GUARDRAIL_ACTION_REDACT = 2; + */ + REDACT = 2, + + /** + * @generated from enum value: GUARDRAIL_ACTION_LOG = 3; + */ + LOG = 3, + + /** + * @generated from enum value: GUARDRAIL_ACTION_ALERT = 4; + */ + ALERT = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.GuardrailAction. + */ +export const GuardrailActionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_guardrail, 1); + +/** + * @generated from enum redpanda.api.aigateway.v1.PatternType + */ +export enum PatternType { + /** + * @generated from enum value: PATTERN_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: PATTERN_TYPE_REGEX = 1; + */ + REGEX = 1, + + /** + * @generated from enum value: PATTERN_TYPE_KEYWORD = 2; + */ + KEYWORD = 2, + + /** + * @generated from enum value: PATTERN_TYPE_WILDCARD = 3; + */ + WILDCARD = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.PatternType. + */ +export const PatternTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_guardrail, 2); + +/** + * @generated from service redpanda.api.aigateway.v1.GuardrailService + */ +export const GuardrailService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.CreateGuardrail + */ + createGuardrail: { + methodKind: "unary"; + input: typeof CreateGuardrailRequestSchema; + output: typeof CreateGuardrailResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.GetGuardrail + */ + getGuardrail: { + methodKind: "unary"; + input: typeof GetGuardrailRequestSchema; + output: typeof GetGuardrailResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.ListGuardrails + */ + listGuardrails: { + methodKind: "unary"; + input: typeof ListGuardrailsRequestSchema; + output: typeof ListGuardrailsResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.UpdateGuardrail + */ + updateGuardrail: { + methodKind: "unary"; + input: typeof UpdateGuardrailRequestSchema; + output: typeof UpdateGuardrailResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.GuardrailService.DeleteGuardrail + */ + deleteGuardrail: { + methodKind: "unary"; + input: typeof DeleteGuardrailRequestSchema; + output: typeof DeleteGuardrailResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_guardrail, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings-IAMSettingsService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings-IAMSettingsService_connectquery.ts new file mode 100644 index 0000000000..3a811f9e85 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings-IAMSettingsService_connectquery.ts @@ -0,0 +1,40 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/iam_settings.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { IAMSettingsService } from "./iam_settings_pb"; + +/** + * Gets a specific IAM setting by key. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting + */ +export const getIAMSetting = IAMSettingsService.method.getIAMSetting; + +/** + * Lists IAM settings, optionally filtered by category. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings + */ +export const listIAMSettings = IAMSettingsService.method.listIAMSettings; + +/** + * Updates an IAM setting. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting + */ +export const updateIAMSetting = IAMSettingsService.method.updateIAMSetting; + +/** + * Batch updates multiple IAM settings. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings + */ +export const batchUpdateIAMSettings = IAMSettingsService.method.batchUpdateIAMSettings; + +/** + * Deletes an IAM setting (resets to default). + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting + */ +export const deleteIAMSetting = IAMSettingsService.method.deleteIAMSetting; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings_pb.ts new file mode 100644 index 0000000000..513262a765 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/iam_settings_pb.ts @@ -0,0 +1,474 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/iam_settings.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp, Value } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/iam_settings.proto. + */ +export const file_redpanda_api_aigateway_v1_iam_settings: GenFile = /*@__PURE__*/ + fileDesc("CixyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL2lhbV9zZXR0aW5ncy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSKJAgoKSUFNU2V0dGluZxIQCgNrZXkYASABKAlCA+BBCBIqCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZUID4EECEhgKC2Rlc2NyaXB0aW9uGAMgASgJQgPgQQESRAoIY2F0ZWdvcnkYBCABKA4yLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklBTVNldHRpbmdDYXRlZ29yeUID4EECEhEKCXNlbnNpdGl2ZRgFIAEoCBI0Cgt1cGRhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgd1cGRhdGVyGAcgASgJQgPgQQMiKAoUR2V0SUFNU2V0dGluZ1JlcXVlc3QSEAoDa2V5GAEgASgJQgPgQQIiTwoVR2V0SUFNU2V0dGluZ1Jlc3BvbnNlEjYKB3NldHRpbmcYASABKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklBTVNldHRpbmciuAEKFkxpc3RJQU1TZXR0aW5nc1JlcXVlc3QSRAoIY2F0ZWdvcnkYASABKA4yLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklBTVNldHRpbmdDYXRlZ29yeUID4EEBEh4KEWluY2x1ZGVfc2Vuc2l0aXZlGAIgASgIQgPgQQESHwoJcGFnZV9zaXplGAMgASgFQgzgQQG6SAYaBBhkKAASFwoKcGFnZV90b2tlbhgEIAEoCUID4EEBIn8KF0xpc3RJQU1TZXR0aW5nc1Jlc3BvbnNlEjcKCHNldHRpbmdzGAEgAygLMiUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5JQU1TZXR0aW5nEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIlcKF1VwZGF0ZUlBTVNldHRpbmdSZXF1ZXN0EhAKA2tleRgBIAEoCUID4EECEioKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlQgPgQQIiUgoYVXBkYXRlSUFNU2V0dGluZ1Jlc3BvbnNlEjYKB3NldHRpbmcYASABKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklBTVNldHRpbmciYwodQmF0Y2hVcGRhdGVJQU1TZXR0aW5nc1JlcXVlc3QSQgoIc2V0dGluZ3MYASADKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklBTVNldHRpbmdVcGRhdGVCA+BBAiJQChBJQU1TZXR0aW5nVXBkYXRlEhAKA2tleRgBIAEoCUID4EECEioKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlQgPgQQIiWQoeQmF0Y2hVcGRhdGVJQU1TZXR0aW5nc1Jlc3BvbnNlEjcKCHNldHRpbmdzGAEgAygLMiUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5JQU1TZXR0aW5nIisKF0RlbGV0ZUlBTVNldHRpbmdSZXF1ZXN0EhAKA2tleRgBIAEoCUID4EECIhoKGERlbGV0ZUlBTVNldHRpbmdSZXNwb25zZSqGAgoSSUFNU2V0dGluZ0NhdGVnb3J5EiQKIElBTV9TRVRUSU5HX0NBVEVHT1JZX1VOU1BFQ0lGSUVEEAASIQodSUFNX1NFVFRJTkdfQ0FURUdPUllfU0VDVVJJVFkQARIfChtJQU1fU0VUVElOR19DQVRFR09SWV9PQVVUSDIQAhIdChlJQU1fU0VUVElOR19DQVRFR09SWV9PSURDEAMSHQoZSUFNX1NFVFRJTkdfQ0FURUdPUllfSldLUxAEEicKI0lBTV9TRVRUSU5HX0NBVEVHT1JZX0FDQ0VTU19DT05UUk9MEAUSHwobSUFNX1NFVFRJTkdfQ0FURUdPUllfU1lTVEVNEAYy0QYKEklBTVNldHRpbmdzU2VydmljZRKSAQoNR2V0SUFNU2V0dGluZxIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0SUFNU2V0dGluZ1JlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldElBTVNldHRpbmdSZXNwb25zZSIegtPkkwIYEhYvdjEvaWFtL3NldHRpbmdzL3trZXl9EpIBCg9MaXN0SUFNU2V0dGluZ3MSMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RJQU1TZXR0aW5nc1JlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RJQU1TZXR0aW5nc1Jlc3BvbnNlIhiC0+STAhISEC92MS9pYW0vc2V0dGluZ3MSngEKEFVwZGF0ZUlBTVNldHRpbmcSMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUlBTVNldHRpbmdSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVJQU1TZXR0aW5nUmVzcG9uc2UiIYLT5JMCGzoBKhoWL3YxL2lhbS9zZXR0aW5ncy97a2V5fRK2AQoWQmF0Y2hVcGRhdGVJQU1TZXR0aW5ncxI4LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQmF0Y2hVcGRhdGVJQU1TZXR0aW5nc1JlcXVlc3QaOS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkJhdGNoVXBkYXRlSUFNU2V0dGluZ3NSZXNwb25zZSIngtPkkwIhOgEqIhwvdjEvaWFtL3NldHRpbmdzOmJhdGNoVXBkYXRlEpsBChBEZWxldGVJQU1TZXR0aW5nEjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVJQU1TZXR0aW5nUmVxdWVzdBozLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlSUFNU2V0dGluZ1Jlc3BvbnNlIh6C0+STAhgqFi92MS9pYW0vc2V0dGluZ3Mve2tleX0aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21ChQIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQhBJYW1TZXR0aW5nc1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_protobuf_struct, file_google_protobuf_timestamp]); + +/** + * IAMSetting represents a single IAM configuration setting. + * + * @generated from message redpanda.api.aigateway.v1.IAMSetting + */ +export type IAMSetting = Message<"redpanda.api.aigateway.v1.IAMSetting"> & { + /** + * Setting key (e.g., "security.default_hash_algorithm") + * + * @generated from field: string key = 1; + */ + key: string; + + /** + * Setting value as JSON + * + * @generated from field: google.protobuf.Value value = 2; + */ + value?: Value; + + /** + * Human-readable description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Setting category + * + * @generated from field: redpanda.api.aigateway.v1.IAMSettingCategory category = 4; + */ + category: IAMSettingCategory; + + /** + * Whether this setting contains sensitive data (masked in UI) + * + * @generated from field: bool sensitive = 5; + */ + sensitive: boolean; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 6; + */ + updateTime?: Timestamp; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 7; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.IAMSetting. + * Use `create(IAMSettingSchema)` to create a new message. + */ +export const IAMSettingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 0); + +/** + * Request message for GetIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetIAMSettingRequest + */ +export type GetIAMSettingRequest = Message<"redpanda.api.aigateway.v1.GetIAMSettingRequest"> & { + /** + * Required: Setting key. + * + * @generated from field: string key = 1; + */ + key: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetIAMSettingRequest. + * Use `create(GetIAMSettingRequestSchema)` to create a new message. + */ +export const GetIAMSettingRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 1); + +/** + * Response message for GetIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetIAMSettingResponse + */ +export type GetIAMSettingResponse = Message<"redpanda.api.aigateway.v1.GetIAMSettingResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.IAMSetting setting = 1; + */ + setting?: IAMSetting; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetIAMSettingResponse. + * Use `create(GetIAMSettingResponseSchema)` to create a new message. + */ +export const GetIAMSettingResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 2); + +/** + * Request message for ListIAMSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListIAMSettingsRequest + */ +export type ListIAMSettingsRequest = Message<"redpanda.api.aigateway.v1.ListIAMSettingsRequest"> & { + /** + * Filter by category (optional) + * + * @generated from field: redpanda.api.aigateway.v1.IAMSettingCategory category = 1; + */ + category: IAMSettingCategory; + + /** + * Whether to include sensitive settings (values will be masked) + * + * @generated from field: bool include_sensitive = 2; + */ + includeSensitive: boolean; + + /** + * Maximum number of settings to return (max 100) + * + * @generated from field: int32 page_size = 3; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 4; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListIAMSettingsRequest. + * Use `create(ListIAMSettingsRequestSchema)` to create a new message. + */ +export const ListIAMSettingsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 3); + +/** + * Response message for ListIAMSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListIAMSettingsResponse + */ +export type ListIAMSettingsResponse = Message<"redpanda.api.aigateway.v1.ListIAMSettingsResponse"> & { + /** + * The list of settings + * + * @generated from field: repeated redpanda.api.aigateway.v1.IAMSetting settings = 1; + */ + settings: IAMSetting[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListIAMSettingsResponse. + * Use `create(ListIAMSettingsResponseSchema)` to create a new message. + */ +export const ListIAMSettingsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 4); + +/** + * Request message for UpdateIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateIAMSettingRequest + */ +export type UpdateIAMSettingRequest = Message<"redpanda.api.aigateway.v1.UpdateIAMSettingRequest"> & { + /** + * Required: Setting key. + * + * @generated from field: string key = 1; + */ + key: string; + + /** + * Required: New value. + * + * @generated from field: google.protobuf.Value value = 2; + */ + value?: Value; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateIAMSettingRequest. + * Use `create(UpdateIAMSettingRequestSchema)` to create a new message. + */ +export const UpdateIAMSettingRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 5); + +/** + * Response message for UpdateIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateIAMSettingResponse + */ +export type UpdateIAMSettingResponse = Message<"redpanda.api.aigateway.v1.UpdateIAMSettingResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.IAMSetting setting = 1; + */ + setting?: IAMSetting; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateIAMSettingResponse. + * Use `create(UpdateIAMSettingResponseSchema)` to create a new message. + */ +export const UpdateIAMSettingResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 6); + +/** + * Request message for BatchUpdateIAMSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest + */ +export type BatchUpdateIAMSettingsRequest = Message<"redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest"> & { + /** + * Settings to update + * + * @generated from field: repeated redpanda.api.aigateway.v1.IAMSettingUpdate settings = 1; + */ + settings: IAMSettingUpdate[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.BatchUpdateIAMSettingsRequest. + * Use `create(BatchUpdateIAMSettingsRequestSchema)` to create a new message. + */ +export const BatchUpdateIAMSettingsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 7); + +/** + * IAMSettingUpdate represents a single setting update in a batch. + * + * @generated from message redpanda.api.aigateway.v1.IAMSettingUpdate + */ +export type IAMSettingUpdate = Message<"redpanda.api.aigateway.v1.IAMSettingUpdate"> & { + /** + * Required: Setting key. + * + * @generated from field: string key = 1; + */ + key: string; + + /** + * Required: New value. + * + * @generated from field: google.protobuf.Value value = 2; + */ + value?: Value; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.IAMSettingUpdate. + * Use `create(IAMSettingUpdateSchema)` to create a new message. + */ +export const IAMSettingUpdateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 8); + +/** + * Response message for BatchUpdateIAMSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse + */ +export type BatchUpdateIAMSettingsResponse = Message<"redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse"> & { + /** + * Updated settings + * + * @generated from field: repeated redpanda.api.aigateway.v1.IAMSetting settings = 1; + */ + settings: IAMSetting[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.BatchUpdateIAMSettingsResponse. + * Use `create(BatchUpdateIAMSettingsResponseSchema)` to create a new message. + */ +export const BatchUpdateIAMSettingsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 9); + +/** + * Request message for DeleteIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteIAMSettingRequest + */ +export type DeleteIAMSettingRequest = Message<"redpanda.api.aigateway.v1.DeleteIAMSettingRequest"> & { + /** + * Required: Setting key. + * + * @generated from field: string key = 1; + */ + key: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteIAMSettingRequest. + * Use `create(DeleteIAMSettingRequestSchema)` to create a new message. + */ +export const DeleteIAMSettingRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 10); + +/** + * Response message for DeleteIAMSetting RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteIAMSettingResponse + */ +export type DeleteIAMSettingResponse = Message<"redpanda.api.aigateway.v1.DeleteIAMSettingResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteIAMSettingResponse. + * Use `create(DeleteIAMSettingResponseSchema)` to create a new message. + */ +export const DeleteIAMSettingResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_iam_settings, 11); + +/** + * IAMSettingCategory defines setting categories. + * + * @generated from enum redpanda.api.aigateway.v1.IAMSettingCategory + */ +export enum IAMSettingCategory { + /** + * @generated from enum value: IAM_SETTING_CATEGORY_UNSPECIFIED = 0; + */ + IAM_SETTING_CATEGORY_UNSPECIFIED = 0, + + /** + * Security settings (hash algorithms, password policies) + * + * @generated from enum value: IAM_SETTING_CATEGORY_SECURITY = 1; + */ + IAM_SETTING_CATEGORY_SECURITY = 1, + + /** + * OAuth2 settings (issuer, token lifetimes) + * + * @generated from enum value: IAM_SETTING_CATEGORY_OAUTH2 = 2; + */ + IAM_SETTING_CATEGORY_OAUTH2 = 2, + + /** + * OIDC settings (auto-provisioning, claim mappings) + * + * @generated from enum value: IAM_SETTING_CATEGORY_OIDC = 3; + */ + IAM_SETTING_CATEGORY_OIDC = 3, + + /** + * JWKS settings (key rotation) + * + * @generated from enum value: IAM_SETTING_CATEGORY_JWKS = 4; + */ + IAM_SETTING_CATEGORY_JWKS = 4, + + /** + * Access control settings (default policies) + * + * @generated from enum value: IAM_SETTING_CATEGORY_ACCESS_CONTROL = 5; + */ + IAM_SETTING_CATEGORY_ACCESS_CONTROL = 5, + + /** + * System settings (general configuration) + * + * @generated from enum value: IAM_SETTING_CATEGORY_SYSTEM = 6; + */ + IAM_SETTING_CATEGORY_SYSTEM = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.IAMSettingCategory. + */ +export const IAMSettingCategorySchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_iam_settings, 0); + +/** + * IAMSettingsService manages IAM-related system settings. + * Settings are stored as key-value pairs organized by category. + * Categories: security, oauth2, oidc, jwks, access_control, system + * + * @generated from service redpanda.api.aigateway.v1.IAMSettingsService + */ +export const IAMSettingsService: GenService<{ + /** + * Gets a specific IAM setting by key. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.GetIAMSetting + */ + getIAMSetting: { + methodKind: "unary"; + input: typeof GetIAMSettingRequestSchema; + output: typeof GetIAMSettingResponseSchema; + }, + /** + * Lists IAM settings, optionally filtered by category. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.ListIAMSettings + */ + listIAMSettings: { + methodKind: "unary"; + input: typeof ListIAMSettingsRequestSchema; + output: typeof ListIAMSettingsResponseSchema; + }, + /** + * Updates an IAM setting. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.UpdateIAMSetting + */ + updateIAMSetting: { + methodKind: "unary"; + input: typeof UpdateIAMSettingRequestSchema; + output: typeof UpdateIAMSettingResponseSchema; + }, + /** + * Batch updates multiple IAM settings. + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.BatchUpdateIAMSettings + */ + batchUpdateIAMSettings: { + methodKind: "unary"; + input: typeof BatchUpdateIAMSettingsRequestSchema; + output: typeof BatchUpdateIAMSettingsResponseSchema; + }, + /** + * Deletes an IAM setting (resets to default). + * + * @generated from rpc redpanda.api.aigateway.v1.IAMSettingsService.DeleteIAMSetting + */ + deleteIAMSetting: { + methodKind: "unary"; + input: typeof DeleteIAMSettingRequestSchema; + output: typeof DeleteIAMSettingResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_iam_settings, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools-MCPToolsService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools-MCPToolsService_connectquery.ts new file mode 100644 index 0000000000..d65f94f2da --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools-MCPToolsService_connectquery.ts @@ -0,0 +1,12 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/mcp_tools.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { MCPToolsService } from "./mcp_tools_pb"; + +/** + * ListMCPTools returns the list of tools available in a gateway + * + * @generated from rpc redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools + */ +export const listMCPTools = MCPToolsService.method.listMCPTools; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools_pb.ts new file mode 100644 index 0000000000..bb32387bf5 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/mcp_tools_pb.ts @@ -0,0 +1,139 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/mcp_tools.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/mcp_tools.proto. + */ +export const file_redpanda_api_aigateway_v1_mcp_tools: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL21jcF90b29scy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSLJAQoTTGlzdE1DUFRvb2xzUmVxdWVzdBJaCgxnYXRld2F5X25hbWUYASABKAlCROBBAvpBIAoeYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9HYXRld2F5ukgbchkQATIVXmdhdGV3YXlzL1thLXowLTktXSskEhgKBnNlYXJjaBgCIAEoCUIIukgFcgMYgAISPAoIY2F0ZWdvcnkYAyABKAlCKrpIJ3IlUgBSBGZpbGVSA3dlYlIEY29kZVIIZGF0YWJhc2VSBnN5c3RlbSJJChRMaXN0TUNQVG9vbHNSZXNwb25zZRIxCgV0b29scxgBIAMoCzIiLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTUNQVG9vbCKCAQoHTUNQVG9vbBIbCgRuYW1lGAEgASgJQg3gQQK6SAdyBRABGIACEh0KC2Rlc2NyaXB0aW9uGAIgASgJQgi6SAVyAxiACBIgCgxpbnB1dF9zY2hlbWEYAyABKAlCCuBBArpIBHICEAESGQoIY2F0ZWdvcnkYBCABKAlCB7pIBHICGEAytAEKD01DUFRvb2xzU2VydmljZRKgAQoMTGlzdE1DUFRvb2xzEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0TUNQVG9vbHNSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0TUNQVG9vbHNSZXNwb25zZSIvgtPkkwIpEicvdjEve2dhdGV3YXlfbmFtZT1nYXRld2F5cy8qfS9tY3AtdG9vbHNCggIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQg1NY3BUb29sc1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource]); + +/** + * Request message for ListMCPTools + * + * @generated from message redpanda.api.aigateway.v1.ListMCPToolsRequest + */ +export type ListMCPToolsRequest = Message<"redpanda.api.aigateway.v1.ListMCPToolsRequest"> & { + /** + * Gateway resource name (format: gateways/{gateway_id}) + * The gateway must have MCP orchestration configured + * + * @generated from field: string gateway_name = 1; + */ + gatewayName: string; + + /** + * Optional search query to filter tools by name or description + * + * @generated from field: string search = 2; + */ + search: string; + + /** + * Optional category filter (e.g., "file", "web", "code", "database", "system") + * + * @generated from field: string category = 3; + */ + category: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListMCPToolsRequest. + * Use `create(ListMCPToolsRequestSchema)` to create a new message. + */ +export const ListMCPToolsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_mcp_tools, 0); + +/** + * Response message for ListMCPTools + * + * @generated from message redpanda.api.aigateway.v1.ListMCPToolsResponse + */ +export type ListMCPToolsResponse = Message<"redpanda.api.aigateway.v1.ListMCPToolsResponse"> & { + /** + * List of MCP tools available in the gateway + * + * @generated from field: repeated redpanda.api.aigateway.v1.MCPTool tools = 1; + */ + tools: MCPTool[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListMCPToolsResponse. + * Use `create(ListMCPToolsResponseSchema)` to create a new message. + */ +export const ListMCPToolsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_mcp_tools, 1); + +/** + * MCPTool represents a tool available via the Model Context Protocol + * + * @generated from message redpanda.api.aigateway.v1.MCPTool + */ +export type MCPTool = Message<"redpanda.api.aigateway.v1.MCPTool"> & { + /** + * Unique identifier for the tool (e.g., "read_file", "search_web") + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable description of what the tool does + * + * @generated from field: string description = 2; + */ + description: string; + + /** + * JSON Schema defining the tool's input parameters as a JSON string + * This is the inputSchema from the MCP specification + * + * @generated from field: string input_schema = 3; + */ + inputSchema: string; + + /** + * Optional category for filtering/grouping (e.g., "file", "web", "code") + * + * @generated from field: string category = 4; + */ + category: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.MCPTool. + * Use `create(MCPToolSchema)` to create a new message. + */ +export const MCPToolSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_mcp_tools, 2); + +/** + * MCPToolsService provides access to MCP (Model Context Protocol) tools + * available in a gateway. This service proxies the tools/list call to the + * MCP Gateway and returns the available tools with their schemas. + * + * @generated from service redpanda.api.aigateway.v1.MCPToolsService + */ +export const MCPToolsService: GenService<{ + /** + * ListMCPTools returns the list of tools available in a gateway + * + * @generated from rpc redpanda.api.aigateway.v1.MCPToolsService.ListMCPTools + */ + listMCPTools: { + methodKind: "unary"; + input: typeof ListMCPToolsRequestSchema; + output: typeof ListMCPToolsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_mcp_tools, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery.ts new file mode 100644 index 0000000000..94215389c6 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery.ts @@ -0,0 +1,34 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/model_providers.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { ModelProvidersService } from "./model_providers_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider + */ +export const getModelProvider = ModelProvidersService.method.getModelProvider; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders + */ +export const listModelProviders = ModelProvidersService.method.listModelProviders; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider + */ +export const updateModelProvider = ModelProvidersService.method.updateModelProvider; + +/** + * Enable a provider for routing (does NOT auto-enable its models) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider + */ +export const enableModelProvider = ModelProvidersService.method.enableModelProvider; + +/** + * Disable a provider (cascade-disables ALL its models) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider + */ +export const disableModelProvider = ModelProvidersService.method.disableModelProvider; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers_pb.ts new file mode 100644 index 0000000000..8669de412a --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/model_providers_pb.ts @@ -0,0 +1,488 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/model_providers.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { AuthType, PathRewrite } from "./backend_pool_pb"; +import { file_redpanda_api_aigateway_v1_backend_pool } from "./backend_pool_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/model_providers.proto. + */ +export const file_redpanda_api_aigateway_v1_model_providers: GenFile = /*@__PURE__*/ + fileDesc("Ci9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL21vZGVsX3Byb3ZpZGVycy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSKIBQoNTW9kZWxQcm92aWRlchIRCgRuYW1lGAEgASgJQgPgQQgSGQoMZGlzcGxheV9uYW1lGAIgASgJQgPgQQISEwoLZGVzY3JpcHRpb24YAyABKAkSEwoLd2Vic2l0ZV91cmwYBCABKAkSEAoIbG9nb191cmwYBSABKAkSDwoHZW5hYmxlZBgGIAEoCBIUCgxoZWFkcXVhcnRlcnMYCyABKAkSEwoLZGF0YV9wb2xpY3kYDCABKAkSFgoOY2VydGlmaWNhdGlvbnMYDSADKAkSGwoTZGF0YV9yZXRlbnRpb25fZGF5cxgOIAEoBRITCgtkYXRhX3JlZ2lvbhgPIAMoCRIQCghiYXNlX3VybBgQIAEoCRI2CglhdXRoX3R5cGUYESABKA4yIy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkF1dGhUeXBlEhUKDW9wZW5haV9uYXRpdmUYFCABKAgSRAoNb3BlbmFpX2NvbXBhdBgVIAEoCzItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3BlbkFJQ29tcGF0Q29uZmlnEjQKC2NyZWF0ZV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEhQKB2NyZWF0b3IYCSABKAlCA+BBAxIUCgd1cGRhdGVyGAogASgJQgPgQQM6SOpBRQokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbFByb3ZpZGVyEh1tb2RlbF9wcm92aWRlcnMve3Byb3ZpZGVyX2lkfSJVChdHZXRNb2RlbFByb3ZpZGVyUmVxdWVzdBI6CgRuYW1lGAEgASgJQizgQQL6QSYKJGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vTW9kZWxQcm92aWRlciJcChhHZXRNb2RlbFByb3ZpZGVyUmVzcG9uc2USQAoObW9kZWxfcHJvdmlkZXIYASABKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk1vZGVsUHJvdmlkZXIiUgoZTGlzdE1vZGVsUHJvdmlkZXJzUmVxdWVzdBIRCglwYWdlX3NpemUYASABKAUSEgoKcGFnZV90b2tlbhgCIAEoCRIOCgZmaWx0ZXIYAyABKAkijAEKGkxpc3RNb2RlbFByb3ZpZGVyc1Jlc3BvbnNlEkEKD21vZGVsX3Byb3ZpZGVycxgBIAMoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWxQcm92aWRlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKUAQoaVXBkYXRlTW9kZWxQcm92aWRlclJlcXVlc3QSRQoObW9kZWxfcHJvdmlkZXIYASABKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk1vZGVsUHJvdmlkZXJCA+BBAhIvCgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siXwobVXBkYXRlTW9kZWxQcm92aWRlclJlc3BvbnNlEkAKDm1vZGVsX3Byb3ZpZGVyGAEgASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbFByb3ZpZGVyIlgKGkVuYWJsZU1vZGVsUHJvdmlkZXJSZXF1ZXN0EjoKBG5hbWUYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbFByb3ZpZGVyIl8KG0VuYWJsZU1vZGVsUHJvdmlkZXJSZXNwb25zZRJACg5tb2RlbF9wcm92aWRlchgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWxQcm92aWRlciJZChtEaXNhYmxlTW9kZWxQcm92aWRlclJlcXVlc3QSOgoEbmFtZRgBIAEoCUIs4EEC+kEmCiRhaWdhdGV3YXkucmVkcGFuZGEuY29tL01vZGVsUHJvdmlkZXIifwocRGlzYWJsZU1vZGVsUHJvdmlkZXJSZXNwb25zZRJACg5tb2RlbF9wcm92aWRlchgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWxQcm92aWRlchIdChVkaXNhYmxlZF9tb2RlbHNfY291bnQYAiABKAUirQIKEk9wZW5BSUNvbXBhdENvbmZpZxIaChJyZXF1ZXN0X3RyYW5zZm9ybXMYASADKAkSGwoTcmVzcG9uc2VfdHJhbnNmb3JtcxgCIAMoCRI8CgxwYXRoX3Jld3JpdGUYAyABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlBhdGhSZXdyaXRlEhMKC2F1dGhfaGVhZGVyGAQgASgJElYKDWV4dHJhX2hlYWRlcnMYBSADKAsyPy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9wZW5BSUNvbXBhdENvbmZpZy5FeHRyYUhlYWRlcnNFbnRyeRozChFFeHRyYUhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBMpoHChVNb2RlbFByb3ZpZGVyc1NlcnZpY2USoQEKEEdldE1vZGVsUHJvdmlkZXISMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldE1vZGVsUHJvdmlkZXJSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRNb2RlbFByb3ZpZGVyUmVzcG9uc2UiJILT5JMCHhIcL3YxL3tuYW1lPW1vZGVsX3Byb3ZpZGVycy8qfRKeAQoSTGlzdE1vZGVsUHJvdmlkZXJzEjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0TW9kZWxQcm92aWRlcnNSZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0TW9kZWxQcm92aWRlcnNSZXNwb25zZSIbgtPkkwIVEhMvdjEvbW9kZWxfcHJvdmlkZXJzEskBChNVcGRhdGVNb2RlbFByb3ZpZGVyEjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVNb2RlbFByb3ZpZGVyUmVxdWVzdBo2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlTW9kZWxQcm92aWRlclJlc3BvbnNlIkOC0+STAj06Dm1vZGVsX3Byb3ZpZGVyMisvdjEve21vZGVsX3Byb3ZpZGVyLm5hbWU9bW9kZWxfcHJvdmlkZXJzLyp9ErQBChNFbmFibGVNb2RlbFByb3ZpZGVyEjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5FbmFibGVNb2RlbFByb3ZpZGVyUmVxdWVzdBo2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRW5hYmxlTW9kZWxQcm92aWRlclJlc3BvbnNlIi6C0+STAig6ASoiIy92MS97bmFtZT1tb2RlbF9wcm92aWRlcnMvKn06ZW5hYmxlErgBChREaXNhYmxlTW9kZWxQcm92aWRlchI2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGlzYWJsZU1vZGVsUHJvdmlkZXJSZXF1ZXN0GjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EaXNhYmxlTW9kZWxQcm92aWRlclJlc3BvbnNlIi+C0+STAik6ASoiJC92MS97bmFtZT1tb2RlbF9wcm92aWRlcnMvKn06ZGlzYWJsZUKIAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCE01vZGVsUHJvdmlkZXJzUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp, file_redpanda_api_aigateway_v1_backend_pool]); + +/** + * ModelProvider represents an LLM provider (e.g., OpenAI, Anthropic). + * Providers are seeded by migrations and cannot be created/deleted via API. + * + * @generated from message redpanda.api.aigateway.v1.ModelProvider + */ +export type ModelProvider = Message<"redpanda.api.aigateway.v1.ModelProvider"> & { + /** + * Resource name: model_providers/{id} + * Example: model_providers/openai + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Display name for UI + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Provider description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Provider website URL + * + * @generated from field: string website_url = 4; + */ + websiteUrl: string; + + /** + * Provider logo URL + * + * @generated from field: string logo_url = 5; + */ + logoUrl: string; + + /** + * Enable/disable toggle for routing + * When false, all models from this provider are effectively disabled + * + * @generated from field: bool enabled = 6; + */ + enabled: boolean; + + /** + * Country code where provider is headquartered (e.g., "US", "FR", "CA") + * + * @generated from field: string headquarters = 11; + */ + headquarters: string; + + /** + * Data training policy: + * - "never": Provider never trains on customer data + * - "opt-out": Training can be disabled via provider settings + * - "always": Provider may use data for training + * + * @generated from field: string data_policy = 12; + */ + dataPolicy: string; + + /** + * Compliance certifications (e.g., "SOC2", "GDPR", "HIPAA", "ISO27001") + * + * @generated from field: repeated string certifications = 13; + */ + certifications: string[]; + + /** + * Data retention period in days (0 = no retention, -1 = unknown) + * + * @generated from field: int32 data_retention_days = 14; + */ + dataRetentionDays: number; + + /** + * Data processing region(s) (e.g., "US", "EU", "APAC") + * + * @generated from field: repeated string data_region = 15; + */ + dataRegion: string[]; + + /** + * Base URL for API requests (e.g., "https://api.openai.com") + * + * @generated from field: string base_url = 16; + */ + baseUrl: string; + + /** + * Authentication type used by this provider + * + * @generated from field: redpanda.api.aigateway.v1.AuthType auth_type = 17; + */ + authType: AuthType; + + /** + * True if provider natively uses OpenAI-compatible API format + * (e.g., OpenAI, Mistral, Groq, Together, Fireworks, DeepSeek, Cerebras) + * + * @generated from field: bool openai_native = 20; + */ + openaiNative: boolean; + + /** + * OpenAI compatibility configuration for non-native providers. + * Only populated for providers where transforms have been implemented. + * null/empty means transforms are not available for this provider. + * + * @generated from field: redpanda.api.aigateway.v1.OpenAICompatConfig openai_compat = 21; + */ + openaiCompat?: OpenAICompatConfig; + + /** + * Audit fields + * + * @generated from field: google.protobuf.Timestamp create_time = 7; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 8; + */ + updateTime?: Timestamp; + + /** + * @generated from field: string creator = 9; + */ + creator: string; + + /** + * @generated from field: string updater = 10; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ModelProvider. + * Use `create(ModelProviderSchema)` to create a new message. + */ +export const ModelProviderSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 0); + +/** + * @generated from message redpanda.api.aigateway.v1.GetModelProviderRequest + */ +export type GetModelProviderRequest = Message<"redpanda.api.aigateway.v1.GetModelProviderRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetModelProviderRequest. + * Use `create(GetModelProviderRequestSchema)` to create a new message. + */ +export const GetModelProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 1); + +/** + * @generated from message redpanda.api.aigateway.v1.GetModelProviderResponse + */ +export type GetModelProviderResponse = Message<"redpanda.api.aigateway.v1.GetModelProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ModelProvider model_provider = 1; + */ + modelProvider?: ModelProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetModelProviderResponse. + * Use `create(GetModelProviderResponseSchema)` to create a new message. + */ +export const GetModelProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 2); + +/** + * @generated from message redpanda.api.aigateway.v1.ListModelProvidersRequest + */ +export type ListModelProvidersRequest = Message<"redpanda.api.aigateway.v1.ListModelProvidersRequest"> & { + /** + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 2; + */ + pageToken: string; + + /** + * AIP-160 filter expression. + * Supported fields: provider_id, enabled, display_name + * Examples: + * - enabled = "true" + * - provider_id = "openai" + * - display_name = "Anthropic" + * + * @generated from field: string filter = 3; + */ + filter: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListModelProvidersRequest. + * Use `create(ListModelProvidersRequestSchema)` to create a new message. + */ +export const ListModelProvidersRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 3); + +/** + * @generated from message redpanda.api.aigateway.v1.ListModelProvidersResponse + */ +export type ListModelProvidersResponse = Message<"redpanda.api.aigateway.v1.ListModelProvidersResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.ModelProvider model_providers = 1; + */ + modelProviders: ModelProvider[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListModelProvidersResponse. + * Use `create(ListModelProvidersResponseSchema)` to create a new message. + */ +export const ListModelProvidersResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateModelProviderRequest + */ +export type UpdateModelProviderRequest = Message<"redpanda.api.aigateway.v1.UpdateModelProviderRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ModelProvider model_provider = 1; + */ + modelProvider?: ModelProvider; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateModelProviderRequest. + * Use `create(UpdateModelProviderRequestSchema)` to create a new message. + */ +export const UpdateModelProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateModelProviderResponse + */ +export type UpdateModelProviderResponse = Message<"redpanda.api.aigateway.v1.UpdateModelProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ModelProvider model_provider = 1; + */ + modelProvider?: ModelProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateModelProviderResponse. + * Use `create(UpdateModelProviderResponseSchema)` to create a new message. + */ +export const UpdateModelProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.EnableModelProviderRequest + */ +export type EnableModelProviderRequest = Message<"redpanda.api.aigateway.v1.EnableModelProviderRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EnableModelProviderRequest. + * Use `create(EnableModelProviderRequestSchema)` to create a new message. + */ +export const EnableModelProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.EnableModelProviderResponse + */ +export type EnableModelProviderResponse = Message<"redpanda.api.aigateway.v1.EnableModelProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ModelProvider model_provider = 1; + */ + modelProvider?: ModelProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EnableModelProviderResponse. + * Use `create(EnableModelProviderResponseSchema)` to create a new message. + */ +export const EnableModelProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.DisableModelProviderRequest + */ +export type DisableModelProviderRequest = Message<"redpanda.api.aigateway.v1.DisableModelProviderRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableModelProviderRequest. + * Use `create(DisableModelProviderRequestSchema)` to create a new message. + */ +export const DisableModelProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DisableModelProviderResponse + */ +export type DisableModelProviderResponse = Message<"redpanda.api.aigateway.v1.DisableModelProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ModelProvider model_provider = 1; + */ + modelProvider?: ModelProvider; + + /** + * Number of models that were cascade-disabled + * + * @generated from field: int32 disabled_models_count = 2; + */ + disabledModelsCount: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableModelProviderResponse. + * Use `create(DisableModelProviderResponseSchema)` to create a new message. + */ +export const DisableModelProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 10); + +/** + * OpenAI compatibility configuration for non-native providers. + * When a provider pool has this config applied, requests in OpenAI format + * are automatically transformed to the provider's native format. + * + * @generated from message redpanda.api.aigateway.v1.OpenAICompatConfig + */ +export type OpenAICompatConfig = Message<"redpanda.api.aigateway.v1.OpenAICompatConfig"> & { + /** + * Request transforms to apply (e.g., ["strip_model_prefix", "openai_to_anthropic"]) + * + * @generated from field: repeated string request_transforms = 1; + */ + requestTransforms: string[]; + + /** + * Response transforms to apply (e.g., ["anthropic_to_openai"]) + * + * @generated from field: repeated string response_transforms = 2; + */ + responseTransforms: string[]; + + /** + * Path rewrite configuration for providers that don't use /v1/chat/completions + * + * @generated from field: redpanda.api.aigateway.v1.PathRewrite path_rewrite = 3; + */ + pathRewrite?: PathRewrite; + + /** + * Auth header name override (e.g., "x-api-key" for Anthropic). + * If empty, uses default "Authorization" with "Bearer " prefix. + * + * @generated from field: string auth_header = 4; + */ + authHeader: string; + + /** + * Extra headers to include with every request (e.g., anthropic-version) + * + * @generated from field: map extra_headers = 5; + */ + extraHeaders: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OpenAICompatConfig. + * Use `create(OpenAICompatConfigSchema)` to create a new message. + */ +export const OpenAICompatConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_model_providers, 11); + +/** + * ModelProvidersService manages LLM provider configurations. + * Providers are seeded by migrations; this service allows enabling/disabling + * and updating provider metadata. Disabling a provider will cascade-disable + * all its models. + * + * @generated from service redpanda.api.aigateway.v1.ModelProvidersService + */ +export const ModelProvidersService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.GetModelProvider + */ + getModelProvider: { + methodKind: "unary"; + input: typeof GetModelProviderRequestSchema; + output: typeof GetModelProviderResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.ListModelProviders + */ + listModelProviders: { + methodKind: "unary"; + input: typeof ListModelProvidersRequestSchema; + output: typeof ListModelProvidersResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.UpdateModelProvider + */ + updateModelProvider: { + methodKind: "unary"; + input: typeof UpdateModelProviderRequestSchema; + output: typeof UpdateModelProviderResponseSchema; + }, + /** + * Enable a provider for routing (does NOT auto-enable its models) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.EnableModelProvider + */ + enableModelProvider: { + methodKind: "unary"; + input: typeof EnableModelProviderRequestSchema; + output: typeof EnableModelProviderResponseSchema; + }, + /** + * Disable a provider (cascade-disables ALL its models) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelProvidersService.DisableModelProvider + */ + disableModelProvider: { + methodKind: "unary"; + input: typeof DisableModelProviderRequestSchema; + output: typeof DisableModelProviderResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_model_providers, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery.ts new file mode 100644 index 0000000000..600887ba9a --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery.ts @@ -0,0 +1,51 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/models.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { ModelsService } from "./models_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.CreateModel + */ +export const createModel = ModelsService.method.createModel; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.GetModel + */ +export const getModel = ModelsService.method.getModel; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.ListModels + */ +export const listModels = ModelsService.method.listModels; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.UpdateModel + */ +export const updateModel = ModelsService.method.updateModel; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.DeleteModel + */ +export const deleteModel = ModelsService.method.deleteModel; + +/** + * Enable a model for routing + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.EnableModel + */ +export const enableModel = ModelsService.method.enableModel; + +/** + * Disable a model (generates 0 req/s rate limit) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.DisableModel + */ +export const disableModel = ModelsService.method.disableModel; + +/** + * List all disabled models (for generating rate limit rules) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.ListDisabledModels + */ +export const listDisabledModels = ModelsService.method.listDisabledModels; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/models_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/models_pb.ts new file mode 100644 index 0000000000..4e42fb5d5b --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/models_pb.ts @@ -0,0 +1,549 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/models.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/models.proto. + */ +export const file_redpanda_api_aigateway_v1_models: GenFile = /*@__PURE__*/ + fileDesc("CiZyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL21vZGVscy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSK6BAoFTW9kZWwSEQoEbmFtZRgBIAEoCUID4EEIEhkKDGRpc3BsYXlfbmFtZRgCIAEoCUID4EECEhgKC21vZGVsX293bmVyGAMgASgJQgPgQQISFQoIbW9kZWxfaWQYBCABKAlCA+BBAhIVCghwcm92aWRlchgOIAEoCUID4EECEh4KEXByb3ZpZGVyX21vZGVsX2lkGA8gASgJQgPgQQISFwoKbW9kYWxpdGllcxgFIAMoCUID4EECEhYKDmNvbnRleHRfd2luZG93GAYgASgFEhMKC2Rlc2NyaXB0aW9uGAcgASgJEkAKCG1ldGFkYXRhGAggAygLMi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbC5NZXRhZGF0YUVudHJ5EhQKB2VuYWJsZWQYCSABKAhCA+BBAhI0CgtjcmVhdGVfdGltZRgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGAwgASgJQgPgQQMSFAoHdXBkYXRlchgNIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATo06kExChxhaWdhdGV3YXkucmVkcGFuZGEuY29tL01vZGVsEhFtb2RlbHMve21vZGVsX2lkfSJcChJDcmVhdGVNb2RlbFJlcXVlc3QSEAoIbW9kZWxfaWQYASABKAkSNAoFbW9kZWwYAiABKAsyIC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk1vZGVsQgPgQQIiRgoTQ3JlYXRlTW9kZWxSZXNwb25zZRIvCgVtb2RlbBgBIAEoCzIgLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWwiRQoPR2V0TW9kZWxSZXF1ZXN0EjIKBG5hbWUYASABKAlCJOBBAvpBHgocYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbCJDChBHZXRNb2RlbFJlc3BvbnNlEi8KBW1vZGVsGAEgASgLMiAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbCJcChFMaXN0TW9kZWxzUmVxdWVzdBIRCglwYWdlX3NpemUYASABKAUSEgoKcGFnZV90b2tlbhgCIAEoCRIOCgZmaWx0ZXIYAyABKAkSEAoIb3JkZXJfYnkYBCABKAkicwoSTGlzdE1vZGVsc1Jlc3BvbnNlEjAKBm1vZGVscxgBIAMoCzIgLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWwSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUiewoSVXBkYXRlTW9kZWxSZXF1ZXN0EjQKBW1vZGVsGAEgASgLMiAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbEID4EECEi8KC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayJGChNVcGRhdGVNb2RlbFJlc3BvbnNlEi8KBW1vZGVsGAEgASgLMiAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbCJIChJEZWxldGVNb2RlbFJlcXVlc3QSMgoEbmFtZRgBIAEoCUIk4EEC+kEeChxhaWdhdGV3YXkucmVkcGFuZGEuY29tL01vZGVsIhUKE0RlbGV0ZU1vZGVsUmVzcG9uc2UiSAoSRW5hYmxlTW9kZWxSZXF1ZXN0EjIKBG5hbWUYASABKAlCJOBBAvpBHgocYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbCJGChNFbmFibGVNb2RlbFJlc3BvbnNlEi8KBW1vZGVsGAEgASgLMiAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Nb2RlbCJJChNEaXNhYmxlTW9kZWxSZXF1ZXN0EjIKBG5hbWUYASABKAlCJOBBAvpBHgocYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbCJHChREaXNhYmxlTW9kZWxSZXNwb25zZRIvCgVtb2RlbBgBIAEoCzIgLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTW9kZWwiQgoZTGlzdERpc2FibGVkTW9kZWxzUmVxdWVzdBIRCglwYWdlX3NpemUYASABKAUSEgoKcGFnZV90b2tlbhgCIAEoCSJ7ChpMaXN0RGlzYWJsZWRNb2RlbHNSZXNwb25zZRIwCgZtb2RlbHMYASADKAsyIC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk1vZGVsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFMpUJCg1Nb2RlbHNTZXJ2aWNlEocBCgtDcmVhdGVNb2RlbBItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlTW9kZWxSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVNb2RlbFJlc3BvbnNlIhmC0+STAhM6BW1vZGVsIgovdjEvbW9kZWxzEoABCghHZXRNb2RlbBIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0TW9kZWxSZXF1ZXN0GisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRNb2RlbFJlc3BvbnNlIhuC0+STAhUSEy92MS97bmFtZT1tb2RlbHMvKn0SfQoKTGlzdE1vZGVscxIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdE1vZGVsc1JlcXVlc3QaLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RNb2RlbHNSZXNwb25zZSISgtPkkwIMEgovdjEvbW9kZWxzEpYBCgtVcGRhdGVNb2RlbBItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlTW9kZWxSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVNb2RlbFJlc3BvbnNlIiiC0+STAiI6BW1vZGVsMhkvdjEve21vZGVsLm5hbWU9bW9kZWxzLyp9EokBCgtEZWxldGVNb2RlbBItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlTW9kZWxSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVNb2RlbFJlc3BvbnNlIhuC0+STAhUqEy92MS97bmFtZT1tb2RlbHMvKn0SkwEKC0VuYWJsZU1vZGVsEi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5FbmFibGVNb2RlbFJlcXVlc3QaLi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkVuYWJsZU1vZGVsUmVzcG9uc2UiJYLT5JMCHzoBKiIaL3YxL3tuYW1lPW1vZGVscy8qfTplbmFibGUSlwEKDERpc2FibGVNb2RlbBIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGlzYWJsZU1vZGVsUmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGlzYWJsZU1vZGVsUmVzcG9uc2UiJoLT5JMCIDoBKiIbL3YxL3tuYW1lPW1vZGVscy8qfTpkaXNhYmxlEqIBChJMaXN0RGlzYWJsZWRNb2RlbHMSNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3REaXNhYmxlZE1vZGVsc1JlcXVlc3QaNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3REaXNhYmxlZE1vZGVsc1Jlc3BvbnNlIh+C0+STAhkSFy92MS9tb2RlbHM6bGlzdERpc2FibGVkQoACCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUILTW9kZWxzUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Model represents an LLM model in the catalog. + * Models exist independently of pricing and can be enabled/disabled for routing. + * + * @generated from message redpanda.api.aigateway.v1.Model + */ +export type Model = Message<"redpanda.api.aigateway.v1.Model"> & { + /** + * Resource name format: + * - Direct access: models/{model_owner}/{model_id} (e.g., models/anthropic/claude-3-5-sonnet) + * - Hosted provider: models/{model_owner}/{model_id}/{provider} (e.g., models/anthropic/claude-3-5-sonnet/aws-bedrock) + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Display name for UI + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Model identification + * model_owner: The company that created/owns the model (e.g., "openai", "anthropic", "google", "meta") + * This is distinct from hosting providers (Azure, AWS Bedrock) which are configured separately. + * + * @generated from field: string model_owner = 3; + */ + modelOwner: string; + + /** + * e.g., "gpt-4o", "claude-3-5-sonnet" + * + * @generated from field: string model_id = 4; + */ + modelId: string; + + /** + * Hosting provider - the service hosting this model + * Always populated. For direct API access, provider equals model_owner. + * Examples: "anthropic", "openai" (direct), "aws-bedrock", "azure", "google-vertex" (hosted) + * + * @generated from field: string provider = 14; + */ + provider: string; + + /** + * Provider-specific model identifier - the actual model ID to use when calling the provider's API. + * Always populated. For direct access, equals model_id. For hosted providers, this is the + * provider-specific ID (e.g., "anthropic.claude-3-5-sonnet-20241022-v2:0" for AWS Bedrock). + * + * @generated from field: string provider_model_id = 15; + */ + providerModelId: string; + + /** + * Modalities that this model supports - array for multimodal models + * Examples: ["chat"], ["chat", "vision"], ["chat", "vision", "audio"], ["embedding"] + * + * @generated from field: repeated string modalities = 5; + */ + modalities: string[]; + + /** + * Model capabilities + * + * Maximum context window size + * + * @generated from field: int32 context_window = 6; + */ + contextWindow: number; + + /** + * Human-readable description + * + * @generated from field: string description = 7; + */ + description: string; + + /** + * Metadata for additional model properties + * + * @generated from field: map metadata = 8; + */ + metadata: { [key: string]: string }; + + /** + * Enable/disable toggle for routing + * When false, model appears in UI but generates 0 req/s rate limit in data plane + * + * @generated from field: bool enabled = 9; + */ + enabled: boolean; + + /** + * Audit fields + * + * @generated from field: google.protobuf.Timestamp create_time = 10; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 11; + */ + updateTime?: Timestamp; + + /** + * @generated from field: string creator = 12; + */ + creator: string; + + /** + * @generated from field: string updater = 13; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Model. + * Use `create(ModelSchema)` to create a new message. + */ +export const ModelSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 0); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateModelRequest + */ +export type CreateModelRequest = Message<"redpanda.api.aigateway.v1.CreateModelRequest"> & { + /** + * @generated from field: string model_id = 1; + */ + modelId: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 2; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateModelRequest. + * Use `create(CreateModelRequestSchema)` to create a new message. + */ +export const CreateModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 1); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateModelResponse + */ +export type CreateModelResponse = Message<"redpanda.api.aigateway.v1.CreateModelResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateModelResponse. + * Use `create(CreateModelResponseSchema)` to create a new message. + */ +export const CreateModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 2); + +/** + * @generated from message redpanda.api.aigateway.v1.GetModelRequest + */ +export type GetModelRequest = Message<"redpanda.api.aigateway.v1.GetModelRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetModelRequest. + * Use `create(GetModelRequestSchema)` to create a new message. + */ +export const GetModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 3); + +/** + * @generated from message redpanda.api.aigateway.v1.GetModelResponse + */ +export type GetModelResponse = Message<"redpanda.api.aigateway.v1.GetModelResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetModelResponse. + * Use `create(GetModelResponseSchema)` to create a new message. + */ +export const GetModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.ListModelsRequest + */ +export type ListModelsRequest = Message<"redpanda.api.aigateway.v1.ListModelsRequest"> & { + /** + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 2; + */ + pageToken: string; + + /** + * Filter by model_owner, provider, model_id, modality (checks if contained in modalities array), or enabled status + * Examples: + * model_owner = "anthropic" (the company that created the model) + * provider = "aws-bedrock" (the hosting provider) + * model_id = "claude-3-5-sonnet" + * modality = "chat" (matches models with "chat" in their modalities array) + * modality = "vision" (matches multimodal models that support vision) + * enabled = true + * + * @generated from field: string filter = 3; + */ + filter: string; + + /** + * @generated from field: string order_by = 4; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListModelsRequest. + * Use `create(ListModelsRequestSchema)` to create a new message. + */ +export const ListModelsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.ListModelsResponse + */ +export type ListModelsResponse = Message<"redpanda.api.aigateway.v1.ListModelsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.Model models = 1; + */ + models: Model[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListModelsResponse. + * Use `create(ListModelsResponseSchema)` to create a new message. + */ +export const ListModelsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateModelRequest + */ +export type UpdateModelRequest = Message<"redpanda.api.aigateway.v1.UpdateModelRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateModelRequest. + * Use `create(UpdateModelRequestSchema)` to create a new message. + */ +export const UpdateModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateModelResponse + */ +export type UpdateModelResponse = Message<"redpanda.api.aigateway.v1.UpdateModelResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateModelResponse. + * Use `create(UpdateModelResponseSchema)` to create a new message. + */ +export const UpdateModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteModelRequest + */ +export type DeleteModelRequest = Message<"redpanda.api.aigateway.v1.DeleteModelRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteModelRequest. + * Use `create(DeleteModelRequestSchema)` to create a new message. + */ +export const DeleteModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteModelResponse + */ +export type DeleteModelResponse = Message<"redpanda.api.aigateway.v1.DeleteModelResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteModelResponse. + * Use `create(DeleteModelResponseSchema)` to create a new message. + */ +export const DeleteModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 10); + +/** + * @generated from message redpanda.api.aigateway.v1.EnableModelRequest + */ +export type EnableModelRequest = Message<"redpanda.api.aigateway.v1.EnableModelRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EnableModelRequest. + * Use `create(EnableModelRequestSchema)` to create a new message. + */ +export const EnableModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 11); + +/** + * @generated from message redpanda.api.aigateway.v1.EnableModelResponse + */ +export type EnableModelResponse = Message<"redpanda.api.aigateway.v1.EnableModelResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EnableModelResponse. + * Use `create(EnableModelResponseSchema)` to create a new message. + */ +export const EnableModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 12); + +/** + * @generated from message redpanda.api.aigateway.v1.DisableModelRequest + */ +export type DisableModelRequest = Message<"redpanda.api.aigateway.v1.DisableModelRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableModelRequest. + * Use `create(DisableModelRequestSchema)` to create a new message. + */ +export const DisableModelRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 13); + +/** + * @generated from message redpanda.api.aigateway.v1.DisableModelResponse + */ +export type DisableModelResponse = Message<"redpanda.api.aigateway.v1.DisableModelResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Model model = 1; + */ + model?: Model; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableModelResponse. + * Use `create(DisableModelResponseSchema)` to create a new message. + */ +export const DisableModelResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 14); + +/** + * @generated from message redpanda.api.aigateway.v1.ListDisabledModelsRequest + */ +export type ListDisabledModelsRequest = Message<"redpanda.api.aigateway.v1.ListDisabledModelsRequest"> & { + /** + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 2; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListDisabledModelsRequest. + * Use `create(ListDisabledModelsRequestSchema)` to create a new message. + */ +export const ListDisabledModelsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 15); + +/** + * @generated from message redpanda.api.aigateway.v1.ListDisabledModelsResponse + */ +export type ListDisabledModelsResponse = Message<"redpanda.api.aigateway.v1.ListDisabledModelsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.Model models = 1; + */ + models: Model[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListDisabledModelsResponse. + * Use `create(ListDisabledModelsResponseSchema)` to create a new message. + */ +export const ListDisabledModelsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_models, 16); + +/** + * @generated from service redpanda.api.aigateway.v1.ModelsService + */ +export const ModelsService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.CreateModel + */ + createModel: { + methodKind: "unary"; + input: typeof CreateModelRequestSchema; + output: typeof CreateModelResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.GetModel + */ + getModel: { + methodKind: "unary"; + input: typeof GetModelRequestSchema; + output: typeof GetModelResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.ListModels + */ + listModels: { + methodKind: "unary"; + input: typeof ListModelsRequestSchema; + output: typeof ListModelsResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.UpdateModel + */ + updateModel: { + methodKind: "unary"; + input: typeof UpdateModelRequestSchema; + output: typeof UpdateModelResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.DeleteModel + */ + deleteModel: { + methodKind: "unary"; + input: typeof DeleteModelRequestSchema; + output: typeof DeleteModelResponseSchema; + }, + /** + * Enable a model for routing + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.EnableModel + */ + enableModel: { + methodKind: "unary"; + input: typeof EnableModelRequestSchema; + output: typeof EnableModelResponseSchema; + }, + /** + * Disable a model (generates 0 req/s rate limit) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.DisableModel + */ + disableModel: { + methodKind: "unary"; + input: typeof DisableModelRequestSchema; + output: typeof DisableModelResponseSchema; + }, + /** + * List all disabled models (for generating rate limit rules) + * + * @generated from rpc redpanda.api.aigateway.v1.ModelsService.ListDisabledModels + */ + listDisabledModels: { + methodKind: "unary"; + input: typeof ListDisabledModelsRequestSchema; + output: typeof ListDisabledModelsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_models, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client-OAuth2ClientService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client-OAuth2ClientService_connectquery.ts new file mode 100644 index 0000000000..b1c7469d5c --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client-OAuth2ClientService_connectquery.ts @@ -0,0 +1,65 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/oauth2_client.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { OAuth2ClientService } from "./oauth2_client_pb"; + +/** + * Creates a new OAuth2 client. + * Returns the client with plaintext secret (only returned on creation). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client + */ +export const createOAuth2Client = OAuth2ClientService.method.createOAuth2Client; + +/** + * Gets an OAuth2 client by name. + * Note: The client_secret is never returned after creation. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client + */ +export const getOAuth2Client = OAuth2ClientService.method.getOAuth2Client; + +/** + * Lists OAuth2 clients. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients + */ +export const listOAuth2Clients = OAuth2ClientService.method.listOAuth2Clients; + +/** + * Updates an OAuth2 client. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client + */ +export const updateOAuth2Client = OAuth2ClientService.method.updateOAuth2Client; + +/** + * Deletes an OAuth2 client. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client + */ +export const deleteOAuth2Client = OAuth2ClientService.method.deleteOAuth2Client; + +/** + * Rotates an OAuth2 client's secret. + * Returns the new plaintext secret (only returned during rotation). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret + */ +export const rotateOAuth2ClientSecret = OAuth2ClientService.method.rotateOAuth2ClientSecret; + +/** + * Disables an OAuth2 client (soft delete). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client + */ +export const disableOAuth2Client = OAuth2ClientService.method.disableOAuth2Client; + +/** + * Validates OAuth2 client credentials. + * Used for authenticating client_credentials grant requests. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials + */ +export const validateClientCredentials = OAuth2ClientService.method.validateClientCredentials; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client_pb.ts new file mode 100644 index 0000000000..c087eb2cc5 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_client_pb.ts @@ -0,0 +1,738 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/oauth2_client.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/oauth2_client.proto. + */ +export const file_redpanda_api_aigateway_v1_oauth2_client: GenFile = /*@__PURE__*/ + fileDesc("Ci1yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL29hdXRoMl9jbGllbnQucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiyAYKDE9BdXRoMkNsaWVudBIRCgRuYW1lGAEgASgJQgPgQQgSIwoMZGlzcGxheV9uYW1lGAIgASgJQg3gQQK6SAdyBRABGP8BEhgKC2Rlc2NyaXB0aW9uGAMgASgJQgPgQQESRQoLY2xpZW50X3R5cGUYBCABKA4yKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudFR5cGVCA+BBAhJACgxvcmdhbml6YXRpb24YBSABKAlCKPpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb25IABI6Cgl3b3Jrc3BhY2UYBiABKAlCJfpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Xb3Jrc3BhY2VIABIwCgR0ZWFtGAcgASgJQiD6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVGVhbUgAEjAKBHVzZXIYCCABKAlCIPpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Vc2VySAASNgoHZ2F0ZXdheRgJIAEoCUIj+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0dhdGV3YXlIABIVCg1yZWRpcmVjdF91cmlzGAogAygJEg4KBnNjb3BlcxgLIAMoCRITCgtncmFudF90eXBlcxgMIAMoCRIPCgdlbmFibGVkGA0gASgIEjMKCmV4cGlyZXNfYXQYDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESNQoMbGFzdF91c2VkX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC2NyZWF0ZV90aW1lGBAgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGBEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEhQKB2NyZWF0b3IYEiABKAlCA+BBAzpB6kE+CiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09BdXRoMkNsaWVudBIXb2F1dGgyL2NsaWVudHMve2NsaWVudH1CBwoFb3duZXIibQoWT0F1dGgyQ2xpZW50V2l0aFNlY3JldBI3CgZjbGllbnQYASABKAsyJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudBIaCg1jbGllbnRfc2VjcmV0GAIgASgJQgPgQQMiagoZQ3JlYXRlT0F1dGgyQ2xpZW50UmVxdWVzdBI8CgZjbGllbnQYAiABKAsyJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudEID4EECSgQIARACUgljbGllbnRfaWQiXwoaQ3JlYXRlT0F1dGgyQ2xpZW50UmVzcG9uc2USQQoGY2xpZW50GAEgASgLMjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJDbGllbnRXaXRoU2VjcmV0IlMKFkdldE9BdXRoMkNsaWVudFJlcXVlc3QSOQoEbmFtZRgBIAEoCUIr4EEC+kElCiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09BdXRoMkNsaWVudCJSChdHZXRPQXV0aDJDbGllbnRSZXNwb25zZRI3CgZjbGllbnQYASABKAsyJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudCLcAQoYTGlzdE9BdXRoMkNsaWVudHNSZXF1ZXN0EhIKBW93bmVyGAEgASgJQgPgQQESRQoLY2xpZW50X3R5cGUYAiABKA4yKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudFR5cGVCA+BBARIgCglwYWdlX3NpemUYAyABKAVCDeBBAbpIBxoFGOgHKAASFwoKcGFnZV90b2tlbhgEIAEoCUID4EEBEhMKBmZpbHRlchgFIAEoCUID4EEBEhUKCG9yZGVyX2J5GAYgASgJQgPgQQEiggEKGUxpc3RPQXV0aDJDbGllbnRzUmVzcG9uc2USOAoHY2xpZW50cxgBIAMoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT0F1dGgyQ2xpZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIo8BChlVcGRhdGVPQXV0aDJDbGllbnRSZXF1ZXN0EjwKBmNsaWVudBgBIAEoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT0F1dGgyQ2xpZW50QgPgQQISNAoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgPgQQEiVQoaVXBkYXRlT0F1dGgyQ2xpZW50UmVzcG9uc2USNwoGY2xpZW50GAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJDbGllbnQiVgoZRGVsZXRlT0F1dGgyQ2xpZW50UmVxdWVzdBI5CgRuYW1lGAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT0F1dGgyQ2xpZW50IhwKGkRlbGV0ZU9BdXRoMkNsaWVudFJlc3BvbnNlIlwKH1JvdGF0ZU9BdXRoMkNsaWVudFNlY3JldFJlcXVlc3QSOQoEbmFtZRgBIAEoCUIr4EEC+kElCiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09BdXRoMkNsaWVudCJlCiBSb3RhdGVPQXV0aDJDbGllbnRTZWNyZXRSZXNwb25zZRJBCgZjbGllbnQYASABKAsyMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMkNsaWVudFdpdGhTZWNyZXQiVwoaRGlzYWJsZU9BdXRoMkNsaWVudFJlcXVlc3QSOQoEbmFtZRgBIAEoCUIr4EEC+kElCiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09BdXRoMkNsaWVudCJWChtEaXNhYmxlT0F1dGgyQ2xpZW50UmVzcG9uc2USNwoGY2xpZW50GAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJDbGllbnQiVgogVmFsaWRhdGVDbGllbnRDcmVkZW50aWFsc1JlcXVlc3QSFgoJY2xpZW50X2lkGAEgASgJQgPgQQISGgoNY2xpZW50X3NlY3JldBgCIAEoCUID4EECIoIBCiFWYWxpZGF0ZUNsaWVudENyZWRlbnRpYWxzUmVzcG9uc2USDQoFdmFsaWQYASABKAgSNwoGY2xpZW50GAIgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJDbGllbnQSFQoNZXJyb3JfbWVzc2FnZRgDIAEoCSpzChBPQXV0aDJDbGllbnRUeXBlEiIKHk9BVVRIMl9DTElFTlRfVFlQRV9VTlNQRUNJRklFRBAAEhsKF09BVVRIMl9DTElFTlRfVFlQRV9VU0VSEAESHgoaT0FVVEgyX0NMSUVOVF9UWVBFX1NFUlZJQ0UQAjLECwoTT0F1dGgyQ2xpZW50U2VydmljZRKlAQoSQ3JlYXRlT0F1dGgyQ2xpZW50EjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVPQXV0aDJDbGllbnRSZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVPQXV0aDJDbGllbnRSZXNwb25zZSIigtPkkwIcOgZjbGllbnQiEi92MS9vYXV0aDIvY2xpZW50cxKdAQoPR2V0T0F1dGgyQ2xpZW50EjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRPQXV0aDJDbGllbnRSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRPQXV0aDJDbGllbnRSZXNwb25zZSIjgtPkkwIdEhsvdjEve25hbWU9b2F1dGgyL2NsaWVudHMvKn0SmgEKEUxpc3RPQXV0aDJDbGllbnRzEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0T0F1dGgyQ2xpZW50c1JlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RPQXV0aDJDbGllbnRzUmVzcG9uc2UiGoLT5JMCFBISL3YxL29hdXRoMi9jbGllbnRzErUBChJVcGRhdGVPQXV0aDJDbGllbnQSNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZU9BdXRoMkNsaWVudFJlcXVlc3QaNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZU9BdXRoMkNsaWVudFJlc3BvbnNlIjKC0+STAiw6BmNsaWVudDIiL3YxL3tjbGllbnQubmFtZT1vYXV0aDIvY2xpZW50cy8qfRKmAQoSRGVsZXRlT0F1dGgyQ2xpZW50EjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVPQXV0aDJDbGllbnRSZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVPQXV0aDJDbGllbnRSZXNwb25zZSIjgtPkkwIdKhsvdjEve25hbWU9b2F1dGgyL2NsaWVudHMvKn0SyAEKGFJvdGF0ZU9BdXRoMkNsaWVudFNlY3JldBI6LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm90YXRlT0F1dGgyQ2xpZW50U2VjcmV0UmVxdWVzdBo7LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm90YXRlT0F1dGgyQ2xpZW50U2VjcmV0UmVzcG9uc2UiM4LT5JMCLToBKiIoL3YxL3tuYW1lPW9hdXRoMi9jbGllbnRzLyp9OnJvdGF0ZVNlY3JldBK0AQoTRGlzYWJsZU9BdXRoMkNsaWVudBI1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGlzYWJsZU9BdXRoMkNsaWVudFJlcXVlc3QaNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRpc2FibGVPQXV0aDJDbGllbnRSZXNwb25zZSIugtPkkwIoOgEqIiMvdjEve25hbWU9b2F1dGgyL2NsaWVudHMvKn06ZGlzYWJsZRLJAQoZVmFsaWRhdGVDbGllbnRDcmVkZW50aWFscxI7LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVmFsaWRhdGVDbGllbnRDcmVkZW50aWFsc1JlcXVlc3QaPC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlZhbGlkYXRlQ2xpZW50Q3JlZGVudGlhbHNSZXNwb25zZSIxgtPkkwIrOgEqIiYvdjEvb2F1dGgyL2NsaWVudHM6dmFsaWRhdGVDcmVkZW50aWFscxoZykEWYWlnYXRld2F5LnJlZHBhbmRhLmNvbUKGAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCEU9hdXRoMkNsaWVudFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * OAuth2Client represents an OAuth2 client for machine-to-machine authentication. + * + * @generated from message redpanda.api.aigateway.v1.OAuth2Client + */ +export type OAuth2Client = Message<"redpanda.api.aigateway.v1.OAuth2Client"> & { + /** + * Resource name. Format: `oauth2/clients/{client_id}` + * Client ID is a globally unique identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Client type: 'user' (interactive) or 'service' (machine-to-machine) + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2ClientType client_type = 4; + */ + clientType: OAuth2ClientType; + + /** + * Owner reference (exactly one must be set) + * + * @generated from oneof redpanda.api.aigateway.v1.OAuth2Client.owner + */ + owner: { + /** + * Organization that owns this client + * + * @generated from field: string organization = 5; + */ + value: string; + case: "organization"; + } | { + /** + * Workspace that owns this client + * + * @generated from field: string workspace = 6; + */ + value: string; + case: "workspace"; + } | { + /** + * Team that owns this client + * + * @generated from field: string team = 7; + */ + value: string; + case: "team"; + } | { + /** + * User that owns this client + * + * @generated from field: string user = 8; + */ + value: string; + case: "user"; + } | { + /** + * Gateway that owns this client + * + * @generated from field: string gateway = 9; + */ + value: string; + case: "gateway"; + } | { case: undefined; value?: undefined }; + + /** + * OAuth2 redirect URIs (for authorization_code flow, future use) + * + * @generated from field: repeated string redirect_uris = 10; + */ + redirectUris: string[]; + + /** + * Allowed OAuth2 scopes + * + * @generated from field: repeated string scopes = 11; + */ + scopes: string[]; + + /** + * Supported grant types (default: client_credentials) + * + * @generated from field: repeated string grant_types = 12; + */ + grantTypes: string[]; + + /** + * Whether this client is active + * + * @generated from field: bool enabled = 13; + */ + enabled: boolean; + + /** + * Optional: Expiration time for the client + * + * @generated from field: google.protobuf.Timestamp expires_at = 14; + */ + expiresAt?: Timestamp; + + /** + * Output only. Last time this client was used + * + * @generated from field: google.protobuf.Timestamp last_used_at = 15; + */ + lastUsedAt?: Timestamp; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 16; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 17; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 18; + */ + creator: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OAuth2Client. + * Use `create(OAuth2ClientSchema)` to create a new message. + */ +export const OAuth2ClientSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 0); + +/** + * OAuth2ClientWithSecret is returned only on creation or secret rotation. + * + * @generated from message redpanda.api.aigateway.v1.OAuth2ClientWithSecret + */ +export type OAuth2ClientWithSecret = Message<"redpanda.api.aigateway.v1.OAuth2ClientWithSecret"> & { + /** + * The OAuth2 client + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 1; + */ + client?: OAuth2Client; + + /** + * Output only. The plaintext client secret. + * This is ONLY returned during creation or rotation. + * Store this securely - it cannot be retrieved again. + * + * @generated from field: string client_secret = 2; + */ + clientSecret: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OAuth2ClientWithSecret. + * Use `create(OAuth2ClientWithSecretSchema)` to create a new message. + */ +export const OAuth2ClientWithSecretSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 1); + +/** + * Request message for CreateOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateOAuth2ClientRequest + */ +export type CreateOAuth2ClientRequest = Message<"redpanda.api.aigateway.v1.CreateOAuth2ClientRequest"> & { + /** + * Required: The OAuth2 client to create. + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 2; + */ + client?: OAuth2Client; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOAuth2ClientRequest. + * Use `create(CreateOAuth2ClientRequestSchema)` to create a new message. + */ +export const CreateOAuth2ClientRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 2); + +/** + * Response message for CreateOAuth2Client RPC. + * Includes the plaintext secret - store it securely! + * + * @generated from message redpanda.api.aigateway.v1.CreateOAuth2ClientResponse + */ +export type CreateOAuth2ClientResponse = Message<"redpanda.api.aigateway.v1.CreateOAuth2ClientResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2ClientWithSecret client = 1; + */ + client?: OAuth2ClientWithSecret; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOAuth2ClientResponse. + * Use `create(CreateOAuth2ClientResponseSchema)` to create a new message. + */ +export const CreateOAuth2ClientResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 3); + +/** + * Request message for GetOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetOAuth2ClientRequest + */ +export type GetOAuth2ClientRequest = Message<"redpanda.api.aigateway.v1.GetOAuth2ClientRequest"> & { + /** + * Resource name of the client. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOAuth2ClientRequest. + * Use `create(GetOAuth2ClientRequestSchema)` to create a new message. + */ +export const GetOAuth2ClientRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 4); + +/** + * Response message for GetOAuth2Client RPC. + * Note: client_secret is never returned. + * + * @generated from message redpanda.api.aigateway.v1.GetOAuth2ClientResponse + */ +export type GetOAuth2ClientResponse = Message<"redpanda.api.aigateway.v1.GetOAuth2ClientResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 1; + */ + client?: OAuth2Client; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOAuth2ClientResponse. + * Use `create(GetOAuth2ClientResponseSchema)` to create a new message. + */ +export const GetOAuth2ClientResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 5); + +/** + * Request message for ListOAuth2Clients RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOAuth2ClientsRequest + */ +export type ListOAuth2ClientsRequest = Message<"redpanda.api.aigateway.v1.ListOAuth2ClientsRequest"> & { + /** + * Filter by owner type and ID (optional) + * Format examples: + * organization=accounts/*\/organizations/* + * workspace=accounts/*\/organizations/*\/workspaces/* + * user=accounts/*\/organizations/*\/users/* + * gateway=gateways/* + * + * @generated from field: string owner = 1; + */ + owner: string; + + /** + * Filter by client type + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2ClientType client_type = 2; + */ + clientType: OAuth2ClientType; + + /** + * Maximum number of clients to return (max 1000) + * + * @generated from field: int32 page_size = 3; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 4; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 5; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 6; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOAuth2ClientsRequest. + * Use `create(ListOAuth2ClientsRequestSchema)` to create a new message. + */ +export const ListOAuth2ClientsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 6); + +/** + * Response message for ListOAuth2Clients RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOAuth2ClientsResponse + */ +export type ListOAuth2ClientsResponse = Message<"redpanda.api.aigateway.v1.ListOAuth2ClientsResponse"> & { + /** + * The list of OAuth2 clients (without secrets) + * + * @generated from field: repeated redpanda.api.aigateway.v1.OAuth2Client clients = 1; + */ + clients: OAuth2Client[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOAuth2ClientsResponse. + * Use `create(ListOAuth2ClientsResponseSchema)` to create a new message. + */ +export const ListOAuth2ClientsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 7); + +/** + * Request message for UpdateOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest + */ +export type UpdateOAuth2ClientRequest = Message<"redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest"> & { + /** + * Required: The client to update. + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 1; + */ + client?: OAuth2Client; + + /** + * The fields to update. + * Allowed fields: display_name, description, redirect_uris, scopes, grant_types, enabled, expires_at + * Note: Owner cannot be changed after creation. + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateOAuth2ClientRequest. + * Use `create(UpdateOAuth2ClientRequestSchema)` to create a new message. + */ +export const UpdateOAuth2ClientRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 8); + +/** + * Response message for UpdateOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse + */ +export type UpdateOAuth2ClientResponse = Message<"redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 1; + */ + client?: OAuth2Client; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateOAuth2ClientResponse. + * Use `create(UpdateOAuth2ClientResponseSchema)` to create a new message. + */ +export const UpdateOAuth2ClientResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 9); + +/** + * Request message for DeleteOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOAuth2ClientRequest + */ +export type DeleteOAuth2ClientRequest = Message<"redpanda.api.aigateway.v1.DeleteOAuth2ClientRequest"> & { + /** + * Resource name of the client to delete. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOAuth2ClientRequest. + * Use `create(DeleteOAuth2ClientRequestSchema)` to create a new message. + */ +export const DeleteOAuth2ClientRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 10); + +/** + * Response message for DeleteOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOAuth2ClientResponse + */ +export type DeleteOAuth2ClientResponse = Message<"redpanda.api.aigateway.v1.DeleteOAuth2ClientResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOAuth2ClientResponse. + * Use `create(DeleteOAuth2ClientResponseSchema)` to create a new message. + */ +export const DeleteOAuth2ClientResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 11); + +/** + * Request message for RotateOAuth2ClientSecret RPC. + * + * @generated from message redpanda.api.aigateway.v1.RotateOAuth2ClientSecretRequest + */ +export type RotateOAuth2ClientSecretRequest = Message<"redpanda.api.aigateway.v1.RotateOAuth2ClientSecretRequest"> & { + /** + * Resource name of the client. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotateOAuth2ClientSecretRequest. + * Use `create(RotateOAuth2ClientSecretRequestSchema)` to create a new message. + */ +export const RotateOAuth2ClientSecretRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 12); + +/** + * Response message for RotateOAuth2ClientSecret RPC. + * Includes the new plaintext secret - store it securely! + * + * @generated from message redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse + */ +export type RotateOAuth2ClientSecretResponse = Message<"redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2ClientWithSecret client = 1; + */ + client?: OAuth2ClientWithSecret; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotateOAuth2ClientSecretResponse. + * Use `create(RotateOAuth2ClientSecretResponseSchema)` to create a new message. + */ +export const RotateOAuth2ClientSecretResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 13); + +/** + * Request message for DisableOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.DisableOAuth2ClientRequest + */ +export type DisableOAuth2ClientRequest = Message<"redpanda.api.aigateway.v1.DisableOAuth2ClientRequest"> & { + /** + * Resource name of the client to disable. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableOAuth2ClientRequest. + * Use `create(DisableOAuth2ClientRequestSchema)` to create a new message. + */ +export const DisableOAuth2ClientRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 14); + +/** + * Response message for DisableOAuth2Client RPC. + * + * @generated from message redpanda.api.aigateway.v1.DisableOAuth2ClientResponse + */ +export type DisableOAuth2ClientResponse = Message<"redpanda.api.aigateway.v1.DisableOAuth2ClientResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 1; + */ + client?: OAuth2Client; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DisableOAuth2ClientResponse. + * Use `create(DisableOAuth2ClientResponseSchema)` to create a new message. + */ +export const DisableOAuth2ClientResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 15); + +/** + * Request message for ValidateClientCredentials RPC. + * + * @generated from message redpanda.api.aigateway.v1.ValidateClientCredentialsRequest + */ +export type ValidateClientCredentialsRequest = Message<"redpanda.api.aigateway.v1.ValidateClientCredentialsRequest"> & { + /** + * Client ID (the resource name suffix, e.g., from "oauth2/clients/{id}") + * + * @generated from field: string client_id = 1; + */ + clientId: string; + + /** + * Client secret to validate + * + * @generated from field: string client_secret = 2; + */ + clientSecret: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ValidateClientCredentialsRequest. + * Use `create(ValidateClientCredentialsRequestSchema)` to create a new message. + */ +export const ValidateClientCredentialsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 16); + +/** + * Response message for ValidateClientCredentials RPC. + * + * @generated from message redpanda.api.aigateway.v1.ValidateClientCredentialsResponse + */ +export type ValidateClientCredentialsResponse = Message<"redpanda.api.aigateway.v1.ValidateClientCredentialsResponse"> & { + /** + * Whether the credentials are valid + * + * @generated from field: bool valid = 1; + */ + valid: boolean; + + /** + * The authenticated client (only set if valid=true) + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2Client client = 2; + */ + client?: OAuth2Client; + + /** + * Error message if validation failed (for logging/debugging) + * + * @generated from field: string error_message = 3; + */ + errorMessage: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ValidateClientCredentialsResponse. + * Use `create(ValidateClientCredentialsResponseSchema)` to create a new message. + */ +export const ValidateClientCredentialsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_client, 17); + +/** + * OAuth2ClientType defines the type of OAuth2 client. + * + * @generated from enum redpanda.api.aigateway.v1.OAuth2ClientType + */ +export enum OAuth2ClientType { + /** + * @generated from enum value: OAUTH2_CLIENT_TYPE_UNSPECIFIED = 0; + */ + OAUTH2_CLIENT_TYPE_UNSPECIFIED = 0, + + /** + * Interactive user clients (future: authorization_code flow) + * + * @generated from enum value: OAUTH2_CLIENT_TYPE_USER = 1; + */ + OAUTH2_CLIENT_TYPE_USER = 1, + + /** + * Service/machine clients (client_credentials flow) + * + * @generated from enum value: OAUTH2_CLIENT_TYPE_SERVICE = 2; + */ + OAUTH2_CLIENT_TYPE_SERVICE = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.OAuth2ClientType. + */ +export const OAuth2ClientTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_oauth2_client, 0); + +/** + * OAuth2ClientService manages OAuth2 client credentials. + * Clients can be owned by organizations, workspaces, teams, users, or gateways. + * Resource name: oauth2/clients/{client_id} + * + * @generated from service redpanda.api.aigateway.v1.OAuth2ClientService + */ +export const OAuth2ClientService: GenService<{ + /** + * Creates a new OAuth2 client. + * Returns the client with plaintext secret (only returned on creation). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.CreateOAuth2Client + */ + createOAuth2Client: { + methodKind: "unary"; + input: typeof CreateOAuth2ClientRequestSchema; + output: typeof CreateOAuth2ClientResponseSchema; + }, + /** + * Gets an OAuth2 client by name. + * Note: The client_secret is never returned after creation. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.GetOAuth2Client + */ + getOAuth2Client: { + methodKind: "unary"; + input: typeof GetOAuth2ClientRequestSchema; + output: typeof GetOAuth2ClientResponseSchema; + }, + /** + * Lists OAuth2 clients. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.ListOAuth2Clients + */ + listOAuth2Clients: { + methodKind: "unary"; + input: typeof ListOAuth2ClientsRequestSchema; + output: typeof ListOAuth2ClientsResponseSchema; + }, + /** + * Updates an OAuth2 client. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.UpdateOAuth2Client + */ + updateOAuth2Client: { + methodKind: "unary"; + input: typeof UpdateOAuth2ClientRequestSchema; + output: typeof UpdateOAuth2ClientResponseSchema; + }, + /** + * Deletes an OAuth2 client. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.DeleteOAuth2Client + */ + deleteOAuth2Client: { + methodKind: "unary"; + input: typeof DeleteOAuth2ClientRequestSchema; + output: typeof DeleteOAuth2ClientResponseSchema; + }, + /** + * Rotates an OAuth2 client's secret. + * Returns the new plaintext secret (only returned during rotation). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.RotateOAuth2ClientSecret + */ + rotateOAuth2ClientSecret: { + methodKind: "unary"; + input: typeof RotateOAuth2ClientSecretRequestSchema; + output: typeof RotateOAuth2ClientSecretResponseSchema; + }, + /** + * Disables an OAuth2 client (soft delete). + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.DisableOAuth2Client + */ + disableOAuth2Client: { + methodKind: "unary"; + input: typeof DisableOAuth2ClientRequestSchema; + output: typeof DisableOAuth2ClientResponseSchema; + }, + /** + * Validates OAuth2 client credentials. + * Used for authenticating client_credentials grant requests. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2ClientService.ValidateClientCredentials + */ + validateClientCredentials: { + methodKind: "unary"; + input: typeof ValidateClientCredentialsRequestSchema; + output: typeof ValidateClientCredentialsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_oauth2_client, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key-OAuth2KeyService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key-OAuth2KeyService_connectquery.ts new file mode 100644 index 0000000000..addd077cb0 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key-OAuth2KeyService_connectquery.ts @@ -0,0 +1,60 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/oauth2_key.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { OAuth2KeyService } from "./oauth2_key_pb"; + +/** + * Creates a new signing key. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key + */ +export const createOAuth2Key = OAuth2KeyService.method.createOAuth2Key; + +/** + * Gets a signing key by name. + * Note: Private key material is never returned. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key + */ +export const getOAuth2Key = OAuth2KeyService.method.getOAuth2Key; + +/** + * Lists signing keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys + */ +export const listOAuth2Keys = OAuth2KeyService.method.listOAuth2Keys; + +/** + * Deactivates a signing key. + * The key will no longer be used for signing new tokens. + * Existing tokens signed with this key remain valid until expiry. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key + */ +export const deactivateOAuth2Key = OAuth2KeyService.method.deactivateOAuth2Key; + +/** + * Deletes a signing key. + * WARNING: This will invalidate all tokens signed with this key. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key + */ +export const deleteOAuth2Key = OAuth2KeyService.method.deleteOAuth2Key; + +/** + * Rotates signing keys. + * Creates a new active key and optionally deactivates old keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys + */ +export const rotateOAuth2Keys = OAuth2KeyService.method.rotateOAuth2Keys; + +/** + * Gets the JWKS (JSON Web Key Set) for token verification. + * This endpoint is public and returns only public keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS + */ +export const getJWKS = OAuth2KeyService.method.getJWKS; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key_pb.ts new file mode 100644 index 0000000000..fdd7039b86 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/oauth2_key_pb.ts @@ -0,0 +1,610 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/oauth2_key.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/oauth2_key.proto. + */ +export const file_redpanda_api_aigateway_v1_oauth2_key: GenFile = /*@__PURE__*/ + fileDesc("CipyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL29hdXRoMl9rZXkucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiyQIKCU9BdXRoMktleRIRCgRuYW1lGAEgASgJQgPgQQgSRQoJYWxnb3JpdGhtGAIgASgOMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJLZXlBbGdvcml0aG1CA+BBAhIXCgpwdWJsaWNfa2V5GAMgASgJQgPgQQMSDgoGYWN0aXZlGAQgASgIEjMKCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESNAoLY3JlYXRlX3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgHIAEoCUID4EEDOjjqQTUKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT0F1dGgyS2V5EhFvYXV0aDIva2V5cy97a2V5fSKpAQoWQ3JlYXRlT0F1dGgyS2V5UmVxdWVzdBITCgZrZXlfaWQYASABKAlCA+BBARJFCglhbGdvcml0aG0YAiABKA4yLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMktleUFsZ29yaXRobUID4EEBEjMKCmV4cGlyZXNfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQEiTAoXQ3JlYXRlT0F1dGgyS2V5UmVzcG9uc2USMQoDa2V5GAEgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJLZXkiTQoTR2V0T0F1dGgyS2V5UmVxdWVzdBI2CgRuYW1lGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT0F1dGgyS2V5IkkKFEdldE9BdXRoMktleVJlc3BvbnNlEjEKA2tleRgBIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT0F1dGgyS2V5ImsKFUxpc3RPQXV0aDJLZXlzUmVxdWVzdBIYCgthY3RpdmVfb25seRgBIAEoCEID4EEBEh8KCXBhZ2Vfc2l6ZRgCIAEoBUIM4EEBukgGGgQYZCgAEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJ5ChZMaXN0T0F1dGgyS2V5c1Jlc3BvbnNlEjIKBGtleXMYASADKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMktleRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSJUChpEZWFjdGl2YXRlT0F1dGgyS2V5UmVxdWVzdBI2CgRuYW1lGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT0F1dGgyS2V5IlAKG0RlYWN0aXZhdGVPQXV0aDJLZXlSZXNwb25zZRIxCgNrZXkYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMktleSJQChZEZWxldGVPQXV0aDJLZXlSZXF1ZXN0EjYKBG5hbWUYASABKAlCKOBBAvpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9PQXV0aDJLZXkiGQoXRGVsZXRlT0F1dGgyS2V5UmVzcG9uc2UirQEKF1JvdGF0ZU9BdXRoMktleXNSZXF1ZXN0EkUKCWFsZ29yaXRobRgBIAEoDjItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT0F1dGgyS2V5QWxnb3JpdGhtQgPgQQESIAoTZGVhY3RpdmF0ZV9leGlzdGluZxgCIAEoCEID4EEBEikKEmdyYWNlX3BlcmlvZF9ob3VycxgDIAEoBUIN4EEBukgHGgUYqAEoACKRAQoYUm90YXRlT0F1dGgyS2V5c1Jlc3BvbnNlEjUKB25ld19rZXkYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9BdXRoMktleRI+ChBkZWFjdGl2YXRlZF9rZXlzGAIgAygLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5PQXV0aDJLZXkiEAoOR2V0SldLU1JlcXVlc3QiRgoPR2V0SldLU1Jlc3BvbnNlEjMKBGtleXMYASADKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkpTT05XZWJLZXkiVgoKSlNPTldlYktleRILCgNrdHkYASABKAkSCwoDdXNlGAIgASgJEgsKA2tpZBgDIAEoCRILCgNhbGcYBCABKAkSCQoBbhgFIAEoCRIJCgFlGAYgASgJKpoBChJPQXV0aDJLZXlBbGdvcml0aG0SJAogT0FVVEgyX0tFWV9BTEdPUklUSE1fVU5TUEVDSUZJRUQQABIeChpPQVVUSDJfS0VZX0FMR09SSVRITV9SUzI1NhABEh4KGk9BVVRIMl9LRVlfQUxHT1JJVEhNX1JTMzg0EAISHgoaT0FVVEgyX0tFWV9BTEdPUklUSE1fUlM1MTIQAzL+CAoQT0F1dGgyS2V5U2VydmljZRKUAQoPQ3JlYXRlT0F1dGgyS2V5EjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVPQXV0aDJLZXlSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVPQXV0aDJLZXlSZXNwb25zZSIagtPkkwIUOgEqIg8vdjEvb2F1dGgyL2tleXMSkQEKDEdldE9BdXRoMktleRIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0T0F1dGgyS2V5UmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0T0F1dGgyS2V5UmVzcG9uc2UiIILT5JMCGhIYL3YxL3tuYW1lPW9hdXRoMi9rZXlzLyp9Eo4BCg5MaXN0T0F1dGgyS2V5cxIwLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdE9BdXRoMktleXNSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0T0F1dGgyS2V5c1Jlc3BvbnNlIheC0+STAhESDy92MS9vYXV0aDIva2V5cxK0AQoTRGVhY3RpdmF0ZU9BdXRoMktleRI1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVhY3RpdmF0ZU9BdXRoMktleVJlcXVlc3QaNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlYWN0aXZhdGVPQXV0aDJLZXlSZXNwb25zZSIugtPkkwIoOgEqIiMvdjEve25hbWU9b2F1dGgyL2tleXMvKn06ZGVhY3RpdmF0ZRKaAQoPRGVsZXRlT0F1dGgyS2V5EjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVPQXV0aDJLZXlSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVPQXV0aDJLZXlSZXNwb25zZSIggtPkkwIaKhgvdjEve25hbWU9b2F1dGgyL2tleXMvKn0SngEKEFJvdGF0ZU9BdXRoMktleXMSMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvdGF0ZU9BdXRoMktleXNSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb3RhdGVPQXV0aDJLZXlzUmVzcG9uc2UiIYLT5JMCGzoBKiIWL3YxL29hdXRoMi9rZXlzOnJvdGF0ZRKdAQoHR2V0SldLUxIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0SldLU1JlcXVlc3QaKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEpXS1NSZXNwb25zZSI7gtPkkwI1WhgSFi8ud2VsbC1rbm93bi9qd2tzLmpzb24SGS92MS8ud2VsbC1rbm93bi9qd2tzLmpzb24aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21CgwIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQg5PYXV0aDJLZXlQcm90b1ABWktnby5wYW5kYS5kZXYvcmVkcGFuZGEtYWlndy9wcm90b3MvZ2VuL3JlZHBhbmRhL2FwaS9haWdhdGV3YXkvdjE7YWlnYXRld2F5djGiAgNSQUGqAhlSZWRwYW5kYS5BcGkuQWlnYXRld2F5LlYxygIZUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMeICJVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjFcR1BCTWV0YWRhdGHqAhxSZWRwYW5kYTo6QXBpOjpBaWdhdGV3YXk6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_timestamp]); + +/** + * OAuth2Key represents a JWKS signing key for OAuth2 tokens. + * + * @generated from message redpanda.api.aigateway.v1.OAuth2Key + */ +export type OAuth2Key = Message<"redpanda.api.aigateway.v1.OAuth2Key"> & { + /** + * Resource name. Format: `oauth2/keys/{key_id}` + * Key ID (kid) is a globally unique identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Signing algorithm: RS256, RS384, RS512 + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2KeyAlgorithm algorithm = 2; + */ + algorithm: OAuth2KeyAlgorithm; + + /** + * Output only. PEM-encoded RSA public key + * + * @generated from field: string public_key = 3; + */ + publicKey: string; + + /** + * Whether this key is active for signing new tokens + * + * @generated from field: bool active = 4; + */ + active: boolean; + + /** + * Optional: When this key should stop being used for signing + * + * @generated from field: google.protobuf.Timestamp expires_at = 5; + */ + expiresAt?: Timestamp; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 6; + */ + createTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 7; + */ + creator: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OAuth2Key. + * Use `create(OAuth2KeySchema)` to create a new message. + */ +export const OAuth2KeySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 0); + +/** + * Request message for CreateOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateOAuth2KeyRequest + */ +export type CreateOAuth2KeyRequest = Message<"redpanda.api.aigateway.v1.CreateOAuth2KeyRequest"> & { + /** + * The key ID to use. If empty, server generates one. + * + * @generated from field: string key_id = 1; + */ + keyId: string; + + /** + * Signing algorithm (default: RS256) + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2KeyAlgorithm algorithm = 2; + */ + algorithm: OAuth2KeyAlgorithm; + + /** + * Optional: Expiration time for the key + * + * @generated from field: google.protobuf.Timestamp expires_at = 3; + */ + expiresAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOAuth2KeyRequest. + * Use `create(CreateOAuth2KeyRequestSchema)` to create a new message. + */ +export const CreateOAuth2KeyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 1); + +/** + * Response message for CreateOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateOAuth2KeyResponse + */ +export type CreateOAuth2KeyResponse = Message<"redpanda.api.aigateway.v1.CreateOAuth2KeyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Key key = 1; + */ + key?: OAuth2Key; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOAuth2KeyResponse. + * Use `create(CreateOAuth2KeyResponseSchema)` to create a new message. + */ +export const CreateOAuth2KeyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 2); + +/** + * Request message for GetOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetOAuth2KeyRequest + */ +export type GetOAuth2KeyRequest = Message<"redpanda.api.aigateway.v1.GetOAuth2KeyRequest"> & { + /** + * Resource name of the key. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOAuth2KeyRequest. + * Use `create(GetOAuth2KeyRequestSchema)` to create a new message. + */ +export const GetOAuth2KeyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 3); + +/** + * Response message for GetOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetOAuth2KeyResponse + */ +export type GetOAuth2KeyResponse = Message<"redpanda.api.aigateway.v1.GetOAuth2KeyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Key key = 1; + */ + key?: OAuth2Key; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOAuth2KeyResponse. + * Use `create(GetOAuth2KeyResponseSchema)` to create a new message. + */ +export const GetOAuth2KeyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 4); + +/** + * Request message for ListOAuth2Keys RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOAuth2KeysRequest + */ +export type ListOAuth2KeysRequest = Message<"redpanda.api.aigateway.v1.ListOAuth2KeysRequest"> & { + /** + * Filter to only active keys + * + * @generated from field: bool active_only = 1; + */ + activeOnly: boolean; + + /** + * Maximum number of keys to return (max 100) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOAuth2KeysRequest. + * Use `create(ListOAuth2KeysRequestSchema)` to create a new message. + */ +export const ListOAuth2KeysRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 5); + +/** + * Response message for ListOAuth2Keys RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOAuth2KeysResponse + */ +export type ListOAuth2KeysResponse = Message<"redpanda.api.aigateway.v1.ListOAuth2KeysResponse"> & { + /** + * The list of keys + * + * @generated from field: repeated redpanda.api.aigateway.v1.OAuth2Key keys = 1; + */ + keys: OAuth2Key[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOAuth2KeysResponse. + * Use `create(ListOAuth2KeysResponseSchema)` to create a new message. + */ +export const ListOAuth2KeysResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 6); + +/** + * Request message for DeactivateOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeactivateOAuth2KeyRequest + */ +export type DeactivateOAuth2KeyRequest = Message<"redpanda.api.aigateway.v1.DeactivateOAuth2KeyRequest"> & { + /** + * Resource name of the key to deactivate. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeactivateOAuth2KeyRequest. + * Use `create(DeactivateOAuth2KeyRequestSchema)` to create a new message. + */ +export const DeactivateOAuth2KeyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 7); + +/** + * Response message for DeactivateOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse + */ +export type DeactivateOAuth2KeyResponse = Message<"redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OAuth2Key key = 1; + */ + key?: OAuth2Key; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeactivateOAuth2KeyResponse. + * Use `create(DeactivateOAuth2KeyResponseSchema)` to create a new message. + */ +export const DeactivateOAuth2KeyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 8); + +/** + * Request message for DeleteOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOAuth2KeyRequest + */ +export type DeleteOAuth2KeyRequest = Message<"redpanda.api.aigateway.v1.DeleteOAuth2KeyRequest"> & { + /** + * Resource name of the key to delete. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOAuth2KeyRequest. + * Use `create(DeleteOAuth2KeyRequestSchema)` to create a new message. + */ +export const DeleteOAuth2KeyRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 9); + +/** + * Response message for DeleteOAuth2Key RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOAuth2KeyResponse + */ +export type DeleteOAuth2KeyResponse = Message<"redpanda.api.aigateway.v1.DeleteOAuth2KeyResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOAuth2KeyResponse. + * Use `create(DeleteOAuth2KeyResponseSchema)` to create a new message. + */ +export const DeleteOAuth2KeyResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 10); + +/** + * Request message for RotateOAuth2Keys RPC. + * + * @generated from message redpanda.api.aigateway.v1.RotateOAuth2KeysRequest + */ +export type RotateOAuth2KeysRequest = Message<"redpanda.api.aigateway.v1.RotateOAuth2KeysRequest"> & { + /** + * Signing algorithm for the new key (default: RS256) + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2KeyAlgorithm algorithm = 1; + */ + algorithm: OAuth2KeyAlgorithm; + + /** + * Deactivate all existing active keys + * + * @generated from field: bool deactivate_existing = 2; + */ + deactivateExisting: boolean; + + /** + * Grace period in hours before deactivating old keys (default: 24) + * Old keys will be marked to expire after this period + * + * @generated from field: int32 grace_period_hours = 3; + */ + gracePeriodHours: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotateOAuth2KeysRequest. + * Use `create(RotateOAuth2KeysRequestSchema)` to create a new message. + */ +export const RotateOAuth2KeysRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 11); + +/** + * Response message for RotateOAuth2Keys RPC. + * + * @generated from message redpanda.api.aigateway.v1.RotateOAuth2KeysResponse + */ +export type RotateOAuth2KeysResponse = Message<"redpanda.api.aigateway.v1.RotateOAuth2KeysResponse"> & { + /** + * The newly created active key + * + * @generated from field: redpanda.api.aigateway.v1.OAuth2Key new_key = 1; + */ + newKey?: OAuth2Key; + + /** + * Keys that were deactivated + * + * @generated from field: repeated redpanda.api.aigateway.v1.OAuth2Key deactivated_keys = 2; + */ + deactivatedKeys: OAuth2Key[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotateOAuth2KeysResponse. + * Use `create(RotateOAuth2KeysResponseSchema)` to create a new message. + */ +export const RotateOAuth2KeysResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 12); + +/** + * Request message for GetJWKS RPC. + * + * Empty - JWKS is public + * + * @generated from message redpanda.api.aigateway.v1.GetJWKSRequest + */ +export type GetJWKSRequest = Message<"redpanda.api.aigateway.v1.GetJWKSRequest"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetJWKSRequest. + * Use `create(GetJWKSRequestSchema)` to create a new message. + */ +export const GetJWKSRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 13); + +/** + * Response message for GetJWKS RPC. + * Returns RFC 7517 compliant JWKS. + * + * @generated from message redpanda.api.aigateway.v1.GetJWKSResponse + */ +export type GetJWKSResponse = Message<"redpanda.api.aigateway.v1.GetJWKSResponse"> & { + /** + * JSON Web Key Set + * + * @generated from field: repeated redpanda.api.aigateway.v1.JSONWebKey keys = 1; + */ + keys: JSONWebKey[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetJWKSResponse. + * Use `create(GetJWKSResponseSchema)` to create a new message. + */ +export const GetJWKSResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 14); + +/** + * JSONWebKey represents a single key in JWKS format (RFC 7517). + * + * @generated from message redpanda.api.aigateway.v1.JSONWebKey + */ +export type JSONWebKey = Message<"redpanda.api.aigateway.v1.JSONWebKey"> & { + /** + * Key type (always "RSA" for our keys) + * + * @generated from field: string kty = 1; + */ + kty: string; + + /** + * Public key use ("sig" for signature) + * + * @generated from field: string use = 2; + */ + use: string; + + /** + * Key ID + * + * @generated from field: string kid = 3; + */ + kid: string; + + /** + * Algorithm (RS256, RS384, RS512) + * + * @generated from field: string alg = 4; + */ + alg: string; + + /** + * RSA modulus (Base64url encoded) + * + * @generated from field: string n = 5; + */ + n: string; + + /** + * RSA exponent (Base64url encoded) + * + * @generated from field: string e = 6; + */ + e: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.JSONWebKey. + * Use `create(JSONWebKeySchema)` to create a new message. + */ +export const JSONWebKeySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_oauth2_key, 15); + +/** + * OAuth2KeyAlgorithm defines supported signing algorithms. + * + * @generated from enum redpanda.api.aigateway.v1.OAuth2KeyAlgorithm + */ +export enum OAuth2KeyAlgorithm { + /** + * @generated from enum value: OAUTH2_KEY_ALGORITHM_UNSPECIFIED = 0; + */ + OAUTH2_KEY_ALGORITHM_UNSPECIFIED = 0, + + /** + * RSA PKCS#1 v1.5 with SHA-256 + * + * @generated from enum value: OAUTH2_KEY_ALGORITHM_RS256 = 1; + */ + OAUTH2_KEY_ALGORITHM_RS256 = 1, + + /** + * RSA PKCS#1 v1.5 with SHA-384 + * + * @generated from enum value: OAUTH2_KEY_ALGORITHM_RS384 = 2; + */ + OAUTH2_KEY_ALGORITHM_RS384 = 2, + + /** + * RSA PKCS#1 v1.5 with SHA-512 + * + * @generated from enum value: OAUTH2_KEY_ALGORITHM_RS512 = 3; + */ + OAUTH2_KEY_ALGORITHM_RS512 = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.OAuth2KeyAlgorithm. + */ +export const OAuth2KeyAlgorithmSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_oauth2_key, 0); + +/** + * OAuth2KeyService manages JWKS signing keys for OAuth2 tokens. + * Keys are used to sign and verify JWT access tokens. + * Resource name: oauth2/keys/{key_id} + * + * @generated from service redpanda.api.aigateway.v1.OAuth2KeyService + */ +export const OAuth2KeyService: GenService<{ + /** + * Creates a new signing key. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.CreateOAuth2Key + */ + createOAuth2Key: { + methodKind: "unary"; + input: typeof CreateOAuth2KeyRequestSchema; + output: typeof CreateOAuth2KeyResponseSchema; + }, + /** + * Gets a signing key by name. + * Note: Private key material is never returned. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.GetOAuth2Key + */ + getOAuth2Key: { + methodKind: "unary"; + input: typeof GetOAuth2KeyRequestSchema; + output: typeof GetOAuth2KeyResponseSchema; + }, + /** + * Lists signing keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.ListOAuth2Keys + */ + listOAuth2Keys: { + methodKind: "unary"; + input: typeof ListOAuth2KeysRequestSchema; + output: typeof ListOAuth2KeysResponseSchema; + }, + /** + * Deactivates a signing key. + * The key will no longer be used for signing new tokens. + * Existing tokens signed with this key remain valid until expiry. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.DeactivateOAuth2Key + */ + deactivateOAuth2Key: { + methodKind: "unary"; + input: typeof DeactivateOAuth2KeyRequestSchema; + output: typeof DeactivateOAuth2KeyResponseSchema; + }, + /** + * Deletes a signing key. + * WARNING: This will invalidate all tokens signed with this key. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.DeleteOAuth2Key + */ + deleteOAuth2Key: { + methodKind: "unary"; + input: typeof DeleteOAuth2KeyRequestSchema; + output: typeof DeleteOAuth2KeyResponseSchema; + }, + /** + * Rotates signing keys. + * Creates a new active key and optionally deactivates old keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.RotateOAuth2Keys + */ + rotateOAuth2Keys: { + methodKind: "unary"; + input: typeof RotateOAuth2KeysRequestSchema; + output: typeof RotateOAuth2KeysResponseSchema; + }, + /** + * Gets the JWKS (JSON Web Key Set) for token verification. + * This endpoint is public and returns only public keys. + * + * @generated from rpc redpanda.api.aigateway.v1.OAuth2KeyService.GetJWKS + */ + getJWKS: { + methodKind: "unary"; + input: typeof GetJWKSRequestSchema; + output: typeof GetJWKSResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_oauth2_key, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/organization-OrganizationService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/organization-OrganizationService_connectquery.ts new file mode 100644 index 0000000000..b56336e34d --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/organization-OrganizationService_connectquery.ts @@ -0,0 +1,40 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/organization.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { OrganizationService } from "./organization_pb"; + +/** + * Creates a new organization within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.CreateOrganization + */ +export const createOrganization = OrganizationService.method.createOrganization; + +/** + * Gets an organization by name. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.GetOrganization + */ +export const getOrganization = OrganizationService.method.getOrganization; + +/** + * Lists organizations within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.ListOrganizations + */ +export const listOrganizations = OrganizationService.method.listOrganizations; + +/** + * Updates an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization + */ +export const updateOrganization = OrganizationService.method.updateOrganization; + +/** + * Deletes an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization + */ +export const deleteOrganization = OrganizationService.method.deleteOrganization; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/organization_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/organization_pb.ts new file mode 100644 index 0000000000..e88f6f1721 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/organization_pb.ts @@ -0,0 +1,427 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/organization.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/organization.proto. + */ +export const file_redpanda_api_aigateway_v1_organization: GenFile = /*@__PURE__*/ + fileDesc("CixyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL29yZ2FuaXphdGlvbi5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSLeAwoMT3JnYW5pemF0aW9uEhEKBG5hbWUYASABKAlCA+BBCBIjCgxkaXNwbGF5X25hbWUYAiABKAlCDeBBArpIB3IFEAEY/wESGAoLZGVzY3JpcHRpb24YAyABKAlCA+BBARIPCgdlbmFibGVkGAQgASgIEkcKCG1ldGFkYXRhGAUgAygLMjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Pcmdhbml6YXRpb24uTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGAggASgJQgPgQQMSFAoHdXBkYXRlchgJIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpZ6kFWCiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09yZ2FuaXphdGlvbhIvYWNjb3VudHMve2FjY291bnR9L29yZ2FuaXphdGlvbnMve29yZ2FuaXphdGlvbn0irgEKGUNyZWF0ZU9yZ2FuaXphdGlvblJlcXVlc3QSNgoGcGFyZW50GAEgASgJQibgQQL6QSAKHmFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQWNjb3VudBJCCgxvcmdhbml6YXRpb24YAyABKAsyJy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9yZ2FuaXphdGlvbkID4EECSgQIAhADUg9vcmdhbml6YXRpb25faWQiWwoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USPQoMb3JnYW5pemF0aW9uGAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Pcmdhbml6YXRpb24iUwoWR2V0T3JnYW5pemF0aW9uUmVxdWVzdBI5CgRuYW1lGAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uIlgKF0dldE9yZ2FuaXphdGlvblJlc3BvbnNlEj0KDG9yZ2FuaXphdGlvbhgBIAEoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3JnYW5pemF0aW9uIrkBChhMaXN0T3JnYW5pemF0aW9uc1JlcXVlc3QSNgoGcGFyZW50GAEgASgJQibgQQL6QSAKHmFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQWNjb3VudBIgCglwYWdlX3NpemUYAiABKAVCDeBBAbpIBxoFGOgHKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhMKBmZpbHRlchgEIAEoCUID4EEBEhUKCG9yZGVyX2J5GAUgASgJQgPgQQEiiAEKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USPgoNb3JnYW5pemF0aW9ucxgBIAMoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3JnYW5pemF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIpUBChlVcGRhdGVPcmdhbml6YXRpb25SZXF1ZXN0EkIKDG9yZ2FuaXphdGlvbhgBIAEoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3JnYW5pemF0aW9uQgPgQQISNAoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgPgQQEiWwoaVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USPQoMb3JnYW5pemF0aW9uGAEgASgLMicucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Pcmdhbml6YXRpb24iagoZRGVsZXRlT3JnYW5pemF0aW9uUmVxdWVzdBI5CgRuYW1lGAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEhIKBWZvcmNlGAIgASgIQgPgQQEiHAoaRGVsZXRlT3JnYW5pemF0aW9uUmVzcG9uc2UyzAcKE09yZ2FuaXphdGlvblNlcnZpY2USvgEKEkNyZWF0ZU9yZ2FuaXphdGlvbhI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBo1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiO4LT5JMCNToMb3JnYW5pemF0aW9uIiUvdjEve3BhcmVudD1hY2NvdW50cy8qfS9vcmdhbml6YXRpb25zEqcBCg9HZXRPcmdhbml6YXRpb24SMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldE9yZ2FuaXphdGlvblJlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldE9yZ2FuaXphdGlvblJlc3BvbnNlIi2C0+STAicSJS92MS97bmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKn0SrQEKEUxpc3RPcmdhbml6YXRpb25zEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0T3JnYW5pemF0aW9uc1JlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UiLYLT5JMCJxIlL3YxL3twYXJlbnQ9YWNjb3VudHMvKn0vb3JnYW5pemF0aW9ucxLLAQoSVXBkYXRlT3JnYW5pemF0aW9uEjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVPcmdhbml6YXRpb25SZXF1ZXN0GjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVPcmdhbml6YXRpb25SZXNwb25zZSJIgtPkkwJCOgxvcmdhbml6YXRpb24yMi92MS97b3JnYW5pemF0aW9uLm5hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyp9ErABChJEZWxldGVPcmdhbml6YXRpb24SNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlcXVlc3QaNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlc3BvbnNlIi2C0+STAicqJS92MS97bmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKn0aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21ChgIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQhFPcmdhbml6YXRpb25Qcm90b1ABWktnby5wYW5kYS5kZXYvcmVkcGFuZGEtYWlndy9wcm90b3MvZ2VuL3JlZHBhbmRhL2FwaS9haWdhdGV3YXkvdjE7YWlnYXRld2F5djGiAgNSQUGqAhlSZWRwYW5kYS5BcGkuQWlnYXRld2F5LlYxygIZUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMeICJVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjFcR1BCTWV0YWRhdGHqAhxSZWRwYW5kYTo6QXBpOjpBaWdhdGV3YXk6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Organization represents a tenant boundary within an account. + * Organizations contain workspaces, teams, and users. + * + * @generated from message redpanda.api.aigateway.v1.Organization + */ +export type Organization = Message<"redpanda.api.aigateway.v1.Organization"> & { + /** + * Resource name. Format: `accounts/{account}/organizations/{organization}` + * Organization ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name (must be unique within account) + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Whether this organization is active + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 5; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 6; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 7; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 8; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 9; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Organization. + * Use `create(OrganizationSchema)` to create a new message. + */ +export const OrganizationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 0); + +/** + * Request message for CreateOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateOrganizationRequest + */ +export type CreateOrganizationRequest = Message<"redpanda.api.aigateway.v1.CreateOrganizationRequest"> & { + /** + * Required: Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Required: The organization resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Organization organization = 3; + */ + organization?: Organization; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOrganizationRequest. + * Use `create(CreateOrganizationRequestSchema)` to create a new message. + */ +export const CreateOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 1); + +/** + * Response message for CreateOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateOrganizationResponse + */ +export type CreateOrganizationResponse = Message<"redpanda.api.aigateway.v1.CreateOrganizationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Organization organization = 1; + */ + organization?: Organization; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateOrganizationResponse. + * Use `create(CreateOrganizationResponseSchema)` to create a new message. + */ +export const CreateOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 2); + +/** + * Request message for GetOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetOrganizationRequest + */ +export type GetOrganizationRequest = Message<"redpanda.api.aigateway.v1.GetOrganizationRequest"> & { + /** + * Resource name of the organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOrganizationRequest. + * Use `create(GetOrganizationRequestSchema)` to create a new message. + */ +export const GetOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 3); + +/** + * Response message for GetOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetOrganizationResponse + */ +export type GetOrganizationResponse = Message<"redpanda.api.aigateway.v1.GetOrganizationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Organization organization = 1; + */ + organization?: Organization; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetOrganizationResponse. + * Use `create(GetOrganizationResponseSchema)` to create a new message. + */ +export const GetOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 4); + +/** + * Request message for ListOrganizations RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOrganizationsRequest + */ +export type ListOrganizationsRequest = Message<"redpanda.api.aigateway.v1.ListOrganizationsRequest"> & { + /** + * Required: Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of organizations to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListOrganizations call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOrganizationsRequest. + * Use `create(ListOrganizationsRequestSchema)` to create a new message. + */ +export const ListOrganizationsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 5); + +/** + * Response message for ListOrganizations RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListOrganizationsResponse + */ +export type ListOrganizationsResponse = Message<"redpanda.api.aigateway.v1.ListOrganizationsResponse"> & { + /** + * The list of organizations + * + * @generated from field: repeated redpanda.api.aigateway.v1.Organization organizations = 1; + */ + organizations: Organization[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching organizations + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListOrganizationsResponse. + * Use `create(ListOrganizationsResponseSchema)` to create a new message. + */ +export const ListOrganizationsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 6); + +/** + * Request message for UpdateOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateOrganizationRequest + */ +export type UpdateOrganizationRequest = Message<"redpanda.api.aigateway.v1.UpdateOrganizationRequest"> & { + /** + * Required: The organization resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.Organization organization = 1; + */ + organization?: Organization; + + /** + * The fields to update. + * Allowed fields: display_name, description, enabled, metadata + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateOrganizationRequest. + * Use `create(UpdateOrganizationRequestSchema)` to create a new message. + */ +export const UpdateOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 7); + +/** + * Response message for UpdateOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateOrganizationResponse + */ +export type UpdateOrganizationResponse = Message<"redpanda.api.aigateway.v1.UpdateOrganizationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Organization organization = 1; + */ + organization?: Organization; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateOrganizationResponse. + * Use `create(UpdateOrganizationResponseSchema)` to create a new message. + */ +export const UpdateOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 8); + +/** + * Request message for DeleteOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOrganizationRequest + */ +export type DeleteOrganizationRequest = Message<"redpanda.api.aigateway.v1.DeleteOrganizationRequest"> & { + /** + * Resource name of the organization to delete. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all child resources (workspaces, teams, users, etc.) + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOrganizationRequest. + * Use `create(DeleteOrganizationRequestSchema)` to create a new message. + */ +export const DeleteOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 9); + +/** + * Response message for DeleteOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteOrganizationResponse + */ +export type DeleteOrganizationResponse = Message<"redpanda.api.aigateway.v1.DeleteOrganizationResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteOrganizationResponse. + * Use `create(DeleteOrganizationResponseSchema)` to create a new message. + */ +export const DeleteOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_organization, 10); + +/** + * OrganizationService manages organizations within accounts. + * An organization represents a tenant boundary (department, division) within an account. + * Resource name: accounts/{account_id}/organizations/{organization_id} + * + * @generated from service redpanda.api.aigateway.v1.OrganizationService + */ +export const OrganizationService: GenService<{ + /** + * Creates a new organization within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.CreateOrganization + */ + createOrganization: { + methodKind: "unary"; + input: typeof CreateOrganizationRequestSchema; + output: typeof CreateOrganizationResponseSchema; + }, + /** + * Gets an organization by name. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.GetOrganization + */ + getOrganization: { + methodKind: "unary"; + input: typeof GetOrganizationRequestSchema; + output: typeof GetOrganizationResponseSchema; + }, + /** + * Lists organizations within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.ListOrganizations + */ + listOrganizations: { + methodKind: "unary"; + input: typeof ListOrganizationsRequestSchema; + output: typeof ListOrganizationsResponseSchema; + }, + /** + * Updates an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.UpdateOrganization + */ + updateOrganization: { + methodKind: "unary"; + input: typeof UpdateOrganizationRequestSchema; + output: typeof UpdateOrganizationResponseSchema; + }, + /** + * Deletes an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.OrganizationService.DeleteOrganization + */ + deleteOrganization: { + methodKind: "unary"; + input: typeof DeleteOrganizationRequestSchema; + output: typeof DeleteOrganizationResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_organization, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/pricing-ModelPricingService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/pricing-ModelPricingService_connectquery.ts new file mode 100644 index 0000000000..658b320c31 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/pricing-ModelPricingService_connectquery.ts @@ -0,0 +1,65 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/pricing.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { ModelPricingService } from "./pricing_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice + */ +export const createStandardPrice = ModelPricingService.method.createStandardPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice + */ +export const getStandardPrice = ModelPricingService.method.getStandardPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices + */ +export const listStandardPrices = ModelPricingService.method.listStandardPrices; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice + */ +export const updateStandardPrice = ModelPricingService.method.updateStandardPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice + */ +export const deleteStandardPrice = ModelPricingService.method.deleteStandardPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice + */ +export const createCustomPrice = ModelPricingService.method.createCustomPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice + */ +export const getCustomPrice = ModelPricingService.method.getCustomPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices + */ +export const listCustomPrices = ModelPricingService.method.listCustomPrices; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice + */ +export const updateCustomPrice = ModelPricingService.method.updateCustomPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice + */ +export const deleteCustomPrice = ModelPricingService.method.deleteCustomPrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice + */ +export const getEffectivePrice = ModelPricingService.method.getEffectivePrice; + +/** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory + */ +export const listPriceHistory = ModelPricingService.method.listPriceHistory; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/pricing_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/pricing_pb.ts new file mode 100644 index 0000000000..895c39adb9 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/pricing_pb.ts @@ -0,0 +1,1083 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/pricing.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/pricing.proto. + */ +export const file_redpanda_api_aigateway_v1_pricing: GenFile = /*@__PURE__*/ + fileDesc("CidyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3ByaWNpbmcucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiXwobQ3JlYXRlU3RhbmRhcmRQcmljZVJlc3BvbnNlEkAKDnN0YW5kYXJkX3ByaWNlGAEgASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TdGFuZGFyZFByaWNlIlwKGEdldFN0YW5kYXJkUHJpY2VSZXNwb25zZRJACg5zdGFuZGFyZF9wcmljZRgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3RhbmRhcmRQcmljZSJfChtVcGRhdGVTdGFuZGFyZFByaWNlUmVzcG9uc2USQAoOc3RhbmRhcmRfcHJpY2UYASABKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlN0YW5kYXJkUHJpY2UiHQobRGVsZXRlU3RhbmRhcmRQcmljZVJlc3BvbnNlIlkKGUNyZWF0ZUN1c3RvbVByaWNlUmVzcG9uc2USPAoMY3VzdG9tX3ByaWNlGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DdXN0b21QcmljZSJWChZHZXRDdXN0b21QcmljZVJlc3BvbnNlEjwKDGN1c3RvbV9wcmljZRgBIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3VzdG9tUHJpY2UiWQoZVXBkYXRlQ3VzdG9tUHJpY2VSZXNwb25zZRI8CgxjdXN0b21fcHJpY2UYASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkN1c3RvbVByaWNlIhsKGURlbGV0ZUN1c3RvbVByaWNlUmVzcG9uc2UiXwoZR2V0RWZmZWN0aXZlUHJpY2VSZXNwb25zZRJCCg9lZmZlY3RpdmVfcHJpY2UYASABKAsyKS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkVmZmVjdGl2ZVByaWNlIu0GCg1TdGFuZGFyZFByaWNlEhEKBG5hbWUYASABKAlCA+BBCBIZCgxkaXNwbGF5X25hbWUYAiABKAlCA+BBAhIVCghwcm92aWRlchgDIAEoCUID4EECEhUKCG1vZGVsX2lkGAQgASgJQgPgQQISFQoIbW9kYWxpdHkYBSABKAlCA+BBAhIrCiNpbnB1dF90b2tlbl9wcmljZV9jZW50c19wZXJfbWlsbGlvbhgGIAEoAxIsCiRvdXRwdXRfdG9rZW5fcHJpY2VfY2VudHNfcGVyX21pbGxpb24YByABKAMSMQopY2FjaGVkX2lucHV0X3JlYWRfcHJpY2VfY2VudHNfcGVyX21pbGxpb24YCCABKAMSMgoqY2FjaGVkX2lucHV0X3dyaXRlX3ByaWNlX2NlbnRzX3Blcl9taWxsaW9uGAkgASgDEhEKCXVuaXRfdHlwZRgKIAEoCRIYChB1bml0X3ByaWNlX2NlbnRzGAsgASgDEhYKDmNvbnRleHRfd2luZG93GAwgASgFEhMKC2Rlc2NyaXB0aW9uGA0gASgJEjcKDmVmZmVjdGl2ZV9mcm9tGA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EECEjAKDGVmZmVjdGl2ZV90bxgPIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASSAoIbWV0YWRhdGEYECADKAsyNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlN0YW5kYXJkUHJpY2UuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgRIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgSIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGBMgASgJQgPgQQMSFAoHdXBkYXRlchgUIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpP6kFMCiRhaWdhdGV3YXkucmVkcGFuZGEuY29tL1N0YW5kYXJkUHJpY2USJHByaWNpbmcvc3RhbmRhcmQve3N0YW5kYXJkX3ByaWNlX2lkfSLsBgoLQ3VzdG9tUHJpY2USEQoEbmFtZRgBIAEoCUID4EEIEhkKDGRpc3BsYXlfbmFtZRgCIAEoCUID4EECEhgKC2N1c3RvbWVyX2lkGAMgASgJQgPgQQISFQoIcHJvdmlkZXIYBCABKAlCA+BBAhIVCghtb2RlbF9pZBgFIAEoCUID4EECEhUKCG1vZGFsaXR5GAYgASgJQgPgQQISKwojaW5wdXRfdG9rZW5fcHJpY2VfY2VudHNfcGVyX21pbGxpb24YByABKAMSLAokb3V0cHV0X3Rva2VuX3ByaWNlX2NlbnRzX3Blcl9taWxsaW9uGAggASgDEjEKKWNhY2hlZF9pbnB1dF9yZWFkX3ByaWNlX2NlbnRzX3Blcl9taWxsaW9uGAkgASgDEjIKKmNhY2hlZF9pbnB1dF93cml0ZV9wcmljZV9jZW50c19wZXJfbWlsbGlvbhgKIAEoAxIRCgl1bml0X3R5cGUYCyABKAkSGAoQdW5pdF9wcmljZV9jZW50cxgMIAEoAxI3Cg5lZmZlY3RpdmVfZnJvbRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAhIwCgxlZmZlY3RpdmVfdG8YDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhoKEmNvbnRyYWN0X3JlZmVyZW5jZRgPIAEoCRJGCghtZXRhZGF0YRgQIAMoCzI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3VzdG9tUHJpY2UuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgRIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgSIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGBMgASgJQgPgQQMSFAoHdXBkYXRlchgUIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpJ6kFGCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0N1c3RvbVByaWNlEiBwcmljaW5nL2N1c3RvbS97Y3VzdG9tX3ByaWNlX2lkfSK6AwoORWZmZWN0aXZlUHJpY2USEAoIcHJvdmlkZXIYASABKAkSEAoIbW9kZWxfaWQYAiABKAkSEAoIbW9kYWxpdHkYAyABKAkSKwojaW5wdXRfdG9rZW5fcHJpY2VfY2VudHNfcGVyX21pbGxpb24YBCABKAMSLAokb3V0cHV0X3Rva2VuX3ByaWNlX2NlbnRzX3Blcl9taWxsaW9uGAUgASgDEjEKKWNhY2hlZF9pbnB1dF9yZWFkX3ByaWNlX2NlbnRzX3Blcl9taWxsaW9uGAYgASgDEjIKKmNhY2hlZF9pbnB1dF93cml0ZV9wcmljZV9jZW50c19wZXJfbWlsbGlvbhgHIAEoAxIRCgl1bml0X3R5cGUYCCABKAkSGAoQdW5pdF9wcmljZV9jZW50cxgJIAEoAxI2CgZzb3VyY2UYCiABKA4yJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlByaWNlU291cmNlEhkKEXByaWNlX3JlY29yZF9uYW1lGAsgASgJEjAKDGVmZmVjdGl2ZV9hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAifgoaQ3JlYXRlU3RhbmRhcmRQcmljZVJlcXVlc3QSGQoRc3RhbmRhcmRfcHJpY2VfaWQYASABKAkSRQoOc3RhbmRhcmRfcHJpY2UYAiABKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlN0YW5kYXJkUHJpY2VCA+BBAiJVChdHZXRTdGFuZGFyZFByaWNlUmVxdWVzdBI6CgRuYW1lGAEgASgJQizgQQL6QSYKJGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vU3RhbmRhcmRQcmljZSJkChlMaXN0U3RhbmRhcmRQcmljZXNSZXF1ZXN0EhEKCXBhZ2Vfc2l6ZRgBIAEoBRISCgpwYWdlX3Rva2VuGAIgASgJEg4KBmZpbHRlchgDIAEoCRIQCghvcmRlcl9ieRgEIAEoCSKMAQoaTGlzdFN0YW5kYXJkUHJpY2VzUmVzcG9uc2USQQoPc3RhbmRhcmRfcHJpY2VzGAEgAygLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TdGFuZGFyZFByaWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIpQBChpVcGRhdGVTdGFuZGFyZFByaWNlUmVxdWVzdBJFCg5zdGFuZGFyZF9wcmljZRgBIAEoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3RhbmRhcmRQcmljZUID4EECEi8KC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayJYChpEZWxldGVTdGFuZGFyZFByaWNlUmVxdWVzdBI6CgRuYW1lGAEgASgJQizgQQL6QSYKJGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vU3RhbmRhcmRQcmljZSJ2ChhDcmVhdGVDdXN0b21QcmljZVJlcXVlc3QSFwoPY3VzdG9tX3ByaWNlX2lkGAEgASgJEkEKDGN1c3RvbV9wcmljZRgCIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3VzdG9tUHJpY2VCA+BBAiJRChVHZXRDdXN0b21QcmljZVJlcXVlc3QSOAoEbmFtZRgBIAEoCUIq4EEC+kEkCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0N1c3RvbVByaWNlImIKF0xpc3RDdXN0b21QcmljZXNSZXF1ZXN0EhEKCXBhZ2Vfc2l6ZRgBIAEoBRISCgpwYWdlX3Rva2VuGAIgASgJEg4KBmZpbHRlchgDIAEoCRIQCghvcmRlcl9ieRgEIAEoCSKGAQoYTGlzdEN1c3RvbVByaWNlc1Jlc3BvbnNlEj0KDWN1c3RvbV9wcmljZXMYASADKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkN1c3RvbVByaWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIo4BChhVcGRhdGVDdXN0b21QcmljZVJlcXVlc3QSQQoMY3VzdG9tX3ByaWNlGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DdXN0b21QcmljZUID4EECEi8KC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayJUChhEZWxldGVDdXN0b21QcmljZVJlcXVlc3QSOAoEbmFtZRgBIAEoCUIq4EEC+kEkCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0N1c3RvbVByaWNlIqYBChhHZXRFZmZlY3RpdmVQcmljZVJlcXVlc3QSFQoIcHJvdmlkZXIYASABKAlCA+BBAhIVCghtb2RlbF9pZBgCIAEoCUID4EECEhUKCG1vZGFsaXR5GAMgASgJQgPgQQISEwoLY3VzdG9tZXJfaWQYBCABKAkSMAoMZWZmZWN0aXZlX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJnChdMaXN0UHJpY2VIaXN0b3J5UmVxdWVzdBITCgZwYXJlbnQYASABKAlCA+BBAhIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCRIQCghvcmRlcl9ieRgEIAEoCSLJAQoYTGlzdFByaWNlSGlzdG9yeVJlc3BvbnNlEkEKD3N0YW5kYXJkX3ByaWNlcxgBIAMoCzIoLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3RhbmRhcmRQcmljZRI9Cg1jdXN0b21fcHJpY2VzGAIgAygLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DdXN0b21QcmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAyABKAkSEgoKdG90YWxfc2l6ZRgEIAEoBSp5CgtQcmljZVNvdXJjZRIcChhQUklDRV9TT1VSQ0VfVU5TUEVDSUZJRUQQABIZChVQUklDRV9TT1VSQ0VfU1RBTkRBUkQQARIXChNQUklDRV9TT1VSQ0VfQ1VTVE9NEAISGAoUUFJJQ0VfU09VUkNFX0RFRkFVTFQQAzLTEAoTTW9kZWxQcmljaW5nU2VydmljZRKyAQoTQ3JlYXRlU3RhbmRhcmRQcmljZRI1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlU3RhbmRhcmRQcmljZVJlcXVlc3QaNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZVN0YW5kYXJkUHJpY2VSZXNwb25zZSIsgtPkkwImOg5zdGFuZGFyZF9wcmljZSIUL3YxL3ByaWNpbmcvc3RhbmRhcmQSogEKEEdldFN0YW5kYXJkUHJpY2USMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFN0YW5kYXJkUHJpY2VSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRTdGFuZGFyZFByaWNlUmVzcG9uc2UiJYLT5JMCHxIdL3YxL3tuYW1lPXByaWNpbmcvc3RhbmRhcmQvKn0SnwEKEkxpc3RTdGFuZGFyZFByaWNlcxI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFN0YW5kYXJkUHJpY2VzUmVxdWVzdBo1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFN0YW5kYXJkUHJpY2VzUmVzcG9uc2UiHILT5JMCFhIUL3YxL3ByaWNpbmcvc3RhbmRhcmQSygEKE1VwZGF0ZVN0YW5kYXJkUHJpY2USNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVN0YW5kYXJkUHJpY2VSZXF1ZXN0GjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVTdGFuZGFyZFByaWNlUmVzcG9uc2UiRILT5JMCPjoOc3RhbmRhcmRfcHJpY2UyLC92MS97c3RhbmRhcmRfcHJpY2UubmFtZT1wcmljaW5nL3N0YW5kYXJkLyp9EqsBChNEZWxldGVTdGFuZGFyZFByaWNlEjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVTdGFuZGFyZFByaWNlUmVxdWVzdBo2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlU3RhbmRhcmRQcmljZVJlc3BvbnNlIiWC0+STAh8qHS92MS97bmFtZT1wcmljaW5nL3N0YW5kYXJkLyp9EqgBChFDcmVhdGVDdXN0b21QcmljZRIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlQ3VzdG9tUHJpY2VSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVDdXN0b21QcmljZVJlc3BvbnNlIiiC0+STAiI6DGN1c3RvbV9wcmljZSISL3YxL3ByaWNpbmcvY3VzdG9tEpoBCg5HZXRDdXN0b21QcmljZRIwLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0Q3VzdG9tUHJpY2VSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRDdXN0b21QcmljZVJlc3BvbnNlIiOC0+STAh0SGy92MS97bmFtZT1wcmljaW5nL2N1c3RvbS8qfRKXAQoQTGlzdEN1c3RvbVByaWNlcxIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdEN1c3RvbVByaWNlc1JlcXVlc3QaMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RDdXN0b21QcmljZXNSZXNwb25zZSIagtPkkwIUEhIvdjEvcHJpY2luZy9jdXN0b20SvgEKEVVwZGF0ZUN1c3RvbVByaWNlEjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVDdXN0b21QcmljZVJlcXVlc3QaNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUN1c3RvbVByaWNlUmVzcG9uc2UiPoLT5JMCODoMY3VzdG9tX3ByaWNlMigvdjEve2N1c3RvbV9wcmljZS5uYW1lPXByaWNpbmcvY3VzdG9tLyp9EqMBChFEZWxldGVDdXN0b21QcmljZRIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlQ3VzdG9tUHJpY2VSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVDdXN0b21QcmljZVJlc3BvbnNlIiOC0+STAh0qGy92MS97bmFtZT1wcmljaW5nL2N1c3RvbS8qfRKjAQoRR2V0RWZmZWN0aXZlUHJpY2USMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldEVmZmVjdGl2ZVByaWNlUmVxdWVzdBo0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0RWZmZWN0aXZlUHJpY2VSZXNwb25zZSIjgtPkkwIdOgEqIhgvdjEvcHJpY2luZzpnZXRFZmZlY3RpdmUS1QEKEExpc3RQcmljZUhpc3RvcnkSMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RQcmljZUhpc3RvcnlSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UHJpY2VIaXN0b3J5UmVzcG9uc2UiWILT5JMCUlonEiUvdjEve3BhcmVudD1wcmljaW5nL2N1c3RvbS8qfS9oaXN0b3J5EicvdjEve3BhcmVudD1wcmljaW5nL3N0YW5kYXJkLyp9L2hpc3RvcnlCgQIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQgxQcmljaW5nUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateStandardPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateStandardPriceResponse + */ +export type CreateStandardPriceResponse = Message<"redpanda.api.aigateway.v1.CreateStandardPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.StandardPrice standard_price = 1; + */ + standardPrice?: StandardPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateStandardPriceResponse. + * Use `create(CreateStandardPriceResponseSchema)` to create a new message. + */ +export const CreateStandardPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 0); + +/** + * Response message for GetStandardPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetStandardPriceResponse + */ +export type GetStandardPriceResponse = Message<"redpanda.api.aigateway.v1.GetStandardPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.StandardPrice standard_price = 1; + */ + standardPrice?: StandardPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetStandardPriceResponse. + * Use `create(GetStandardPriceResponseSchema)` to create a new message. + */ +export const GetStandardPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 1); + +/** + * Response message for UpdateStandardPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateStandardPriceResponse + */ +export type UpdateStandardPriceResponse = Message<"redpanda.api.aigateway.v1.UpdateStandardPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.StandardPrice standard_price = 1; + */ + standardPrice?: StandardPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateStandardPriceResponse. + * Use `create(UpdateStandardPriceResponseSchema)` to create a new message. + */ +export const UpdateStandardPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 2); + +/** + * Response message for DeleteStandardPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteStandardPriceResponse + */ +export type DeleteStandardPriceResponse = Message<"redpanda.api.aigateway.v1.DeleteStandardPriceResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteStandardPriceResponse. + * Use `create(DeleteStandardPriceResponseSchema)` to create a new message. + */ +export const DeleteStandardPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 3); + +/** + * Response message for CreateCustomPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateCustomPriceResponse + */ +export type CreateCustomPriceResponse = Message<"redpanda.api.aigateway.v1.CreateCustomPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.CustomPrice custom_price = 1; + */ + customPrice?: CustomPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateCustomPriceResponse. + * Use `create(CreateCustomPriceResponseSchema)` to create a new message. + */ +export const CreateCustomPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 4); + +/** + * Response message for GetCustomPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetCustomPriceResponse + */ +export type GetCustomPriceResponse = Message<"redpanda.api.aigateway.v1.GetCustomPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.CustomPrice custom_price = 1; + */ + customPrice?: CustomPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetCustomPriceResponse. + * Use `create(GetCustomPriceResponseSchema)` to create a new message. + */ +export const GetCustomPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 5); + +/** + * Response message for UpdateCustomPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateCustomPriceResponse + */ +export type UpdateCustomPriceResponse = Message<"redpanda.api.aigateway.v1.UpdateCustomPriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.CustomPrice custom_price = 1; + */ + customPrice?: CustomPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateCustomPriceResponse. + * Use `create(UpdateCustomPriceResponseSchema)` to create a new message. + */ +export const UpdateCustomPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 6); + +/** + * Response message for DeleteCustomPrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteCustomPriceResponse + */ +export type DeleteCustomPriceResponse = Message<"redpanda.api.aigateway.v1.DeleteCustomPriceResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteCustomPriceResponse. + * Use `create(DeleteCustomPriceResponseSchema)` to create a new message. + */ +export const DeleteCustomPriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 7); + +/** + * Response message for GetEffectivePrice RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetEffectivePriceResponse + */ +export type GetEffectivePriceResponse = Message<"redpanda.api.aigateway.v1.GetEffectivePriceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.EffectivePrice effective_price = 1; + */ + effectivePrice?: EffectivePrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetEffectivePriceResponse. + * Use `create(GetEffectivePriceResponseSchema)` to create a new message. + */ +export const GetEffectivePriceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 8); + +/** + * StandardPrice represents public/default pricing for a model. + * Supports multiple pricing dimensions: token-based (chat, embeddings) and unit-based (images, audio). + * + * @generated from message redpanda.api.aigateway.v1.StandardPrice + */ +export type StandardPrice = Message<"redpanda.api.aigateway.v1.StandardPrice"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Model identification + * + * e.g., "openai", "anthropic" + * + * @generated from field: string provider = 3; + */ + provider: string; + + /** + * e.g., "gpt-4o", "claude-3-5-haiku-20241022" + * + * @generated from field: string model_id = 4; + */ + modelId: string; + + /** + * API type - determines which pricing dimensions apply + * + * "chat", "batch", "embedding", "image", "audio" + * + * @generated from field: string modality = 5; + */ + modality: string; + + /** + * TOKEN-BASED PRICING (for chat, batch, embeddings) + * Standard tokens (always present for token-based APIs) + * + * @generated from field: int64 input_token_price_cents_per_million = 6; + */ + inputTokenPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 output_token_price_cents_per_million = 7; + */ + outputTokenPriceCentsPerMillion: bigint; + + /** + * Cached tokens (Anthropic prompt caching) + * - cached_input_read: 90% discount for cache hits + * - cached_input_write: 25% markup for cache creation + * + * @generated from field: int64 cached_input_read_price_cents_per_million = 8; + */ + cachedInputReadPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 cached_input_write_price_cents_per_million = 9; + */ + cachedInputWritePriceCentsPerMillion: bigint; + + /** + * UNIT-BASED PRICING (for images, audio, etc.) + * Used when pricing is not per-token (e.g., flat fee per image) + * + * "image", "audio_second", "character", null for tokens + * + * @generated from field: string unit_type = 10; + */ + unitType: string; + + /** + * Flat fee per unit + * + * @generated from field: int64 unit_price_cents = 11; + */ + unitPriceCents: bigint; + + /** + * Optional: Context window size for reference + * + * @generated from field: int32 context_window = 12; + */ + contextWindow: number; + + /** + * Optional: Model description + * + * @generated from field: string description = 13; + */ + description: string; + + /** + * Versioning: Effective date range + * + * @generated from field: google.protobuf.Timestamp effective_from = 14; + */ + effectiveFrom?: Timestamp; + + /** + * NULL = currently active + * + * @generated from field: google.protobuf.Timestamp effective_to = 15; + */ + effectiveTo?: Timestamp; + + /** + * Metadata + * + * @generated from field: map metadata = 16; + */ + metadata: { [key: string]: string }; + + /** + * Audit fields + * + * @generated from field: google.protobuf.Timestamp create_time = 17; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 18; + */ + updateTime?: Timestamp; + + /** + * @generated from field: string creator = 19; + */ + creator: string; + + /** + * @generated from field: string updater = 20; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.StandardPrice. + * Use `create(StandardPriceSchema)` to create a new message. + */ +export const StandardPriceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 9); + +/** + * CustomPrice represents customer-specific pricing overrides. + * Allows negotiated pricing per organization/tenant with same dimensions as StandardPrice. + * + * @generated from message redpanda.api.aigateway.v1.CustomPrice + */ +export type CustomPrice = Message<"redpanda.api.aigateway.v1.CustomPrice"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Customer identifier (e.g., org_id, tenant_id from OIDC claims) + * + * @generated from field: string customer_id = 3; + */ + customerId: string; + + /** + * Model identification + * + * @generated from field: string provider = 4; + */ + provider: string; + + /** + * @generated from field: string model_id = 5; + */ + modelId: string; + + /** + * @generated from field: string modality = 6; + */ + modality: string; + + /** + * TOKEN-BASED PRICING + * + * @generated from field: int64 input_token_price_cents_per_million = 7; + */ + inputTokenPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 output_token_price_cents_per_million = 8; + */ + outputTokenPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 cached_input_read_price_cents_per_million = 9; + */ + cachedInputReadPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 cached_input_write_price_cents_per_million = 10; + */ + cachedInputWritePriceCentsPerMillion: bigint; + + /** + * UNIT-BASED PRICING + * + * @generated from field: string unit_type = 11; + */ + unitType: string; + + /** + * @generated from field: int64 unit_price_cents = 12; + */ + unitPriceCents: bigint; + + /** + * Versioning: Effective date range + * + * @generated from field: google.protobuf.Timestamp effective_from = 13; + */ + effectiveFrom?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp effective_to = 14; + */ + effectiveTo?: Timestamp; + + /** + * Optional: Contract/agreement reference + * + * @generated from field: string contract_reference = 15; + */ + contractReference: string; + + /** + * Metadata + * + * @generated from field: map metadata = 16; + */ + metadata: { [key: string]: string }; + + /** + * Audit fields + * + * @generated from field: google.protobuf.Timestamp create_time = 17; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 18; + */ + updateTime?: Timestamp; + + /** + * @generated from field: string creator = 19; + */ + creator: string; + + /** + * @generated from field: string updater = 20; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CustomPrice. + * Use `create(CustomPriceSchema)` to create a new message. + */ +export const CustomPriceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 10); + +/** + * EffectivePrice is the resolved price for a specific request. + * Returns the applicable pricing based on priority: Custom > Standard > Default. + * + * @generated from message redpanda.api.aigateway.v1.EffectivePrice + */ +export type EffectivePrice = Message<"redpanda.api.aigateway.v1.EffectivePrice"> & { + /** + * @generated from field: string provider = 1; + */ + provider: string; + + /** + * @generated from field: string model_id = 2; + */ + modelId: string; + + /** + * @generated from field: string modality = 3; + */ + modality: string; + + /** + * TOKEN-BASED PRICING + * + * @generated from field: int64 input_token_price_cents_per_million = 4; + */ + inputTokenPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 output_token_price_cents_per_million = 5; + */ + outputTokenPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 cached_input_read_price_cents_per_million = 6; + */ + cachedInputReadPriceCentsPerMillion: bigint; + + /** + * @generated from field: int64 cached_input_write_price_cents_per_million = 7; + */ + cachedInputWritePriceCentsPerMillion: bigint; + + /** + * UNIT-BASED PRICING + * + * @generated from field: string unit_type = 8; + */ + unitType: string; + + /** + * @generated from field: int64 unit_price_cents = 9; + */ + unitPriceCents: bigint; + + /** + * Which price was used + * + * @generated from field: redpanda.api.aigateway.v1.PriceSource source = 10; + */ + source: PriceSource; + + /** + * Reference to the pricing record used + * + * @generated from field: string price_record_name = 11; + */ + priceRecordName: string; + + /** + * Timestamp used for price lookup + * + * @generated from field: google.protobuf.Timestamp effective_at = 12; + */ + effectiveAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EffectivePrice. + * Use `create(EffectivePriceSchema)` to create a new message. + */ +export const EffectivePriceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 11); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateStandardPriceRequest + */ +export type CreateStandardPriceRequest = Message<"redpanda.api.aigateway.v1.CreateStandardPriceRequest"> & { + /** + * @generated from field: string standard_price_id = 1; + */ + standardPriceId: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.StandardPrice standard_price = 2; + */ + standardPrice?: StandardPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateStandardPriceRequest. + * Use `create(CreateStandardPriceRequestSchema)` to create a new message. + */ +export const CreateStandardPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 12); + +/** + * @generated from message redpanda.api.aigateway.v1.GetStandardPriceRequest + */ +export type GetStandardPriceRequest = Message<"redpanda.api.aigateway.v1.GetStandardPriceRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetStandardPriceRequest. + * Use `create(GetStandardPriceRequestSchema)` to create a new message. + */ +export const GetStandardPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 13); + +/** + * @generated from message redpanda.api.aigateway.v1.ListStandardPricesRequest + */ +export type ListStandardPricesRequest = Message<"redpanda.api.aigateway.v1.ListStandardPricesRequest"> & { + /** + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 2; + */ + pageToken: string; + + /** + * Filter by provider, model_id, modality, or effective date + * Examples: + * provider = "openai" + * model_id = "gpt-4o" + * modality = "chat" + * effective_from <= timestamp("2025-01-15T00:00:00Z") AND (effective_to > timestamp("2025-01-15T00:00:00Z") OR effective_to = null) + * + * @generated from field: string filter = 3; + */ + filter: string; + + /** + * @generated from field: string order_by = 4; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListStandardPricesRequest. + * Use `create(ListStandardPricesRequestSchema)` to create a new message. + */ +export const ListStandardPricesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 14); + +/** + * @generated from message redpanda.api.aigateway.v1.ListStandardPricesResponse + */ +export type ListStandardPricesResponse = Message<"redpanda.api.aigateway.v1.ListStandardPricesResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.StandardPrice standard_prices = 1; + */ + standardPrices: StandardPrice[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListStandardPricesResponse. + * Use `create(ListStandardPricesResponseSchema)` to create a new message. + */ +export const ListStandardPricesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 15); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateStandardPriceRequest + */ +export type UpdateStandardPriceRequest = Message<"redpanda.api.aigateway.v1.UpdateStandardPriceRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.StandardPrice standard_price = 1; + */ + standardPrice?: StandardPrice; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateStandardPriceRequest. + * Use `create(UpdateStandardPriceRequestSchema)` to create a new message. + */ +export const UpdateStandardPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 16); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteStandardPriceRequest + */ +export type DeleteStandardPriceRequest = Message<"redpanda.api.aigateway.v1.DeleteStandardPriceRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteStandardPriceRequest. + * Use `create(DeleteStandardPriceRequestSchema)` to create a new message. + */ +export const DeleteStandardPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 17); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateCustomPriceRequest + */ +export type CreateCustomPriceRequest = Message<"redpanda.api.aigateway.v1.CreateCustomPriceRequest"> & { + /** + * @generated from field: string custom_price_id = 1; + */ + customPriceId: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.CustomPrice custom_price = 2; + */ + customPrice?: CustomPrice; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateCustomPriceRequest. + * Use `create(CreateCustomPriceRequestSchema)` to create a new message. + */ +export const CreateCustomPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 18); + +/** + * @generated from message redpanda.api.aigateway.v1.GetCustomPriceRequest + */ +export type GetCustomPriceRequest = Message<"redpanda.api.aigateway.v1.GetCustomPriceRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetCustomPriceRequest. + * Use `create(GetCustomPriceRequestSchema)` to create a new message. + */ +export const GetCustomPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 19); + +/** + * @generated from message redpanda.api.aigateway.v1.ListCustomPricesRequest + */ +export type ListCustomPricesRequest = Message<"redpanda.api.aigateway.v1.ListCustomPricesRequest"> & { + /** + * @generated from field: int32 page_size = 1; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 2; + */ + pageToken: string; + + /** + * Filter by customer_id, provider, model_id, modality, or effective date + * + * @generated from field: string filter = 3; + */ + filter: string; + + /** + * @generated from field: string order_by = 4; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListCustomPricesRequest. + * Use `create(ListCustomPricesRequestSchema)` to create a new message. + */ +export const ListCustomPricesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 20); + +/** + * @generated from message redpanda.api.aigateway.v1.ListCustomPricesResponse + */ +export type ListCustomPricesResponse = Message<"redpanda.api.aigateway.v1.ListCustomPricesResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.CustomPrice custom_prices = 1; + */ + customPrices: CustomPrice[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListCustomPricesResponse. + * Use `create(ListCustomPricesResponseSchema)` to create a new message. + */ +export const ListCustomPricesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 21); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateCustomPriceRequest + */ +export type UpdateCustomPriceRequest = Message<"redpanda.api.aigateway.v1.UpdateCustomPriceRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.CustomPrice custom_price = 1; + */ + customPrice?: CustomPrice; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateCustomPriceRequest. + * Use `create(UpdateCustomPriceRequestSchema)` to create a new message. + */ +export const UpdateCustomPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 22); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteCustomPriceRequest + */ +export type DeleteCustomPriceRequest = Message<"redpanda.api.aigateway.v1.DeleteCustomPriceRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteCustomPriceRequest. + * Use `create(DeleteCustomPriceRequestSchema)` to create a new message. + */ +export const DeleteCustomPriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 23); + +/** + * @generated from message redpanda.api.aigateway.v1.GetEffectivePriceRequest + */ +export type GetEffectivePriceRequest = Message<"redpanda.api.aigateway.v1.GetEffectivePriceRequest"> & { + /** + * @generated from field: string provider = 1; + */ + provider: string; + + /** + * @generated from field: string model_id = 2; + */ + modelId: string; + + /** + * "chat", "batch", "embedding", etc. + * + * @generated from field: string modality = 3; + */ + modality: string; + + /** + * Optional: Customer ID for custom pricing lookup + * + * @generated from field: string customer_id = 4; + */ + customerId: string; + + /** + * Optional: Timestamp for historical price lookup (defaults to NOW) + * + * @generated from field: google.protobuf.Timestamp effective_at = 5; + */ + effectiveAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetEffectivePriceRequest. + * Use `create(GetEffectivePriceRequestSchema)` to create a new message. + */ +export const GetEffectivePriceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 24); + +/** + * @generated from message redpanda.api.aigateway.v1.ListPriceHistoryRequest + */ +export type ListPriceHistoryRequest = Message<"redpanda.api.aigateway.v1.ListPriceHistoryRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Default: "effective_from desc" + * + * @generated from field: string order_by = 4; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPriceHistoryRequest. + * Use `create(ListPriceHistoryRequestSchema)` to create a new message. + */ +export const ListPriceHistoryRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 25); + +/** + * @generated from message redpanda.api.aigateway.v1.ListPriceHistoryResponse + */ +export type ListPriceHistoryResponse = Message<"redpanda.api.aigateway.v1.ListPriceHistoryResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.StandardPrice standard_prices = 1; + */ + standardPrices: StandardPrice[]; + + /** + * @generated from field: repeated redpanda.api.aigateway.v1.CustomPrice custom_prices = 2; + */ + customPrices: CustomPrice[]; + + /** + * @generated from field: string next_page_token = 3; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 4; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListPriceHistoryResponse. + * Use `create(ListPriceHistoryResponseSchema)` to create a new message. + */ +export const ListPriceHistoryResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_pricing, 26); + +/** + * @generated from enum redpanda.api.aigateway.v1.PriceSource + */ +export enum PriceSource { + /** + * @generated from enum value: PRICE_SOURCE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Standard/public pricing + * + * @generated from enum value: PRICE_SOURCE_STANDARD = 1; + */ + STANDARD = 1, + + /** + * Customer-specific override + * + * @generated from enum value: PRICE_SOURCE_CUSTOM = 2; + */ + CUSTOM = 2, + + /** + * Fallback default when no price found + * + * @generated from enum value: PRICE_SOURCE_DEFAULT = 3; + */ + DEFAULT = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.PriceSource. + */ +export const PriceSourceSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_pricing, 0); + +/** + * Standard Pricing Operations + * + * @generated from service redpanda.api.aigateway.v1.ModelPricingService + */ +export const ModelPricingService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.CreateStandardPrice + */ + createStandardPrice: { + methodKind: "unary"; + input: typeof CreateStandardPriceRequestSchema; + output: typeof CreateStandardPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetStandardPrice + */ + getStandardPrice: { + methodKind: "unary"; + input: typeof GetStandardPriceRequestSchema; + output: typeof GetStandardPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListStandardPrices + */ + listStandardPrices: { + methodKind: "unary"; + input: typeof ListStandardPricesRequestSchema; + output: typeof ListStandardPricesResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.UpdateStandardPrice + */ + updateStandardPrice: { + methodKind: "unary"; + input: typeof UpdateStandardPriceRequestSchema; + output: typeof UpdateStandardPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.DeleteStandardPrice + */ + deleteStandardPrice: { + methodKind: "unary"; + input: typeof DeleteStandardPriceRequestSchema; + output: typeof DeleteStandardPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.CreateCustomPrice + */ + createCustomPrice: { + methodKind: "unary"; + input: typeof CreateCustomPriceRequestSchema; + output: typeof CreateCustomPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetCustomPrice + */ + getCustomPrice: { + methodKind: "unary"; + input: typeof GetCustomPriceRequestSchema; + output: typeof GetCustomPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListCustomPrices + */ + listCustomPrices: { + methodKind: "unary"; + input: typeof ListCustomPricesRequestSchema; + output: typeof ListCustomPricesResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.UpdateCustomPrice + */ + updateCustomPrice: { + methodKind: "unary"; + input: typeof UpdateCustomPriceRequestSchema; + output: typeof UpdateCustomPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.DeleteCustomPrice + */ + deleteCustomPrice: { + methodKind: "unary"; + input: typeof DeleteCustomPriceRequestSchema; + output: typeof DeleteCustomPriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.GetEffectivePrice + */ + getEffectivePrice: { + methodKind: "unary"; + input: typeof GetEffectivePriceRequestSchema; + output: typeof GetEffectivePriceResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.ModelPricingService.ListPriceHistory + */ + listPriceHistory: { + methodKind: "unary"; + input: typeof ListPriceHistoryRequestSchema; + output: typeof ListPriceHistoryResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_pricing, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config-ProviderConfigService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config-ProviderConfigService_connectquery.ts new file mode 100644 index 0000000000..3544994737 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config-ProviderConfigService_connectquery.ts @@ -0,0 +1,49 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/provider_config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { ProviderConfigService } from "./provider_config_pb"; + +/** + * Creates a new provider configuration. + * The configuration is encrypted at rest using the control plane encryption key. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig + */ +export const createProviderConfig = ProviderConfigService.method.createProviderConfig; + +/** + * Gets a provider configuration by name. + * Note: Sensitive fields are masked in the response. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig + */ +export const getProviderConfig = ProviderConfigService.method.getProviderConfig; + +/** + * Lists provider configurations. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs + */ +export const listProviderConfigs = ProviderConfigService.method.listProviderConfigs; + +/** + * Updates a provider configuration. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig + */ +export const updateProviderConfig = ProviderConfigService.method.updateProviderConfig; + +/** + * Deletes a provider configuration. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig + */ +export const deleteProviderConfig = ProviderConfigService.method.deleteProviderConfig; + +/** + * Tests a provider configuration by attempting to authenticate with the provider. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig + */ +export const testProviderConfig = ProviderConfigService.method.testProviderConfig; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config_pb.ts new file mode 100644 index 0000000000..23b3f8c24b --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/provider_config_pb.ts @@ -0,0 +1,785 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/provider_config.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/provider_config.proto. + */ +export const file_redpanda_api_aigateway_v1_provider_config: GenFile = /*@__PURE__*/ + fileDesc("Ci9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3Byb3ZpZGVyX2NvbmZpZy5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSLuBgoOUHJvdmlkZXJDb25maWcSEQoEbmFtZRgBIAEoCUID4EEIEhwKBWxhYmVsGAIgASgJQg3gQQK6SAdyBRABGP8BEkcKC2NvbmZpZ190eXBlGAMgASgOMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Qcm92aWRlckNvbmZpZ1R5cGVCA+BBAhJBCg5hcGlfa2V5X2NvbmZpZxgEIAEoCzInLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXBpS2V5Q29uZmlnSAASUQoWYXdzX2NyZWRlbnRpYWxzX2NvbmZpZxgFIAEoCzIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXdzQ3JlZGVudGlhbHNDb25maWdIABJKChNhd3NfaWFtX3JvbGVfY29uZmlnGAYgASgLMisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Bd3NJYW1Sb2xlQ29uZmlnSAASWAoaZ2NwX3NlcnZpY2VfYWNjb3VudF9jb25maWcYByABKAsyMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdjcFNlcnZpY2VBY2NvdW50Q29uZmlnSAASVQoYYXp1cmVfY3JlZGVudGlhbHNfY29uZmlnGAggASgLMjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BenVyZUNyZWRlbnRpYWxzQ29uZmlnSAASDwoHZW5hYmxlZBgJIAEoCBIQCghwcmlvcml0eRgKIAEoBRI1CgxsYXN0X3VzZWRfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFgoJdXNlX2NvdW50GAwgASgDQgPgQQMSNAoLY3JlYXRlX3RpbWUYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgPIAEoCUID4EEDOlHqQU4KJWFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUHJvdmlkZXJDb25maWcSJXByb3ZpZGVycy97cHJvdmlkZXJ9L2NvbmZpZ3Mve2NvbmZpZ31CCAoGY29uZmlnIkEKDEFwaUtleUNvbmZpZxIUCgdhcGlfa2V5GAEgASgJQgPgQQQSGwoOYXBpX2tleV9tYXNrZWQYAiABKAlCA+BBAyKKAQoUQXdzQ3JlZGVudGlhbHNDb25maWcSGgoNYWNjZXNzX2tleV9pZBgBIAEoCUID4EEEEh4KEXNlY3JldF9hY2Nlc3Nfa2V5GAIgASgJQgPgQQQSEwoGcmVnaW9uGAMgASgJQgPgQQISIQoUYWNjZXNzX2tleV9pZF9tYXNrZWQYBCABKAlCA+BBAyJYChBBd3NJYW1Sb2xlQ29uZmlnEhUKCHJvbGVfYXJuGAEgASgJQgPgQQISEwoGcmVnaW9uGAIgASgJQgPgQQISGAoLZXh0ZXJuYWxfaWQYAyABKAlCA+BBASKOAQoXR2NwU2VydmljZUFjY291bnRDb25maWcSIQoUc2VydmljZV9hY2NvdW50X2pzb24YASABKAlCA+BBBBIXCgpwcm9qZWN0X2lkGAIgASgJQgPgQQISEwoGcmVnaW9uGAMgASgJQgPgQQISIgoVc2VydmljZV9hY2NvdW50X2VtYWlsGAQgASgJQgPgQQMinwEKFkF6dXJlQ3JlZGVudGlhbHNDb25maWcSFAoHYXBpX2tleRgBIAEoCUID4EEEEhoKDXJlc291cmNlX25hbWUYAiABKAlCA+BBAhIcCg9kZXBsb3ltZW50X25hbWUYAyABKAlCA+BBARIYCgthcGlfdmVyc2lvbhgEIAEoCUID4EEBEhsKDmFwaV9rZXlfbWFza2VkGAUgASgJQgPgQQMiswEKG0NyZWF0ZVByb3ZpZGVyQ29uZmlnUmVxdWVzdBI8CgZwYXJlbnQYASABKAlCLOBBAvpBJgokYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Nb2RlbFByb3ZpZGVyEj4KBmNvbmZpZxgCIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHJvdmlkZXJDb25maWdCA+BBAhIWCgljb25maWdfaWQYAyABKAlCA+BBASJZChxDcmVhdGVQcm92aWRlckNvbmZpZ1Jlc3BvbnNlEjkKBmNvbmZpZxgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHJvdmlkZXJDb25maWciVwoYR2V0UHJvdmlkZXJDb25maWdSZXF1ZXN0EjsKBG5hbWUYASABKAlCLeBBAvpBJwolYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Qcm92aWRlckNvbmZpZyJWChlHZXRQcm92aWRlckNvbmZpZ1Jlc3BvbnNlEjkKBmNvbmZpZxgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHJvdmlkZXJDb25maWcisQEKGkxpc3RQcm92aWRlckNvbmZpZ3NSZXF1ZXN0EjwKBnBhcmVudBgBIAEoCUIs4EEC+kEmCiRhaWdhdGV3YXkucmVkcGFuZGEuY29tL01vZGVsUHJvdmlkZXISHwoJcGFnZV9zaXplGAIgASgFQgzgQQG6SAYaBBhkKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhsKDmZpbHRlcl9lbmFibGVkGAQgASgIQgPgQQEihgEKG0xpc3RQcm92aWRlckNvbmZpZ3NSZXNwb25zZRI6Cgdjb25maWdzGAEgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Qcm92aWRlckNvbmZpZxIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKTAQobVXBkYXRlUHJvdmlkZXJDb25maWdSZXF1ZXN0Ej4KBmNvbmZpZxgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHJvdmlkZXJDb25maWdCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJZChxVcGRhdGVQcm92aWRlckNvbmZpZ1Jlc3BvbnNlEjkKBmNvbmZpZxgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUHJvdmlkZXJDb25maWciWgobRGVsZXRlUHJvdmlkZXJDb25maWdSZXF1ZXN0EjsKBG5hbWUYASABKAlCLeBBAvpBJwolYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Qcm92aWRlckNvbmZpZyIeChxEZWxldGVQcm92aWRlckNvbmZpZ1Jlc3BvbnNlIlgKGVRlc3RQcm92aWRlckNvbmZpZ1JlcXVlc3QSOwoEbmFtZRgBIAEoCUIt4EEC+kEnCiVhaWdhdGV3YXkucmVkcGFuZGEuY29tL1Byb3ZpZGVyQ29uZmlnIl4KGlRlc3RQcm92aWRlckNvbmZpZ1Jlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSFQoNZXJyb3JfbWVzc2FnZRgCIAEoCRIYChByZXNwb25zZV90aW1lX21zGAMgASgDKocCChJQcm92aWRlckNvbmZpZ1R5cGUSJAogUFJPVklERVJfQ09ORklHX1RZUEVfVU5TUEVDSUZJRUQQABIgChxQUk9WSURFUl9DT05GSUdfVFlQRV9BUElfS0VZEAESKAokUFJPVklERVJfQ09ORklHX1RZUEVfQVdTX0NSRURFTlRJQUxTEAISJQohUFJPVklERVJfQ09ORklHX1RZUEVfQVdTX0lBTV9ST0xFEAMSLAooUFJPVklERVJfQ09ORklHX1RZUEVfR0NQX1NFUlZJQ0VfQUNDT1VOVBAEEioKJlBST1ZJREVSX0NPTkZJR19UWVBFX0FaVVJFX0NSRURFTlRJQUxTEAUy9wgKFVByb3ZpZGVyQ29uZmlnU2VydmljZRK5AQoUQ3JlYXRlUHJvdmlkZXJDb25maWcSNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZVByb3ZpZGVyQ29uZmlnUmVxdWVzdBo3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlUHJvdmlkZXJDb25maWdSZXNwb25zZSIwgtPkkwIqOgZjb25maWciIC92MS97cGFyZW50PXByb3ZpZGVycy8qfS9jb25maWdzEqgBChFHZXRQcm92aWRlckNvbmZpZxIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0UHJvdmlkZXJDb25maWdSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRQcm92aWRlckNvbmZpZ1Jlc3BvbnNlIiiC0+STAiISIC92MS97bmFtZT1wcm92aWRlcnMvKi9jb25maWdzLyp9Eq4BChNMaXN0UHJvdmlkZXJDb25maWdzEjUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UHJvdmlkZXJDb25maWdzUmVxdWVzdBo2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFByb3ZpZGVyQ29uZmlnc1Jlc3BvbnNlIiiC0+STAiISIC92MS97cGFyZW50PXByb3ZpZGVycy8qfS9jb25maWdzEsABChRVcGRhdGVQcm92aWRlckNvbmZpZxI2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlUHJvdmlkZXJDb25maWdSZXF1ZXN0GjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVQcm92aWRlckNvbmZpZ1Jlc3BvbnNlIjeC0+STAjE6BmNvbmZpZzInL3YxL3tjb25maWcubmFtZT1wcm92aWRlcnMvKi9jb25maWdzLyp9ErEBChREZWxldGVQcm92aWRlckNvbmZpZxI2LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlUHJvdmlkZXJDb25maWdSZXF1ZXN0GjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVQcm92aWRlckNvbmZpZ1Jlc3BvbnNlIiiC0+STAiIqIC92MS97bmFtZT1wcm92aWRlcnMvKi9jb25maWdzLyp9ErMBChJUZXN0UHJvdmlkZXJDb25maWcSNC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlc3RQcm92aWRlckNvbmZpZ1JlcXVlc3QaNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlc3RQcm92aWRlckNvbmZpZ1Jlc3BvbnNlIjCC0+STAio6ASoiJS92MS97bmFtZT1wcm92aWRlcnMvKi9jb25maWdzLyp9OnRlc3QaGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21CiAIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQhNQcm92aWRlckNvbmZpZ1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * ProviderConfig represents a configuration for authenticating with a model provider. + * + * @generated from message redpanda.api.aigateway.v1.ProviderConfig + */ +export type ProviderConfig = Message<"redpanda.api.aigateway.v1.ProviderConfig"> & { + /** + * Resource name. Format: `providers/{provider_id}/configs/{config_id}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable label for this configuration (e.g., "Production", "Team A") + * + * @generated from field: string label = 2; + */ + label: string; + + /** + * Configuration type + * + * @generated from field: redpanda.api.aigateway.v1.ProviderConfigType config_type = 3; + */ + configType: ProviderConfigType; + + /** + * Provider-specific configuration (exactly one must be set based on config_type) + * + * @generated from oneof redpanda.api.aigateway.v1.ProviderConfig.config + */ + config: { + /** + * API key configuration (for OpenAI, Anthropic, etc.) + * + * @generated from field: redpanda.api.aigateway.v1.ApiKeyConfig api_key_config = 4; + */ + value: ApiKeyConfig; + case: "apiKeyConfig"; + } | { + /** + * AWS credentials configuration + * + * @generated from field: redpanda.api.aigateway.v1.AwsCredentialsConfig aws_credentials_config = 5; + */ + value: AwsCredentialsConfig; + case: "awsCredentialsConfig"; + } | { + /** + * AWS IAM role configuration + * + * @generated from field: redpanda.api.aigateway.v1.AwsIamRoleConfig aws_iam_role_config = 6; + */ + value: AwsIamRoleConfig; + case: "awsIamRoleConfig"; + } | { + /** + * GCP service account configuration + * + * @generated from field: redpanda.api.aigateway.v1.GcpServiceAccountConfig gcp_service_account_config = 7; + */ + value: GcpServiceAccountConfig; + case: "gcpServiceAccountConfig"; + } | { + /** + * Azure OpenAI credentials configuration + * + * @generated from field: redpanda.api.aigateway.v1.AzureCredentialsConfig azure_credentials_config = 8; + */ + value: AzureCredentialsConfig; + case: "azureCredentialsConfig"; + } | { case: undefined; value?: undefined }; + + /** + * Whether this configuration is enabled + * + * @generated from field: bool enabled = 9; + */ + enabled: boolean; + + /** + * Priority for load balancing (higher = preferred) + * + * @generated from field: int32 priority = 10; + */ + priority: number; + + /** + * Output only. Last time this configuration was used + * + * @generated from field: google.protobuf.Timestamp last_used_at = 11; + */ + lastUsedAt?: Timestamp; + + /** + * Output only. Number of times this configuration has been used + * + * @generated from field: int64 use_count = 12; + */ + useCount: bigint; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 13; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 14; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator + * + * @generated from field: string creator = 15; + */ + creator: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ProviderConfig. + * Use `create(ProviderConfigSchema)` to create a new message. + */ +export const ProviderConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 0); + +/** + * ApiKeyConfig for providers using API key authentication. + * + * @generated from message redpanda.api.aigateway.v1.ApiKeyConfig + */ +export type ApiKeyConfig = Message<"redpanda.api.aigateway.v1.ApiKeyConfig"> & { + /** + * The API key (input only - masked in responses) + * + * @generated from field: string api_key = 1; + */ + apiKey: string; + + /** + * Output only. Masked version of the API key (e.g., "sk-...xyz") + * + * @generated from field: string api_key_masked = 2; + */ + apiKeyMasked: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ApiKeyConfig. + * Use `create(ApiKeyConfigSchema)` to create a new message. + */ +export const ApiKeyConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 1); + +/** + * AwsCredentialsConfig for AWS Bedrock using access key/secret key. + * + * @generated from message redpanda.api.aigateway.v1.AwsCredentialsConfig + */ +export type AwsCredentialsConfig = Message<"redpanda.api.aigateway.v1.AwsCredentialsConfig"> & { + /** + * AWS access key ID (input only - masked in responses) + * + * @generated from field: string access_key_id = 1; + */ + accessKeyId: string; + + /** + * AWS secret access key (input only - never returned) + * + * @generated from field: string secret_access_key = 2; + */ + secretAccessKey: string; + + /** + * AWS region (e.g., "us-east-1") + * + * @generated from field: string region = 3; + */ + region: string; + + /** + * Output only. Masked access key ID + * + * @generated from field: string access_key_id_masked = 4; + */ + accessKeyIdMasked: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AwsCredentialsConfig. + * Use `create(AwsCredentialsConfigSchema)` to create a new message. + */ +export const AwsCredentialsConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 2); + +/** + * AwsIamRoleConfig for AWS Bedrock using IAM role assumption. + * + * @generated from message redpanda.api.aigateway.v1.AwsIamRoleConfig + */ +export type AwsIamRoleConfig = Message<"redpanda.api.aigateway.v1.AwsIamRoleConfig"> & { + /** + * IAM role ARN to assume + * + * @generated from field: string role_arn = 1; + */ + roleArn: string; + + /** + * AWS region (e.g., "us-east-1") + * + * @generated from field: string region = 2; + */ + region: string; + + /** + * Optional external ID for cross-account access + * + * @generated from field: string external_id = 3; + */ + externalId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AwsIamRoleConfig. + * Use `create(AwsIamRoleConfigSchema)` to create a new message. + */ +export const AwsIamRoleConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 3); + +/** + * GcpServiceAccountConfig for Google Vertex AI. + * + * @generated from message redpanda.api.aigateway.v1.GcpServiceAccountConfig + */ +export type GcpServiceAccountConfig = Message<"redpanda.api.aigateway.v1.GcpServiceAccountConfig"> & { + /** + * Service account JSON key (input only - never returned) + * + * @generated from field: string service_account_json = 1; + */ + serviceAccountJson: string; + + /** + * GCP project ID + * + * @generated from field: string project_id = 2; + */ + projectId: string; + + /** + * GCP region (e.g., "us-central1") + * + * @generated from field: string region = 3; + */ + region: string; + + /** + * Output only. Service account email (extracted from JSON) + * + * @generated from field: string service_account_email = 4; + */ + serviceAccountEmail: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GcpServiceAccountConfig. + * Use `create(GcpServiceAccountConfigSchema)` to create a new message. + */ +export const GcpServiceAccountConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 4); + +/** + * AzureCredentialsConfig for Azure OpenAI Service. + * + * @generated from message redpanda.api.aigateway.v1.AzureCredentialsConfig + */ +export type AzureCredentialsConfig = Message<"redpanda.api.aigateway.v1.AzureCredentialsConfig"> & { + /** + * Azure OpenAI API key (input only - masked in responses) + * + * @generated from field: string api_key = 1; + */ + apiKey: string; + + /** + * Azure resource name + * + * @generated from field: string resource_name = 2; + */ + resourceName: string; + + /** + * Azure deployment name (optional, can be specified per-request) + * + * @generated from field: string deployment_name = 3; + */ + deploymentName: string; + + /** + * API version (e.g., "2024-02-01") + * + * @generated from field: string api_version = 4; + */ + apiVersion: string; + + /** + * Output only. Masked API key + * + * @generated from field: string api_key_masked = 5; + */ + apiKeyMasked: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AzureCredentialsConfig. + * Use `create(AzureCredentialsConfigSchema)` to create a new message. + */ +export const AzureCredentialsConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 5); + +/** + * Request message for CreateProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateProviderConfigRequest + */ +export type CreateProviderConfigRequest = Message<"redpanda.api.aigateway.v1.CreateProviderConfigRequest"> & { + /** + * Parent resource name. Format: `providers/{provider_id}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The configuration to create. + * + * @generated from field: redpanda.api.aigateway.v1.ProviderConfig config = 2; + */ + config?: ProviderConfig; + + /** + * Optional config ID. If empty, server generates one. + * + * @generated from field: string config_id = 3; + */ + configId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateProviderConfigRequest. + * Use `create(CreateProviderConfigRequestSchema)` to create a new message. + */ +export const CreateProviderConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 6); + +/** + * Response message for CreateProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateProviderConfigResponse + */ +export type CreateProviderConfigResponse = Message<"redpanda.api.aigateway.v1.CreateProviderConfigResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ProviderConfig config = 1; + */ + config?: ProviderConfig; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateProviderConfigResponse. + * Use `create(CreateProviderConfigResponseSchema)` to create a new message. + */ +export const CreateProviderConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 7); + +/** + * Request message for GetProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetProviderConfigRequest + */ +export type GetProviderConfigRequest = Message<"redpanda.api.aigateway.v1.GetProviderConfigRequest"> & { + /** + * Resource name of the configuration. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetProviderConfigRequest. + * Use `create(GetProviderConfigRequestSchema)` to create a new message. + */ +export const GetProviderConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 8); + +/** + * Response message for GetProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetProviderConfigResponse + */ +export type GetProviderConfigResponse = Message<"redpanda.api.aigateway.v1.GetProviderConfigResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ProviderConfig config = 1; + */ + config?: ProviderConfig; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetProviderConfigResponse. + * Use `create(GetProviderConfigResponseSchema)` to create a new message. + */ +export const GetProviderConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 9); + +/** + * Request message for ListProviderConfigs RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListProviderConfigsRequest + */ +export type ListProviderConfigsRequest = Message<"redpanda.api.aigateway.v1.ListProviderConfigsRequest"> & { + /** + * Parent resource name. Format: `providers/{provider_id}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of configs to return (max 100) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter by enabled status + * + * @generated from field: bool filter_enabled = 4; + */ + filterEnabled: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListProviderConfigsRequest. + * Use `create(ListProviderConfigsRequestSchema)` to create a new message. + */ +export const ListProviderConfigsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 10); + +/** + * Response message for ListProviderConfigs RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListProviderConfigsResponse + */ +export type ListProviderConfigsResponse = Message<"redpanda.api.aigateway.v1.ListProviderConfigsResponse"> & { + /** + * The list of configurations (sensitive fields masked) + * + * @generated from field: repeated redpanda.api.aigateway.v1.ProviderConfig configs = 1; + */ + configs: ProviderConfig[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListProviderConfigsResponse. + * Use `create(ListProviderConfigsResponseSchema)` to create a new message. + */ +export const ListProviderConfigsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 11); + +/** + * Request message for UpdateProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateProviderConfigRequest + */ +export type UpdateProviderConfigRequest = Message<"redpanda.api.aigateway.v1.UpdateProviderConfigRequest"> & { + /** + * The configuration to update. + * + * @generated from field: redpanda.api.aigateway.v1.ProviderConfig config = 1; + */ + config?: ProviderConfig; + + /** + * The fields to update. + * Allowed fields: label, enabled, priority, and config-specific fields + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateProviderConfigRequest. + * Use `create(UpdateProviderConfigRequestSchema)` to create a new message. + */ +export const UpdateProviderConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 12); + +/** + * Response message for UpdateProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateProviderConfigResponse + */ +export type UpdateProviderConfigResponse = Message<"redpanda.api.aigateway.v1.UpdateProviderConfigResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.ProviderConfig config = 1; + */ + config?: ProviderConfig; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateProviderConfigResponse. + * Use `create(UpdateProviderConfigResponseSchema)` to create a new message. + */ +export const UpdateProviderConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 13); + +/** + * Request message for DeleteProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteProviderConfigRequest + */ +export type DeleteProviderConfigRequest = Message<"redpanda.api.aigateway.v1.DeleteProviderConfigRequest"> & { + /** + * Resource name of the configuration to delete. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteProviderConfigRequest. + * Use `create(DeleteProviderConfigRequestSchema)` to create a new message. + */ +export const DeleteProviderConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 14); + +/** + * Response message for DeleteProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteProviderConfigResponse + */ +export type DeleteProviderConfigResponse = Message<"redpanda.api.aigateway.v1.DeleteProviderConfigResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteProviderConfigResponse. + * Use `create(DeleteProviderConfigResponseSchema)` to create a new message. + */ +export const DeleteProviderConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 15); + +/** + * Request message for TestProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.TestProviderConfigRequest + */ +export type TestProviderConfigRequest = Message<"redpanda.api.aigateway.v1.TestProviderConfigRequest"> & { + /** + * Resource name of the configuration to test. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TestProviderConfigRequest. + * Use `create(TestProviderConfigRequestSchema)` to create a new message. + */ +export const TestProviderConfigRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 16); + +/** + * Response message for TestProviderConfig RPC. + * + * @generated from message redpanda.api.aigateway.v1.TestProviderConfigResponse + */ +export type TestProviderConfigResponse = Message<"redpanda.api.aigateway.v1.TestProviderConfigResponse"> & { + /** + * Whether the test was successful + * + * @generated from field: bool success = 1; + */ + success: boolean; + + /** + * Error message if the test failed + * + * @generated from field: string error_message = 2; + */ + errorMessage: string; + + /** + * Response time in milliseconds + * + * @generated from field: int64 response_time_ms = 3; + */ + responseTimeMs: bigint; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TestProviderConfigResponse. + * Use `create(TestProviderConfigResponseSchema)` to create a new message. + */ +export const TestProviderConfigResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_provider_config, 17); + +/** + * ProviderConfigType defines the type of provider configuration. + * + * @generated from enum redpanda.api.aigateway.v1.ProviderConfigType + */ +export enum ProviderConfigType { + /** + * @generated from enum value: PROVIDER_CONFIG_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Standard API key authentication (OpenAI, Anthropic, Mistral, Cohere, etc.) + * + * @generated from enum value: PROVIDER_CONFIG_TYPE_API_KEY = 1; + */ + API_KEY = 1, + + /** + * AWS credentials (access key + secret key) + * + * @generated from enum value: PROVIDER_CONFIG_TYPE_AWS_CREDENTIALS = 2; + */ + AWS_CREDENTIALS = 2, + + /** + * AWS IAM role (for EC2/ECS/Lambda environments) + * + * @generated from enum value: PROVIDER_CONFIG_TYPE_AWS_IAM_ROLE = 3; + */ + AWS_IAM_ROLE = 3, + + /** + * GCP service account JSON + * + * @generated from enum value: PROVIDER_CONFIG_TYPE_GCP_SERVICE_ACCOUNT = 4; + */ + GCP_SERVICE_ACCOUNT = 4, + + /** + * Azure OpenAI credentials + * + * @generated from enum value: PROVIDER_CONFIG_TYPE_AZURE_CREDENTIALS = 5; + */ + AZURE_CREDENTIALS = 5, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.ProviderConfigType. + */ +export const ProviderConfigTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_provider_config, 0); + +/** + * ProviderConfigService manages encrypted configurations for model providers. + * Supports different auth types: API keys, AWS credentials, GCP service accounts, etc. + * Resource name: providers/{provider_id}/configs/{config_id} + * + * @generated from service redpanda.api.aigateway.v1.ProviderConfigService + */ +export const ProviderConfigService: GenService<{ + /** + * Creates a new provider configuration. + * The configuration is encrypted at rest using the control plane encryption key. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.CreateProviderConfig + */ + createProviderConfig: { + methodKind: "unary"; + input: typeof CreateProviderConfigRequestSchema; + output: typeof CreateProviderConfigResponseSchema; + }, + /** + * Gets a provider configuration by name. + * Note: Sensitive fields are masked in the response. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.GetProviderConfig + */ + getProviderConfig: { + methodKind: "unary"; + input: typeof GetProviderConfigRequestSchema; + output: typeof GetProviderConfigResponseSchema; + }, + /** + * Lists provider configurations. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.ListProviderConfigs + */ + listProviderConfigs: { + methodKind: "unary"; + input: typeof ListProviderConfigsRequestSchema; + output: typeof ListProviderConfigsResponseSchema; + }, + /** + * Updates a provider configuration. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.UpdateProviderConfig + */ + updateProviderConfig: { + methodKind: "unary"; + input: typeof UpdateProviderConfigRequestSchema; + output: typeof UpdateProviderConfigResponseSchema; + }, + /** + * Deletes a provider configuration. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.DeleteProviderConfig + */ + deleteProviderConfig: { + methodKind: "unary"; + input: typeof DeleteProviderConfigRequestSchema; + output: typeof DeleteProviderConfigResponseSchema; + }, + /** + * Tests a provider configuration by attempting to authenticate with the provider. + * + * @generated from rpc redpanda.api.aigateway.v1.ProviderConfigService.TestProviderConfig + */ + testProviderConfig: { + methodKind: "unary"; + input: typeof TestProviderConfigRequestSchema; + output: typeof TestProviderConfigResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_provider_config, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit-RateLimitService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit-RateLimitService_connectquery.ts new file mode 100644 index 0000000000..5df344307f --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit-RateLimitService_connectquery.ts @@ -0,0 +1,30 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/ratelimit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { RateLimitService } from "./ratelimit_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit + */ +export const createRateLimit = RateLimitService.method.createRateLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.GetRateLimit + */ +export const getRateLimit = RateLimitService.method.getRateLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.ListRateLimits + */ +export const listRateLimits = RateLimitService.method.listRateLimits; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit + */ +export const updateRateLimit = RateLimitService.method.updateRateLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit + */ +export const deleteRateLimit = RateLimitService.method.deleteRateLimit; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit_pb.ts new file mode 100644 index 0000000000..b66187b19b --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/ratelimit_pb.ts @@ -0,0 +1,368 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/ratelimit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/ratelimit.proto. + */ +export const file_redpanda_api_aigateway_v1_ratelimit: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3JhdGVsaW1pdC5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJTChdDcmVhdGVSYXRlTGltaXRSZXNwb25zZRI4CgpyYXRlX2xpbWl0GAEgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SYXRlTGltaXQiUAoUR2V0UmF0ZUxpbWl0UmVzcG9uc2USOAoKcmF0ZV9saW1pdBgBIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmF0ZUxpbWl0IlMKF1VwZGF0ZVJhdGVMaW1pdFJlc3BvbnNlEjgKCnJhdGVfbGltaXQYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJhdGVMaW1pdCIZChdEZWxldGVSYXRlTGltaXRSZXNwb25zZSLOBgoJUmF0ZUxpbWl0EhEKBG5hbWUYASABKAlCA+BBCBIgCgxkaXNwbGF5X25hbWUYAiABKAlCCuBBArpIBHICEAESEwoLZGVzY3JpcHRpb24YAyABKAkSHgoKZXhwcmVzc2lvbhgEIAEoCUIK4EECukgEcgIQARIVCg1rZXlfZXh0cmFjdG9yGAUgASgJEiQKE3JlcXVlc3RzX3Blcl9zZWNvbmQYBiABKANCB7pIBCICKAASJAoTcmVxdWVzdHNfcGVyX21pbnV0ZRgHIAEoA0IHukgEIgIoABIhChByZXF1ZXN0c19wZXJfZGF5GAggASgDQge6SAQiAigAEg8KB2VuYWJsZWQYCyABKAgSRAoIbWV0YWRhdGEYDCADKAsyMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJhdGVMaW1pdC5NZXRhZGF0YUVudHJ5EjQKC2NyZWF0ZV90aW1lGA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATrcAupBaQogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9SYXRlTGltaXQSK2dhdGV3YXlzL3tnYXRld2F5fS9yYXRlLWxpbWl0cy97cmF0ZV9saW1pdH0SGHJhdGUtbGltaXRzL3tyYXRlX2xpbWl0fbpI7AEa6QEKHHJhdGVsaW1pdC5hdF9sZWFzdF9vbmVfbGltaXQSbmF0IGxlYXN0IG9uZSByZXF1ZXN0IGxpbWl0IChyZXF1ZXN0c19wZXJfc2Vjb25kLCByZXF1ZXN0c19wZXJfbWludXRlLCByZXF1ZXN0c19wZXJfZGF5KSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwGll0aGlzLnJlcXVlc3RzX3Blcl9zZWNvbmQgPiAwIHx8IHRoaXMucmVxdWVzdHNfcGVyX21pbnV0ZSA+IDAgfHwgdGhpcy5yZXF1ZXN0c19wZXJfZGF5ID4gMCKCAQoWQ3JlYXRlUmF0ZUxpbWl0UmVxdWVzdBIOCgZwYXJlbnQYASABKAkSQwoKcmF0ZV9saW1pdBgDIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmF0ZUxpbWl0QgngQQK6SAPIAQFKBAgCEANSDXJhdGVfbGltaXRfaWQiTQoTR2V0UmF0ZUxpbWl0UmVxdWVzdBI2CgRuYW1lGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUmF0ZUxpbWl0InAKFUxpc3RSYXRlTGltaXRzUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSEQoJcGFnZV9zaXplGAIgASgFEhIKCnBhZ2VfdG9rZW4YAyABKAkSDgoGZmlsdGVyGAQgASgJEhAKCG9yZGVyX2J5GAUgASgJIoABChZMaXN0UmF0ZUxpbWl0c1Jlc3BvbnNlEjkKC3JhdGVfbGltaXRzGAEgAygLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SYXRlTGltaXQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUijgEKFlVwZGF0ZVJhdGVMaW1pdFJlcXVlc3QSQwoKcmF0ZV9saW1pdBgBIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmF0ZUxpbWl0QgngQQK6SAPIAQESLwoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIlAKFkRlbGV0ZVJhdGVMaW1pdFJlcXVlc3QSNgoEbmFtZRgBIAEoCUIo4EEC+kEiCiBhaWdhdGV3YXkucmVkcGFuZGEuY29tL1JhdGVMaW1pdDKOCAoQUmF0ZUxpbWl0U2VydmljZRLQAQoPQ3JlYXRlUmF0ZUxpbWl0EjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVSYXRlTGltaXRSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVSYXRlTGltaXRSZXNwb25zZSJWgtPkkwJQOgpyYXRlX2xpbWl0Wh06CnJhdGVfbGltaXQiDy92MS9yYXRlLWxpbWl0cyIjL3YxL3twYXJlbnQ9Z2F0ZXdheXMvKn0vcmF0ZS1saW1pdHMSuAEKDEdldFJhdGVMaW1pdBIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0UmF0ZUxpbWl0UmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0UmF0ZUxpbWl0UmVzcG9uc2UiR4LT5JMCQVoaEhgvdjEve25hbWU9cmF0ZS1saW1pdHMvKn0SIy92MS97bmFtZT1nYXRld2F5cy8qL3JhdGUtbGltaXRzLyp9ErUBCg5MaXN0UmF0ZUxpbWl0cxIwLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFJhdGVMaW1pdHNSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0UmF0ZUxpbWl0c1Jlc3BvbnNlIj6C0+STAjhaERIPL3YxL3JhdGUtbGltaXRzEiMvdjEve3BhcmVudD1nYXRld2F5cy8qfS9yYXRlLWxpbWl0cxLvAQoPVXBkYXRlUmF0ZUxpbWl0EjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVSYXRlTGltaXRSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVSYXRlTGltaXRSZXNwb25zZSJ1gtPkkwJvOgpyYXRlX2xpbWl0WjE6CnJhdGVfbGltaXQyIy92MS97cmF0ZV9saW1pdC5uYW1lPXJhdGUtbGltaXRzLyp9Mi4vdjEve3JhdGVfbGltaXQubmFtZT1nYXRld2F5cy8qL3JhdGUtbGltaXRzLyp9EsEBCg9EZWxldGVSYXRlTGltaXQSMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVJhdGVMaW1pdFJlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVJhdGVMaW1pdFJlc3BvbnNlIkeC0+STAkFaGioYL3YxL3tuYW1lPXJhdGUtbGltaXRzLyp9KiMvdjEve25hbWU9Z2F0ZXdheXMvKi9yYXRlLWxpbWl0cy8qfUKDAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCDlJhdGVsaW1pdFByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateRateLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateRateLimitResponse + */ +export type CreateRateLimitResponse = Message<"redpanda.api.aigateway.v1.CreateRateLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 1; + */ + rateLimit?: RateLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRateLimitResponse. + * Use `create(CreateRateLimitResponseSchema)` to create a new message. + */ +export const CreateRateLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 0); + +/** + * Response message for GetRateLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetRateLimitResponse + */ +export type GetRateLimitResponse = Message<"redpanda.api.aigateway.v1.GetRateLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 1; + */ + rateLimit?: RateLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRateLimitResponse. + * Use `create(GetRateLimitResponseSchema)` to create a new message. + */ +export const GetRateLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 1); + +/** + * Response message for UpdateRateLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateRateLimitResponse + */ +export type UpdateRateLimitResponse = Message<"redpanda.api.aigateway.v1.UpdateRateLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 1; + */ + rateLimit?: RateLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRateLimitResponse. + * Use `create(UpdateRateLimitResponseSchema)` to create a new message. + */ +export const UpdateRateLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 2); + +/** + * Response message for DeleteRateLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteRateLimitResponse + */ +export type DeleteRateLimitResponse = Message<"redpanda.api.aigateway.v1.DeleteRateLimitResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRateLimitResponse. + * Use `create(DeleteRateLimitResponseSchema)` to create a new message. + */ +export const DeleteRateLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 3); + +/** + * @generated from message redpanda.api.aigateway.v1.RateLimit + */ +export type RateLimit = Message<"redpanda.api.aigateway.v1.RateLimit"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * @generated from field: string description = 3; + */ + description: string; + + /** + * CEL expression for rule matching (e.g., "request.headers['X-Tier'][0] == 'free'") + * + * @generated from field: string expression = 4; + */ + expression: string; + + /** + * CEL expression to extract rate limit key (e.g., "request.headers['X-User-ID'][0]") + * If not provided, a global rate limit is applied + * + * @generated from field: string key_extractor = 5; + */ + keyExtractor: string; + + /** + * Request-based limits (pre-request enforcement) + * At least one limit should be non-zero + * For token/cost-based limiting, use SpendLimitService instead (aligns with CUE schema) + * + * 0 = unlimited + * + * @generated from field: int64 requests_per_second = 6; + */ + requestsPerSecond: bigint; + + /** + * 0 = unlimited + * + * @generated from field: int64 requests_per_minute = 7; + */ + requestsPerMinute: bigint; + + /** + * 0 = unlimited + * + * @generated from field: int64 requests_per_day = 8; + */ + requestsPerDay: bigint; + + /** + * @generated from field: bool enabled = 11; + */ + enabled: boolean; + + /** + * @generated from field: map metadata = 12; + */ + metadata: { [key: string]: string }; + + /** + * @generated from field: google.protobuf.Timestamp create_time = 13; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 14; + */ + updateTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RateLimit. + * Use `create(RateLimitSchema)` to create a new message. + */ +export const RateLimitSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateRateLimitRequest + */ +export type CreateRateLimitRequest = Message<"redpanda.api.aigateway.v1.CreateRateLimitRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 3; + */ + rateLimit?: RateLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRateLimitRequest. + * Use `create(CreateRateLimitRequestSchema)` to create a new message. + */ +export const CreateRateLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.GetRateLimitRequest + */ +export type GetRateLimitRequest = Message<"redpanda.api.aigateway.v1.GetRateLimitRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRateLimitRequest. + * Use `create(GetRateLimitRequestSchema)` to create a new message. + */ +export const GetRateLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.ListRateLimitsRequest + */ +export type ListRateLimitsRequest = Message<"redpanda.api.aigateway.v1.ListRateLimitsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRateLimitsRequest. + * Use `create(ListRateLimitsRequestSchema)` to create a new message. + */ +export const ListRateLimitsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.ListRateLimitsResponse + */ +export type ListRateLimitsResponse = Message<"redpanda.api.aigateway.v1.ListRateLimitsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.RateLimit rate_limits = 1; + */ + rateLimits: RateLimit[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRateLimitsResponse. + * Use `create(ListRateLimitsResponseSchema)` to create a new message. + */ +export const ListRateLimitsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateRateLimitRequest + */ +export type UpdateRateLimitRequest = Message<"redpanda.api.aigateway.v1.UpdateRateLimitRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RateLimit rate_limit = 1; + */ + rateLimit?: RateLimit; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRateLimitRequest. + * Use `create(UpdateRateLimitRequestSchema)` to create a new message. + */ +export const UpdateRateLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteRateLimitRequest + */ +export type DeleteRateLimitRequest = Message<"redpanda.api.aigateway.v1.DeleteRateLimitRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRateLimitRequest. + * Use `create(DeleteRateLimitRequestSchema)` to create a new message. + */ +export const DeleteRateLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_ratelimit, 10); + +/** + * @generated from service redpanda.api.aigateway.v1.RateLimitService + */ +export const RateLimitService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.CreateRateLimit + */ + createRateLimit: { + methodKind: "unary"; + input: typeof CreateRateLimitRequestSchema; + output: typeof CreateRateLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.GetRateLimit + */ + getRateLimit: { + methodKind: "unary"; + input: typeof GetRateLimitRequestSchema; + output: typeof GetRateLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.ListRateLimits + */ + listRateLimits: { + methodKind: "unary"; + input: typeof ListRateLimitsRequestSchema; + output: typeof ListRateLimitsResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.UpdateRateLimit + */ + updateRateLimit: { + methodKind: "unary"; + input: typeof UpdateRateLimitRequestSchema; + output: typeof UpdateRateLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RateLimitService.DeleteRateLimit + */ + deleteRateLimit: { + methodKind: "unary"; + input: typeof DeleteRateLimitRequestSchema; + output: typeof DeleteRateLimitResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_ratelimit, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/role-RoleService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/role-RoleService_connectquery.ts new file mode 100644 index 0000000000..b0fd517f45 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/role-RoleService_connectquery.ts @@ -0,0 +1,69 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/role.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { RoleService } from "./role_pb"; + +/** + * Creates a new role within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.CreateRole + */ +export const createRole = RoleService.method.createRole; + +/** + * Gets a role by name. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.GetRole + */ +export const getRole = RoleService.method.getRole; + +/** + * Lists roles within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListRoles + */ +export const listRoles = RoleService.method.listRoles; + +/** + * Updates a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.UpdateRole + */ +export const updateRole = RoleService.method.updateRole; + +/** + * Deletes a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.DeleteRole + */ +export const deleteRole = RoleService.method.deleteRole; + +/** + * Assigns a role to a team. + * Implements Cedar pattern: Team in Role + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.AssignTeamRole + */ +export const assignTeamRole = RoleService.method.assignTeamRole; + +/** + * Unassigns a role from a team. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.UnassignTeamRole + */ +export const unassignTeamRole = RoleService.method.unassignTeamRole; + +/** + * Lists teams assigned to a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListRoleTeams + */ +export const listRoleTeams = RoleService.method.listRoleTeams; + +/** + * Lists roles assigned to a team. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListTeamRoles + */ +export const listTeamRoles = RoleService.method.listTeamRoles; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/role_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/role_pb.ts new file mode 100644 index 0000000000..115d098b16 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/role_pb.ts @@ -0,0 +1,748 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/role.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/role.proto. + */ +export const file_redpanda_api_aigateway_v1_role: GenFile = /*@__PURE__*/ + fileDesc("CiRyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3JvbGUucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiwgMKBFJvbGUSEQoEbmFtZRgBIAEoCUID4EEIEiMKDGRpc3BsYXlfbmFtZRgCIAEoCUIN4EECukgHcgUQARj/ARIYCgtkZXNjcmlwdGlvbhgDIAEoCUID4EEBEj8KCG1ldGFkYXRhGAQgAygLMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb2xlLk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgHIAEoCUID4EEDEhQKB3VwZGF0ZXIYCCABKAlCA+BBAxovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAE6XupBWwobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Sb2xlEjxhY2NvdW50cy97YWNjb3VudH0vb3JnYW5pemF0aW9ucy97b3JnYW5pemF0aW9ufS9yb2xlcy97cm9sZX0iygEKElRlYW1Sb2xlQXNzaWdubWVudBIxCgR0ZWFtGAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVGVhbRIxCgRyb2xlGAIgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUm9sZRI0Cgthc3NpZ25lZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIYCgthc3NpZ25lZF9ieRgEIAEoCUID4EEDIpoBChFDcmVhdGVSb2xlUmVxdWVzdBI7CgZwYXJlbnQYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb24SFAoHcm9sZV9pZBgCIAEoCUID4EEBEjIKBHJvbGUYAyABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvbGVCA+BBAiJDChJDcmVhdGVSb2xlUmVzcG9uc2USLQoEcm9sZRgBIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm9sZSJDCg5HZXRSb2xlUmVxdWVzdBIxCgRuYW1lGAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUm9sZSJACg9HZXRSb2xlUmVzcG9uc2USLQoEcm9sZRgBIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm9sZSK2AQoQTGlzdFJvbGVzUmVxdWVzdBI7CgZwYXJlbnQYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb24SIAoJcGFnZV9zaXplGAIgASgFQg3gQQG6SAcaBRjoBygAEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBARITCgZmaWx0ZXIYBCABKAlCA+BBARIVCghvcmRlcl9ieRgFIAEoCUID4EEBInAKEUxpc3RSb2xlc1Jlc3BvbnNlEi4KBXJvbGVzGAEgAygLMh8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb2xlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIn0KEVVwZGF0ZVJvbGVSZXF1ZXN0EjIKBHJvbGUYASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvbGVCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJDChJVcGRhdGVSb2xlUmVzcG9uc2USLQoEcm9sZRgBIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm9sZSJaChFEZWxldGVSb2xlUmVxdWVzdBIxCgRuYW1lGAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUm9sZRISCgVmb3JjZRgCIAEoCEID4EEBIhQKEkRlbGV0ZVJvbGVSZXNwb25zZSJ9ChVBc3NpZ25UZWFtUm9sZVJlcXVlc3QSMQoEcm9sZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1JvbGUSMQoEdGVhbRgCIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0iWwoWQXNzaWduVGVhbVJvbGVSZXNwb25zZRJBCgphc3NpZ25tZW50GAEgASgLMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtUm9sZUFzc2lnbm1lbnQifwoXVW5hc3NpZ25UZWFtUm9sZVJlcXVlc3QSMQoEcm9sZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1JvbGUSMQoEdGVhbRgCIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0iGgoYVW5hc3NpZ25UZWFtUm9sZVJlc3BvbnNlIoQBChRMaXN0Um9sZVRlYW1zUmVxdWVzdBIxCgRyb2xlGAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUm9sZRIgCglwYWdlX3NpemUYAiABKAVCDeBBAbpIBxoFGOgHKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBIogBChVMaXN0Um9sZVRlYW1zUmVzcG9uc2USQgoLYXNzaWdubWVudHMYASADKAsyLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW1Sb2xlQXNzaWdubWVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKEAQoUTGlzdFRlYW1Sb2xlc1JlcXVlc3QSMQoEdGVhbRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0SIAoJcGFnZV9zaXplGAIgASgFQg3gQQG6SAcaBRjoBygAEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASKIAQoVTGlzdFRlYW1Sb2xlc1Jlc3BvbnNlEkIKC2Fzc2lnbm1lbnRzGAEgAygLMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtUm9sZUFzc2lnbm1lbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUywgwKC1JvbGVTZXJ2aWNlEqYBCgpDcmVhdGVSb2xlEiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVSb2xlUmVxdWVzdBotLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlUm9sZVJlc3BvbnNlIjuC0+STAjU6BHJvbGUiLS92MS97cGFyZW50PWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qfS9yb2xlcxKXAQoHR2V0Um9sZRIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0Um9sZVJlcXVlc3QaKi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFJvbGVSZXNwb25zZSI1gtPkkwIvEi0vdjEve25hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovcm9sZXMvKn0SnQEKCUxpc3RSb2xlcxIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFJvbGVzUmVxdWVzdBosLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFJvbGVzUmVzcG9uc2UiNYLT5JMCLxItL3YxL3twYXJlbnQ9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyp9L3JvbGVzEqsBCgpVcGRhdGVSb2xlEiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVSb2xlUmVxdWVzdBotLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlUm9sZVJlc3BvbnNlIkCC0+STAjo6BHJvbGUyMi92MS97cm9sZS5uYW1lPWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qL3JvbGVzLyp9EqABCgpEZWxldGVSb2xlEiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVSb2xlUmVxdWVzdBotLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlUm9sZVJlc3BvbnNlIjWC0+STAi8qLS92MS97bmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKi9yb2xlcy8qfRK6AQoOQXNzaWduVGVhbVJvbGUSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFzc2lnblRlYW1Sb2xlUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXNzaWduVGVhbVJvbGVSZXNwb25zZSJDgtPkkwI9OgEqIjgvdjEve3JvbGU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovcm9sZXMvKn06YXNzaWduVGVhbRLCAQoQVW5hc3NpZ25UZWFtUm9sZRIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVW5hc3NpZ25UZWFtUm9sZVJlcXVlc3QaMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVuYXNzaWduVGVhbVJvbGVSZXNwb25zZSJFgtPkkwI/OgEqIjovdjEve3JvbGU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovcm9sZXMvKn06dW5hc3NpZ25UZWFtEq8BCg1MaXN0Um9sZVRlYW1zEi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0Um9sZVRlYW1zUmVxdWVzdBowLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFJvbGVUZWFtc1Jlc3BvbnNlIjuC0+STAjUSMy92MS97cm9sZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKi9yb2xlcy8qfS90ZWFtcxKvAQoNTGlzdFRlYW1Sb2xlcxIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFRlYW1Sb2xlc1JlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RUZWFtUm9sZXNSZXNwb25zZSI7gtPkkwI1EjMvdjEve3RlYW09YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovdGVhbXMvKn0vcm9sZXMaGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21C/gEKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQglSb2xlUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Role represents a named Cedar entity within an organization. + * Roles can be assigned to teams. Permissions are defined via Cedar policies. + * Cedar entity type: AIGateway::Role + * + * @generated from message redpanda.api.aigateway.v1.Role + */ +export type Role = Message<"redpanda.api.aigateway.v1.Role"> & { + /** + * Resource name. Format: `accounts/{account}/organizations/{organization}/roles/{role}` + * Role ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name (must be unique within organization) + * This is used in Cedar policies: AIGateway::Role::"Admin" + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 4; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 5; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 6; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 7; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 8; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Role. + * Use `create(RoleSchema)` to create a new message. + */ +export const RoleSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 0); + +/** + * TeamRoleAssignment represents the assignment of a role to a team. + * + * @generated from message redpanda.api.aigateway.v1.TeamRoleAssignment + */ +export type TeamRoleAssignment = Message<"redpanda.api.aigateway.v1.TeamRoleAssignment"> & { + /** + * Reference to the team. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string team = 1; + */ + team: string; + + /** + * Reference to the role. + * Format: `accounts/{account}/organizations/{organization}/roles/{role}` + * + * @generated from field: string role = 2; + */ + role: string; + + /** + * Output only. When the assignment was created + * + * @generated from field: google.protobuf.Timestamp assigned_at = 3; + */ + assignedAt?: Timestamp; + + /** + * Output only. Who created the assignment + * + * @generated from field: string assigned_by = 4; + */ + assignedBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TeamRoleAssignment. + * Use `create(TeamRoleAssignmentSchema)` to create a new message. + */ +export const TeamRoleAssignmentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 1); + +/** + * Request message for CreateRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateRoleRequest + */ +export type CreateRoleRequest = Message<"redpanda.api.aigateway.v1.CreateRoleRequest"> & { + /** + * Required: Parent organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The role ID to use. If empty, server generates one. + * + * @generated from field: string role_id = 2; + */ + roleId: string; + + /** + * Required: The role resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Role role = 3; + */ + role?: Role; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRoleRequest. + * Use `create(CreateRoleRequestSchema)` to create a new message. + */ +export const CreateRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 2); + +/** + * Response message for CreateRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateRoleResponse + */ +export type CreateRoleResponse = Message<"redpanda.api.aigateway.v1.CreateRoleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Role role = 1; + */ + role?: Role; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRoleResponse. + * Use `create(CreateRoleResponseSchema)` to create a new message. + */ +export const CreateRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 3); + +/** + * Request message for GetRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetRoleRequest + */ +export type GetRoleRequest = Message<"redpanda.api.aigateway.v1.GetRoleRequest"> & { + /** + * Resource name of the role. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRoleRequest. + * Use `create(GetRoleRequestSchema)` to create a new message. + */ +export const GetRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 4); + +/** + * Response message for GetRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetRoleResponse + */ +export type GetRoleResponse = Message<"redpanda.api.aigateway.v1.GetRoleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Role role = 1; + */ + role?: Role; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRoleResponse. + * Use `create(GetRoleResponseSchema)` to create a new message. + */ +export const GetRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 5); + +/** + * Request message for ListRoles RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListRolesRequest + */ +export type ListRolesRequest = Message<"redpanda.api.aigateway.v1.ListRolesRequest"> & { + /** + * Required: Parent organization. + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of roles to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListRoles call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRolesRequest. + * Use `create(ListRolesRequestSchema)` to create a new message. + */ +export const ListRolesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 6); + +/** + * Response message for ListRoles RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListRolesResponse + */ +export type ListRolesResponse = Message<"redpanda.api.aigateway.v1.ListRolesResponse"> & { + /** + * The list of roles + * + * @generated from field: repeated redpanda.api.aigateway.v1.Role roles = 1; + */ + roles: Role[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching roles + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRolesResponse. + * Use `create(ListRolesResponseSchema)` to create a new message. + */ +export const ListRolesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 7); + +/** + * Request message for UpdateRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateRoleRequest + */ +export type UpdateRoleRequest = Message<"redpanda.api.aigateway.v1.UpdateRoleRequest"> & { + /** + * Required: The role resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.Role role = 1; + */ + role?: Role; + + /** + * The fields to update. + * Allowed fields: display_name, description, metadata + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRoleRequest. + * Use `create(UpdateRoleRequestSchema)` to create a new message. + */ +export const UpdateRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 8); + +/** + * Response message for UpdateRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateRoleResponse + */ +export type UpdateRoleResponse = Message<"redpanda.api.aigateway.v1.UpdateRoleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Role role = 1; + */ + role?: Role; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRoleResponse. + * Use `create(UpdateRoleResponseSchema)` to create a new message. + */ +export const UpdateRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 9); + +/** + * Request message for DeleteRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteRoleRequest + */ +export type DeleteRoleRequest = Message<"redpanda.api.aigateway.v1.DeleteRoleRequest"> & { + /** + * Resource name of the role to delete. + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, unassign all teams from this role before deleting + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRoleRequest. + * Use `create(DeleteRoleRequestSchema)` to create a new message. + */ +export const DeleteRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 10); + +/** + * Response message for DeleteRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteRoleResponse + */ +export type DeleteRoleResponse = Message<"redpanda.api.aigateway.v1.DeleteRoleResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRoleResponse. + * Use `create(DeleteRoleResponseSchema)` to create a new message. + */ +export const DeleteRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 11); + +/** + * Request message for AssignTeamRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.AssignTeamRoleRequest + */ +export type AssignTeamRoleRequest = Message<"redpanda.api.aigateway.v1.AssignTeamRoleRequest"> & { + /** + * Required: Role to assign. + * Format: `accounts/{account}/organizations/{organization}/roles/{role}` + * + * @generated from field: string role = 1; + */ + role: string; + + /** + * Required: Team to assign the role to. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string team = 2; + */ + team: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AssignTeamRoleRequest. + * Use `create(AssignTeamRoleRequestSchema)` to create a new message. + */ +export const AssignTeamRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 12); + +/** + * Response message for AssignTeamRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.AssignTeamRoleResponse + */ +export type AssignTeamRoleResponse = Message<"redpanda.api.aigateway.v1.AssignTeamRoleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.TeamRoleAssignment assignment = 1; + */ + assignment?: TeamRoleAssignment; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AssignTeamRoleResponse. + * Use `create(AssignTeamRoleResponseSchema)` to create a new message. + */ +export const AssignTeamRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 13); + +/** + * Request message for UnassignTeamRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UnassignTeamRoleRequest + */ +export type UnassignTeamRoleRequest = Message<"redpanda.api.aigateway.v1.UnassignTeamRoleRequest"> & { + /** + * Required: Role to unassign. + * Format: `accounts/{account}/organizations/{organization}/roles/{role}` + * + * @generated from field: string role = 1; + */ + role: string; + + /** + * Required: Team to unassign the role from. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string team = 2; + */ + team: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UnassignTeamRoleRequest. + * Use `create(UnassignTeamRoleRequestSchema)` to create a new message. + */ +export const UnassignTeamRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 14); + +/** + * Response message for UnassignTeamRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UnassignTeamRoleResponse + */ +export type UnassignTeamRoleResponse = Message<"redpanda.api.aigateway.v1.UnassignTeamRoleResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UnassignTeamRoleResponse. + * Use `create(UnassignTeamRoleResponseSchema)` to create a new message. + */ +export const UnassignTeamRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 15); + +/** + * Request message for ListRoleTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListRoleTeamsRequest + */ +export type ListRoleTeamsRequest = Message<"redpanda.api.aigateway.v1.ListRoleTeamsRequest"> & { + /** + * Required: Role to list teams for. + * Format: `accounts/{account}/organizations/{organization}/roles/{role}` + * + * @generated from field: string role = 1; + */ + role: string; + + /** + * Maximum number of assignments to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRoleTeamsRequest. + * Use `create(ListRoleTeamsRequestSchema)` to create a new message. + */ +export const ListRoleTeamsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 16); + +/** + * Response message for ListRoleTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListRoleTeamsResponse + */ +export type ListRoleTeamsResponse = Message<"redpanda.api.aigateway.v1.ListRoleTeamsResponse"> & { + /** + * The list of team role assignments + * + * @generated from field: repeated redpanda.api.aigateway.v1.TeamRoleAssignment assignments = 1; + */ + assignments: TeamRoleAssignment[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRoleTeamsResponse. + * Use `create(ListRoleTeamsResponseSchema)` to create a new message. + */ +export const ListRoleTeamsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 17); + +/** + * Request message for ListTeamRoles RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamRolesRequest + */ +export type ListTeamRolesRequest = Message<"redpanda.api.aigateway.v1.ListTeamRolesRequest"> & { + /** + * Required: Team to list roles for. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string team = 1; + */ + team: string; + + /** + * Maximum number of assignments to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamRolesRequest. + * Use `create(ListTeamRolesRequestSchema)` to create a new message. + */ +export const ListTeamRolesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 18); + +/** + * Response message for ListTeamRoles RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamRolesResponse + */ +export type ListTeamRolesResponse = Message<"redpanda.api.aigateway.v1.ListTeamRolesResponse"> & { + /** + * The list of team role assignments + * + * @generated from field: repeated redpanda.api.aigateway.v1.TeamRoleAssignment assignments = 1; + */ + assignments: TeamRoleAssignment[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamRolesResponse. + * Use `create(ListTeamRolesResponseSchema)` to create a new message. + */ +export const ListTeamRolesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_role, 19); + +/** + * RoleService manages roles within organizations. + * Roles are Cedar entities that teams can be assigned to. + * Permissions for roles are defined via Cedar policies, not stored in the role itself. + * Resource name: accounts/{account_id}/organizations/{organization_id}/roles/{role_id} + * + * @generated from service redpanda.api.aigateway.v1.RoleService + */ +export const RoleService: GenService<{ + /** + * Creates a new role within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.CreateRole + */ + createRole: { + methodKind: "unary"; + input: typeof CreateRoleRequestSchema; + output: typeof CreateRoleResponseSchema; + }, + /** + * Gets a role by name. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.GetRole + */ + getRole: { + methodKind: "unary"; + input: typeof GetRoleRequestSchema; + output: typeof GetRoleResponseSchema; + }, + /** + * Lists roles within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListRoles + */ + listRoles: { + methodKind: "unary"; + input: typeof ListRolesRequestSchema; + output: typeof ListRolesResponseSchema; + }, + /** + * Updates a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.UpdateRole + */ + updateRole: { + methodKind: "unary"; + input: typeof UpdateRoleRequestSchema; + output: typeof UpdateRoleResponseSchema; + }, + /** + * Deletes a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.DeleteRole + */ + deleteRole: { + methodKind: "unary"; + input: typeof DeleteRoleRequestSchema; + output: typeof DeleteRoleResponseSchema; + }, + /** + * Assigns a role to a team. + * Implements Cedar pattern: Team in Role + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.AssignTeamRole + */ + assignTeamRole: { + methodKind: "unary"; + input: typeof AssignTeamRoleRequestSchema; + output: typeof AssignTeamRoleResponseSchema; + }, + /** + * Unassigns a role from a team. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.UnassignTeamRole + */ + unassignTeamRole: { + methodKind: "unary"; + input: typeof UnassignTeamRoleRequestSchema; + output: typeof UnassignTeamRoleResponseSchema; + }, + /** + * Lists teams assigned to a role. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListRoleTeams + */ + listRoleTeams: { + methodKind: "unary"; + input: typeof ListRoleTeamsRequestSchema; + output: typeof ListRoleTeamsResponseSchema; + }, + /** + * Lists roles assigned to a team. + * + * @generated from rpc redpanda.api.aigateway.v1.RoleService.ListTeamRoles + */ + listTeamRoles: { + methodKind: "unary"; + input: typeof ListTeamRolesRequestSchema; + output: typeof ListTeamRolesResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_role, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/routing-RoutingService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/routing-RoutingService_connectquery.ts new file mode 100644 index 0000000000..6c6dfe4f6d --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/routing-RoutingService_connectquery.ts @@ -0,0 +1,30 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/routing.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { RoutingService } from "./routing_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule + */ +export const createRoutingRule = RoutingService.method.createRoutingRule; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.GetRoutingRule + */ +export const getRoutingRule = RoutingService.method.getRoutingRule; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.ListRoutingRules + */ +export const listRoutingRules = RoutingService.method.listRoutingRules; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule + */ +export const updateRoutingRule = RoutingService.method.updateRoutingRule; + +/** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule + */ +export const deleteRoutingRule = RoutingService.method.deleteRoutingRule; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/routing_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/routing_pb.ts new file mode 100644 index 0000000000..d14bcc18d9 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/routing_pb.ts @@ -0,0 +1,351 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/routing.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/routing.proto. + */ +export const file_redpanda_api_aigateway_v1_routing: GenFile = /*@__PURE__*/ + fileDesc("CidyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3JvdXRpbmcucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEiWQoZQ3JlYXRlUm91dGluZ1J1bGVSZXNwb25zZRI8Cgxyb3V0aW5nX3J1bGUYASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvdXRpbmdSdWxlIlYKFkdldFJvdXRpbmdSdWxlUmVzcG9uc2USPAoMcm91dGluZ19ydWxlGAEgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb3V0aW5nUnVsZSJZChlVcGRhdGVSb3V0aW5nUnVsZVJlc3BvbnNlEjwKDHJvdXRpbmdfcnVsZRgBIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm91dGluZ1J1bGUiGwoZRGVsZXRlUm91dGluZ1J1bGVSZXNwb25zZSKSBQoLUm91dGluZ1J1bGUSEQoEbmFtZRgBIAEoCUID4EEIEiAKDGRpc3BsYXlfbmFtZRgCIAEoCUIK4EECukgEcgIQARITCgtkZXNjcmlwdGlvbhgDIAEoCRIfCghwcmlvcml0eRgEIAEoBUIN4EECukgHGgUY5wcoABIeCgpleHByZXNzaW9uGAUgASgJQgrgQQK6SARyAhABEkcKDGJhY2tlbmRfcG9vbBgGIAEoCUIx4EEC+kEkCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0JhY2tlbmRQb29sukgEcgIQARJBCg1mYWxsYmFja19wb29sGAsgASgJQirgQQH6QSQKImFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQmFja2VuZFBvb2wSDwoHZW5hYmxlZBgHIAEoCBJGCghtZXRhZGF0YRgIIAMoCzI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm91dGluZ1J1bGUuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAE6dupBcwoiYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Sb3V0aW5nUnVsZRIvZ2F0ZXdheXMve2dhdGV3YXl9L3JvdXRpbmctcnVsZXMve3JvdXRpbmdfcnVsZX0SHHJvdXRpbmctcnVsZXMve3JvdXRpbmdfcnVsZX0ihAEKGENyZWF0ZVJvdXRpbmdSdWxlUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSQQoMcm91dGluZ19ydWxlGAMgASgLMiYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Sb3V0aW5nUnVsZUID4EECSgQIAhADUg9yb3V0aW5nX3J1bGVfaWQiUQoVR2V0Um91dGluZ1J1bGVSZXF1ZXN0EjgKBG5hbWUYASABKAlCKuBBAvpBJAoiYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Sb3V0aW5nUnVsZSJyChdMaXN0Um91dGluZ1J1bGVzUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSEQoJcGFnZV9zaXplGAIgASgFEhIKCnBhZ2VfdG9rZW4YAyABKAkSDgoGZmlsdGVyGAQgASgJEhAKCG9yZGVyX2J5GAUgASgJIoYBChhMaXN0Um91dGluZ1J1bGVzUmVzcG9uc2USPQoNcm91dGluZ19ydWxlcxgBIAMoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm91dGluZ1J1bGUSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhIKCnRvdGFsX3NpemUYAyABKAUijgEKGFVwZGF0ZVJvdXRpbmdSdWxlUmVxdWVzdBJBCgxyb3V0aW5nX3J1bGUYASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvdXRpbmdSdWxlQgPgQQISLwoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIlQKGERlbGV0ZVJvdXRpbmdSdWxlUmVxdWVzdBI4CgRuYW1lGAEgASgJQirgQQL6QSQKImFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vUm91dGluZ1J1bGUyywgKDlJvdXRpbmdTZXJ2aWNlEt4BChFDcmVhdGVSb3V0aW5nUnVsZRIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlUm91dGluZ1J1bGVSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVSb3V0aW5nUnVsZVJlc3BvbnNlIl6C0+STAlg6DHJvdXRpbmdfcnVsZVohOgxyb3V0aW5nX3J1bGUiES92MS9yb3V0aW5nLXJ1bGVzIiUvdjEve3BhcmVudD1nYXRld2F5cy8qfS9yb3V0aW5nLXJ1bGVzEsIBCg5HZXRSb3V0aW5nUnVsZRIwLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0Um91dGluZ1J1bGVSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRSb3V0aW5nUnVsZVJlc3BvbnNlIkuC0+STAkVaHBIaL3YxL3tuYW1lPXJvdXRpbmctcnVsZXMvKn0SJS92MS97bmFtZT1nYXRld2F5cy8qL3JvdXRpbmctcnVsZXMvKn0SvwEKEExpc3RSb3V0aW5nUnVsZXMSMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RSb3V0aW5nUnVsZXNSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0Um91dGluZ1J1bGVzUmVzcG9uc2UiQoLT5JMCPFoTEhEvdjEvcm91dGluZy1ydWxlcxIlL3YxL3twYXJlbnQ9Z2F0ZXdheXMvKn0vcm91dGluZy1ydWxlcxKCAgoRVXBkYXRlUm91dGluZ1J1bGUSMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVJvdXRpbmdSdWxlUmVxdWVzdBo0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlUm91dGluZ1J1bGVSZXNwb25zZSKBAYLT5JMCezoMcm91dGluZ19ydWxlWjc6DHJvdXRpbmdfcnVsZTInL3YxL3tyb3V0aW5nX3J1bGUubmFtZT1yb3V0aW5nLXJ1bGVzLyp9MjIvdjEve3JvdXRpbmdfcnVsZS5uYW1lPWdhdGV3YXlzLyovcm91dGluZy1ydWxlcy8qfRLLAQoRRGVsZXRlUm91dGluZ1J1bGUSMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVJvdXRpbmdSdWxlUmVxdWVzdBo0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlUm91dGluZ1J1bGVSZXNwb25zZSJLgtPkkwJFWhwqGi92MS97bmFtZT1yb3V0aW5nLXJ1bGVzLyp9KiUvdjEve25hbWU9Z2F0ZXdheXMvKi9yb3V0aW5nLXJ1bGVzLyp9QoECCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUIMUm91dGluZ1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateRoutingRule RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateRoutingRuleResponse + */ +export type CreateRoutingRuleResponse = Message<"redpanda.api.aigateway.v1.CreateRoutingRuleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 1; + */ + routingRule?: RoutingRule; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRoutingRuleResponse. + * Use `create(CreateRoutingRuleResponseSchema)` to create a new message. + */ +export const CreateRoutingRuleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 0); + +/** + * Response message for GetRoutingRule RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetRoutingRuleResponse + */ +export type GetRoutingRuleResponse = Message<"redpanda.api.aigateway.v1.GetRoutingRuleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 1; + */ + routingRule?: RoutingRule; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRoutingRuleResponse. + * Use `create(GetRoutingRuleResponseSchema)` to create a new message. + */ +export const GetRoutingRuleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 1); + +/** + * Response message for UpdateRoutingRule RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateRoutingRuleResponse + */ +export type UpdateRoutingRuleResponse = Message<"redpanda.api.aigateway.v1.UpdateRoutingRuleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 1; + */ + routingRule?: RoutingRule; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRoutingRuleResponse. + * Use `create(UpdateRoutingRuleResponseSchema)` to create a new message. + */ +export const UpdateRoutingRuleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 2); + +/** + * Response message for DeleteRoutingRule RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteRoutingRuleResponse + */ +export type DeleteRoutingRuleResponse = Message<"redpanda.api.aigateway.v1.DeleteRoutingRuleResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRoutingRuleResponse. + * Use `create(DeleteRoutingRuleResponseSchema)` to create a new message. + */ +export const DeleteRoutingRuleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 3); + +/** + * @generated from message redpanda.api.aigateway.v1.RoutingRule + */ +export type RoutingRule = Message<"redpanda.api.aigateway.v1.RoutingRule"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * @generated from field: string description = 3; + */ + description: string; + + /** + * @generated from field: int32 priority = 4; + */ + priority: number; + + /** + * @generated from field: string expression = 5; + */ + expression: string; + + /** + * @generated from field: string backend_pool = 6; + */ + backendPool: string; + + /** + * Optional fallback backend pool to use when primary pool fails. + * Must reference a different pool than backend_pool. + * + * @generated from field: string fallback_pool = 11; + */ + fallbackPool: string; + + /** + * @generated from field: bool enabled = 7; + */ + enabled: boolean; + + /** + * @generated from field: map metadata = 8; + */ + metadata: { [key: string]: string }; + + /** + * @generated from field: google.protobuf.Timestamp create_time = 9; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 10; + */ + updateTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RoutingRule. + * Use `create(RoutingRuleSchema)` to create a new message. + */ +export const RoutingRuleSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateRoutingRuleRequest + */ +export type CreateRoutingRuleRequest = Message<"redpanda.api.aigateway.v1.CreateRoutingRuleRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 3; + */ + routingRule?: RoutingRule; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateRoutingRuleRequest. + * Use `create(CreateRoutingRuleRequestSchema)` to create a new message. + */ +export const CreateRoutingRuleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.GetRoutingRuleRequest + */ +export type GetRoutingRuleRequest = Message<"redpanda.api.aigateway.v1.GetRoutingRuleRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetRoutingRuleRequest. + * Use `create(GetRoutingRuleRequestSchema)` to create a new message. + */ +export const GetRoutingRuleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.ListRoutingRulesRequest + */ +export type ListRoutingRulesRequest = Message<"redpanda.api.aigateway.v1.ListRoutingRulesRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRoutingRulesRequest. + * Use `create(ListRoutingRulesRequestSchema)` to create a new message. + */ +export const ListRoutingRulesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.ListRoutingRulesResponse + */ +export type ListRoutingRulesResponse = Message<"redpanda.api.aigateway.v1.ListRoutingRulesResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.RoutingRule routing_rules = 1; + */ + routingRules: RoutingRule[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListRoutingRulesResponse. + * Use `create(ListRoutingRulesResponseSchema)` to create a new message. + */ +export const ListRoutingRulesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateRoutingRuleRequest + */ +export type UpdateRoutingRuleRequest = Message<"redpanda.api.aigateway.v1.UpdateRoutingRuleRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.RoutingRule routing_rule = 1; + */ + routingRule?: RoutingRule; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateRoutingRuleRequest. + * Use `create(UpdateRoutingRuleRequestSchema)` to create a new message. + */ +export const UpdateRoutingRuleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteRoutingRuleRequest + */ +export type DeleteRoutingRuleRequest = Message<"redpanda.api.aigateway.v1.DeleteRoutingRuleRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteRoutingRuleRequest. + * Use `create(DeleteRoutingRuleRequestSchema)` to create a new message. + */ +export const DeleteRoutingRuleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_routing, 10); + +/** + * @generated from service redpanda.api.aigateway.v1.RoutingService + */ +export const RoutingService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.CreateRoutingRule + */ + createRoutingRule: { + methodKind: "unary"; + input: typeof CreateRoutingRuleRequestSchema; + output: typeof CreateRoutingRuleResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.GetRoutingRule + */ + getRoutingRule: { + methodKind: "unary"; + input: typeof GetRoutingRuleRequestSchema; + output: typeof GetRoutingRuleResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.ListRoutingRules + */ + listRoutingRules: { + methodKind: "unary"; + input: typeof ListRoutingRulesRequestSchema; + output: typeof ListRoutingRulesResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.UpdateRoutingRule + */ + updateRoutingRule: { + methodKind: "unary"; + input: typeof UpdateRoutingRuleRequestSchema; + output: typeof UpdateRoutingRuleResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.RoutingService.DeleteRoutingRule + */ + deleteRoutingRule: { + methodKind: "unary"; + input: typeof DeleteRoutingRuleRequestSchema; + output: typeof DeleteRoutingRuleResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_routing, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/settings-SettingsService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/settings-SettingsService_connectquery.ts new file mode 100644 index 0000000000..8f20376f43 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/settings-SettingsService_connectquery.ts @@ -0,0 +1,19 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/settings.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { SettingsService } from "./settings_pb"; + +/** + * Gets the global settings for the entire deployment. + * + * @generated from rpc redpanda.api.aigateway.v1.SettingsService.GetSettings + */ +export const getSettings = SettingsService.method.getSettings; + +/** + * Updates the global settings for the entire deployment. + * + * @generated from rpc redpanda.api.aigateway.v1.SettingsService.UpdateSettings + */ +export const updateSettings = SettingsService.method.updateSettings; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/settings_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/settings_pb.ts new file mode 100644 index 0000000000..5bef10a4d3 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/settings_pb.ts @@ -0,0 +1,699 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/settings.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/settings.proto. + */ +export const file_redpanda_api_aigateway_v1_settings: GenFile = /*@__PURE__*/ + fileDesc("CihyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3NldHRpbmdzLnByb3RvEhlyZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxIhQKEkdldFNldHRpbmdzUmVxdWVzdCJMChNHZXRTZXR0aW5nc1Jlc3BvbnNlEjUKCHNldHRpbmdzGAEgASgLMiMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TZXR0aW5ncyJTChVVcGRhdGVTZXR0aW5nc1JlcXVlc3QSOgoIc2V0dGluZ3MYASABKAsyIy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNldHRpbmdzQgPgQQIiTwoWVXBkYXRlU2V0dGluZ3NSZXNwb25zZRI1CghzZXR0aW5ncxgBIAEoCzIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU2V0dGluZ3MisAMKCFNldHRpbmdzEjMKB3N0b3JhZ2UYASABKAsyIi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlN0b3JhZ2USSgoVcmF0ZV9saW1pdGVyX2RlZmF1bHRzGAIgASgLMisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SYXRlTGltaXRlckluZnJhEkwKFnNwZW5kX2xpbWl0ZXJfZGVmYXVsdHMYAyABKAsyLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kTGltaXRlckluZnJhEjMKBG9pZGMYBCABKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9JRENDb25maWcSQAoLbWNwX2dhdGV3YXkYBSABKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk1DUEdhdGV3YXlDb25maWcSLgoKY3JlYXRlZF9hdBhkIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBhlIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAihQEKB1N0b3JhZ2USNwoFcmVkaXMYASADKAsyKC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlZGlzSW5zdGFuY2USQQoKcG9zdGdyZXNxbBgCIAMoCzItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUG9zdGdyZVNRTEluc3RhbmNlIvsCCg1SZWRpc0luc3RhbmNlEhYKAmlkGAEgASgJQgrgQQK6SARyAhABEhsKB2FkZHJlc3MYAiABKAlCCuBBArpIBHICEAESEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIcGFzc3dvcmQYBCABKAkSEwoLdGxzX2VuYWJsZWQYBSABKAgSIAoYdGxzX2luc2VjdXJlX3NraXBfdmVyaWZ5GAYgASgIEhUKDXRsc19jZXJ0X2ZpbGUYByABKAkSFAoMdGxzX2tleV9maWxlGAggASgJEhgKEHRsc19jYV9jZXJ0X2ZpbGUYCSABKAkSFwoPdGxzX3NlcnZlcl9uYW1lGAogASgJEhoKCXBvb2xfc2l6ZRgLIAEoBUIHukgEGgIoARIYCgd0aW1lb3V0GAwgASgFQge6SAQaAigBEkEKCWRhdGFiYXNlcxgNIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVkaXNEYXRhYmFzZXNCA+BBAiJ3Cg5SZWRpc0RhdGFiYXNlcxIdCgxyYXRlX2xpbWl0ZXIYASABKAVCB7pIBBoCKAASJAoTdG9rZW5fdHJhY2tlcl9jYWNoZRgCIAEoBUIHukgEGgIoABIgCg9zZXNzaW9uX21hbmFnZXIYAyABKAVCB7pIBBoCKAAi1gIKElBvc3RncmVTUUxJbnN0YW5jZRIWCgJpZBgBIAEoCUIK4EECukgEcgIQARIYCgRob3N0GAIgASgJQgrgQQK6SARyAhABEhwKBHBvcnQYAyABKAVCDuBBArpICBoGGP//AygBEhwKCGRhdGFiYXNlGAQgASgJQgrgQQK6SARyAhABEhgKBHVzZXIYBSABKAlCCuBBArpIBHICEAESEAoIcGFzc3dvcmQYBiABKAkSEwoLZGVzY3JpcHRpb24YByABKAkSEAoIc3NsX21vZGUYCCABKAkSGgoJbWF4X2Nvbm5zGAkgASgFQge6SAQaAigBEhoKCW1pbl9jb25ucxgKIAEoBUIHukgEGgIoABIiChFtYXhfY29ubl9saWZldGltZRgLIAEoBUIHukgEGgIoABIjChJtYXhfY29ubl9pZGxlX3RpbWUYDCABKAVCB7pIBBoCKAAiSAoQUmF0ZUxpbWl0ZXJJbmZyYRIPCgdlbmFibGVkGAEgASgIEg8KB25vZGVfaWQYAiABKAkSEgoKc3RvcmFnZV9pZBgDIAEoCSJqChFTcGVuZExpbWl0ZXJJbmZyYRIPCgdlbmFibGVkGAEgASgIEkQKDXRva2VuX3RyYWNrZXIYAiABKAsyLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRva2VuVHJhY2tlckNvbmZpZyK1AQoSVG9rZW5UcmFja2VyQ29uZmlnEhQKDHN0b3JhZ2VfdHlwZRgBIAEoCRINCgVhc3luYxgCIAEoCBIcCgtidWZmZXJfc2l6ZRgDIAEoBUIHukgEGgIoARIfCg5mbHVzaF9pbnRlcnZhbBgEIAEoBUIHukgEGgIoARI7CgVjYWNoZRgFIAEoCzIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVG9rZW5UcmFja2VyQ2FjaGUiRQoRVG9rZW5UcmFja2VyQ2FjaGUSDwoHZW5hYmxlZBgBIAEoCBILCgN0dGwYAiABKAkSEgoKc3RvcmFnZV9pZBgDIAEoCSJwCgpPSURDQ29uZmlnEg8KB2VuYWJsZWQYASABKAgSEgoKaXNzdWVyX3VybBgCIAEoCRIZChFhbGxvd2VkX2F1ZGllbmNlcxgDIAMoCRIiChFjbG9ja19za2V3X2xlZXdheRgEIAEoBUIHukgEGgIoACJfChBNQ1BHYXRld2F5Q29uZmlnEksKD3Nlc3Npb25fbWFuYWdlchgBIAEoCzIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTUNQU2Vzc2lvbk1hbmFnZXJDb25maWciTwoXTUNQU2Vzc2lvbk1hbmFnZXJDb25maWcSEgoKc3RvcmFnZV9pZBgBIAEoCRIgChhlbmZvcmNlX2lkZW50aXR5X2JpbmRpbmcYAiABKAgyyQIKD1NldHRpbmdzU2VydmljZRKCAQoLR2V0U2V0dGluZ3MSLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFNldHRpbmdzUmVxdWVzdBouLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U2V0dGluZ3NSZXNwb25zZSIUgtPkkwIOEgwvdjEvc2V0dGluZ3MSlQEKDlVwZGF0ZVNldHRpbmdzEjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVTZXR0aW5nc1JlcXVlc3QaMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVNldHRpbmdzUmVzcG9uc2UiHoLT5JMCGDoIc2V0dGluZ3MaDC92MS9zZXR0aW5ncxoZykEWYWlnYXRld2F5LnJlZHBhbmRhLmNvbUKCAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCDVNldHRpbmdzUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_protobuf_timestamp]); + +/** + * Request message for GetSettings RPC. + * + * Empty - settings are global (only one row exists) + * + * @generated from message redpanda.api.aigateway.v1.GetSettingsRequest + */ +export type GetSettingsRequest = Message<"redpanda.api.aigateway.v1.GetSettingsRequest"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSettingsRequest. + * Use `create(GetSettingsRequestSchema)` to create a new message. + */ +export const GetSettingsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 0); + +/** + * Response message for GetSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetSettingsResponse + */ +export type GetSettingsResponse = Message<"redpanda.api.aigateway.v1.GetSettingsResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Settings settings = 1; + */ + settings?: Settings; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSettingsResponse. + * Use `create(GetSettingsResponseSchema)` to create a new message. + */ +export const GetSettingsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 1); + +/** + * Request message for UpdateSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateSettingsRequest + */ +export type UpdateSettingsRequest = Message<"redpanda.api.aigateway.v1.UpdateSettingsRequest"> & { + /** + * Required: Updated settings + * + * @generated from field: redpanda.api.aigateway.v1.Settings settings = 1; + */ + settings?: Settings; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateSettingsRequest. + * Use `create(UpdateSettingsRequestSchema)` to create a new message. + */ +export const UpdateSettingsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 2); + +/** + * Response message for UpdateSettings RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateSettingsResponse + */ +export type UpdateSettingsResponse = Message<"redpanda.api.aigateway.v1.UpdateSettingsResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Settings settings = 1; + */ + settings?: Settings; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateSettingsResponse. + * Use `create(UpdateSettingsResponseSchema)` to create a new message. + */ +export const UpdateSettingsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 3); + +/** + * Settings represents global deployment-wide configuration. + * These settings are shared by ALL virtual gateways. + * + * @generated from message redpanda.api.aigateway.v1.Settings + */ +export type Settings = Message<"redpanda.api.aigateway.v1.Settings"> & { + /** + * Global storage configuration (Redis, PostgreSQL instances) + * + * @generated from field: redpanda.api.aigateway.v1.Storage storage = 1; + */ + storage?: Storage; + + /** + * Global rate limiter infrastructure defaults (optional) + * + * @generated from field: redpanda.api.aigateway.v1.RateLimiterInfra rate_limiter_defaults = 2; + */ + rateLimiterDefaults?: RateLimiterInfra; + + /** + * Global spend limiter infrastructure defaults (optional) + * + * @generated from field: redpanda.api.aigateway.v1.SpendLimiterInfra spend_limiter_defaults = 3; + */ + spendLimiterDefaults?: SpendLimiterInfra; + + /** + * Global OIDC authentication configuration (optional) + * When enabled, all gateways will require JWT token validation + * + * @generated from field: redpanda.api.aigateway.v1.OIDCConfig oidc = 4; + */ + oidc?: OIDCConfig; + + /** + * Global MCP gateway configuration (optional) + * Configures session management for all MCP backends + * + * @generated from field: redpanda.api.aigateway.v1.MCPGatewayConfig mcp_gateway = 5; + */ + mcpGateway?: MCPGatewayConfig; + + /** + * Metadata + * + * @generated from field: google.protobuf.Timestamp created_at = 100; + */ + createdAt?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp updated_at = 101; + */ + updatedAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Settings. + * Use `create(SettingsSchema)` to create a new message. + */ +export const SettingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 4); + +/** + * Storage represents centralized storage configuration. + * Components reference these storage backends by ID. + * + * @generated from message redpanda.api.aigateway.v1.Storage + */ +export type Storage = Message<"redpanda.api.aigateway.v1.Storage"> & { + /** + * List of Redis instances for distributed state + * + * @generated from field: repeated redpanda.api.aigateway.v1.RedisInstance redis = 1; + */ + redis: RedisInstance[]; + + /** + * List of PostgreSQL instances for persistent storage + * + * @generated from field: repeated redpanda.api.aigateway.v1.PostgreSQLInstance postgresql = 2; + */ + postgresql: PostgreSQLInstance[]; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Storage. + * Use `create(StorageSchema)` to create a new message. + */ +export const StorageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 5); + +/** + * RedisInstance represents a single Redis instance configuration. + * + * @generated from message redpanda.api.aigateway.v1.RedisInstance + */ +export type RedisInstance = Message<"redpanda.api.aigateway.v1.RedisInstance"> & { + /** + * Required: Unique identifier for this Redis instance + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * Required: Redis server address (host:port) + * + * @generated from field: string address = 2; + */ + address: string; + + /** + * Optional: Human-readable description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Optional: Redis password + * + * @generated from field: string password = 4; + */ + password: string; + + /** + * Optional: TLS configuration + * + * @generated from field: bool tls_enabled = 5; + */ + tlsEnabled: boolean; + + /** + * @generated from field: bool tls_insecure_skip_verify = 6; + */ + tlsInsecureSkipVerify: boolean; + + /** + * @generated from field: string tls_cert_file = 7; + */ + tlsCertFile: string; + + /** + * @generated from field: string tls_key_file = 8; + */ + tlsKeyFile: string; + + /** + * @generated from field: string tls_ca_cert_file = 9; + */ + tlsCaCertFile: string; + + /** + * @generated from field: string tls_server_name = 10; + */ + tlsServerName: string; + + /** + * Optional: Connection pool size (default: 50) + * + * @generated from field: int32 pool_size = 11; + */ + poolSize: number; + + /** + * Optional: Redis operation timeout in milliseconds (default: 200) + * + * @generated from field: int32 timeout = 12; + */ + timeout: number; + + /** + * Required: Database allocation per component + * + * @generated from field: redpanda.api.aigateway.v1.RedisDatabases databases = 13; + */ + databases?: RedisDatabases; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RedisInstance. + * Use `create(RedisInstanceSchema)` to create a new message. + */ +export const RedisInstanceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 6); + +/** + * RedisDatabases defines database numbers for each component. + * + * @generated from message redpanda.api.aigateway.v1.RedisDatabases + */ +export type RedisDatabases = Message<"redpanda.api.aigateway.v1.RedisDatabases"> & { + /** + * Database for rate limiter counters (default: 0) + * + * @generated from field: int32 rate_limiter = 1; + */ + rateLimiter: number; + + /** + * Database for token tracker query cache (default: 1) + * + * @generated from field: int32 token_tracker_cache = 2; + */ + tokenTrackerCache: number; + + /** + * Database for MCP session manager (default: 2) + * + * @generated from field: int32 session_manager = 3; + */ + sessionManager: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RedisDatabases. + * Use `create(RedisDatabasesSchema)` to create a new message. + */ +export const RedisDatabasesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 7); + +/** + * PostgreSQLInstance represents a single PostgreSQL instance configuration. + * + * @generated from message redpanda.api.aigateway.v1.PostgreSQLInstance + */ +export type PostgreSQLInstance = Message<"redpanda.api.aigateway.v1.PostgreSQLInstance"> & { + /** + * Required: Unique identifier for this PostgreSQL instance + * + * @generated from field: string id = 1; + */ + id: string; + + /** + * Required: PostgreSQL host + * + * @generated from field: string host = 2; + */ + host: string; + + /** + * Required: PostgreSQL port (default: 5432) + * + * @generated from field: int32 port = 3; + */ + port: number; + + /** + * Required: Database name + * + * @generated from field: string database = 4; + */ + database: string; + + /** + * Required: Database user + * + * @generated from field: string user = 5; + */ + user: string; + + /** + * Optional: Database password + * + * @generated from field: string password = 6; + */ + password: string; + + /** + * Optional: Human-readable description + * + * @generated from field: string description = 7; + */ + description: string; + + /** + * Optional: SSL mode (default: "require") + * Valid values: "disable", "require", "verify-ca", "verify-full" + * + * @generated from field: string ssl_mode = 8; + */ + sslMode: string; + + /** + * Optional: Connection pool settings + * + * Default: 20 + * + * @generated from field: int32 max_conns = 9; + */ + maxConns: number; + + /** + * Default: 5 + * + * @generated from field: int32 min_conns = 10; + */ + minConns: number; + + /** + * seconds, default: 3600 + * + * @generated from field: int32 max_conn_lifetime = 11; + */ + maxConnLifetime: number; + + /** + * seconds, default: 300 + * + * @generated from field: int32 max_conn_idle_time = 12; + */ + maxConnIdleTime: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.PostgreSQLInstance. + * Use `create(PostgreSQLInstanceSchema)` to create a new message. + */ +export const PostgreSQLInstanceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 8); + +/** + * RateLimiterInfra represents global rate limiter infrastructure configuration. + * + * @generated from message redpanda.api.aigateway.v1.RateLimiterInfra + */ +export type RateLimiterInfra = Message<"redpanda.api.aigateway.v1.RateLimiterInfra"> & { + /** + * Enable rate limiting globally + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * Node ID for distributed coordination + * + * @generated from field: string node_id = 2; + */ + nodeId: string; + + /** + * Optional: Reference to storage.redis[].id + * When not specified, uses first Redis instance + * + * @generated from field: string storage_id = 3; + */ + storageId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RateLimiterInfra. + * Use `create(RateLimiterInfraSchema)` to create a new message. + */ +export const RateLimiterInfraSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 9); + +/** + * SpendLimiterInfra represents global spend limiter infrastructure configuration. + * + * @generated from message redpanda.api.aigateway.v1.SpendLimiterInfra + */ +export type SpendLimiterInfra = Message<"redpanda.api.aigateway.v1.SpendLimiterInfra"> & { + /** + * Enable spend limiting globally + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * Token tracker configuration + * + * @generated from field: redpanda.api.aigateway.v1.TokenTrackerConfig token_tracker = 2; + */ + tokenTracker?: TokenTrackerConfig; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendLimiterInfra. + * Use `create(SpendLimiterInfraSchema)` to create a new message. + */ +export const SpendLimiterInfraSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 10); + +/** + * TokenTrackerConfig represents token tracking configuration. + * + * @generated from message redpanda.api.aigateway.v1.TokenTrackerConfig + */ +export type TokenTrackerConfig = Message<"redpanda.api.aigateway.v1.TokenTrackerConfig"> & { + /** + * Storage backend type + * + * "postgresql", "redpanda", etc. + * + * @generated from field: string storage_type = 1; + */ + storageType: string; + + /** + * Async write settings + * + * @generated from field: bool async = 2; + */ + async: boolean; + + /** + * @generated from field: int32 buffer_size = 3; + */ + bufferSize: number; + + /** + * seconds + * + * @generated from field: int32 flush_interval = 4; + */ + flushInterval: number; + + /** + * Query cache configuration + * + * @generated from field: redpanda.api.aigateway.v1.TokenTrackerCache cache = 5; + */ + cache?: TokenTrackerCache; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TokenTrackerConfig. + * Use `create(TokenTrackerConfigSchema)` to create a new message. + */ +export const TokenTrackerConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 11); + +/** + * TokenTrackerCache represents token tracker cache configuration. + * + * @generated from message redpanda.api.aigateway.v1.TokenTrackerCache + */ +export type TokenTrackerCache = Message<"redpanda.api.aigateway.v1.TokenTrackerCache"> & { + /** + * Enable caching + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * Cache TTL (e.g., "5m", "10s") + * + * @generated from field: string ttl = 2; + */ + ttl: string; + + /** + * Optional: Reference to storage.redis[].id + * When not specified, uses first Redis instance + * + * @generated from field: string storage_id = 3; + */ + storageId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TokenTrackerCache. + * Use `create(TokenTrackerCacheSchema)` to create a new message. + */ +export const TokenTrackerCacheSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 12); + +/** + * OIDCConfig represents global OIDC authentication configuration. + * When enabled, all gateways will validate JWT tokens from the configured issuer. + * + * @generated from message redpanda.api.aigateway.v1.OIDCConfig + */ +export type OIDCConfig = Message<"redpanda.api.aigateway.v1.OIDCConfig"> & { + /** + * Enable/disable OIDC authentication globally + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * OIDC issuer URL for token validation + * Example: "https://accounts.google.com", "https://auth0.com" + * + * @generated from field: string issuer_url = 2; + */ + issuerUrl: string; + + /** + * List of valid audience claims (client IDs) + * Tokens must have at least one matching audience + * + * @generated from field: repeated string allowed_audiences = 3; + */ + allowedAudiences: string[]; + + /** + * Clock skew tolerance in seconds for token validation + * Accounts for time differences between servers (default: 600) + * + * @generated from field: int32 clock_skew_leeway = 4; + */ + clockSkewLeeway: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OIDCConfig. + * Use `create(OIDCConfigSchema)` to create a new message. + */ +export const OIDCConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 13); + +/** + * MCPGatewayConfig represents global configuration for MCP (Model Context Protocol) backends. + * These settings apply to ALL MCP backends in the deployment. + * + * @generated from message redpanda.api.aigateway.v1.MCPGatewayConfig + */ +export type MCPGatewayConfig = Message<"redpanda.api.aigateway.v1.MCPGatewayConfig"> & { + /** + * Session manager configuration for MCP backends + * + * @generated from field: redpanda.api.aigateway.v1.MCPSessionManagerConfig session_manager = 1; + */ + sessionManager?: MCPSessionManagerConfig; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.MCPGatewayConfig. + * Use `create(MCPGatewayConfigSchema)` to create a new message. + */ +export const MCPGatewayConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 14); + +/** + * MCPSessionManagerConfig configures session storage for MCP backends. + * When not specified, auto-detects Redis from global storage.redis[]. + * + * @generated from message redpanda.api.aigateway.v1.MCPSessionManagerConfig + */ +export type MCPSessionManagerConfig = Message<"redpanda.api.aigateway.v1.MCPSessionManagerConfig"> & { + /** + * Optional: Reference to storage.redis[].id for session storage + * When not specified, uses first Redis instance from storage.redis[] + * Falls back to in-memory if no Redis configured + * + * @generated from field: string storage_id = 1; + */ + storageId: string; + + /** + * Optional: Bind sessions to OIDC subject claim (default: true) + * When enabled, each OIDC user gets isolated session + * + * @generated from field: bool enforce_identity_binding = 2; + */ + enforceIdentityBinding: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.MCPSessionManagerConfig. + * Use `create(MCPSessionManagerConfigSchema)` to create a new message. + */ +export const MCPSessionManagerConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_settings, 15); + +/** + * SettingsService manages global deployment-wide settings. + * Settings are shared by ALL virtual gateways in the deployment. + * + * @generated from service redpanda.api.aigateway.v1.SettingsService + */ +export const SettingsService: GenService<{ + /** + * Gets the global settings for the entire deployment. + * + * @generated from rpc redpanda.api.aigateway.v1.SettingsService.GetSettings + */ + getSettings: { + methodKind: "unary"; + input: typeof GetSettingsRequestSchema; + output: typeof GetSettingsResponseSchema; + }, + /** + * Updates the global settings for the entire deployment. + * + * @generated from rpc redpanda.api.aigateway.v1.SettingsService.UpdateSettings + */ + updateSettings: { + methodKind: "unary"; + input: typeof UpdateSettingsRequestSchema; + output: typeof UpdateSettingsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_settings, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit-SpendLimitService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit-SpendLimitService_connectquery.ts new file mode 100644 index 0000000000..b95bc3b793 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit-SpendLimitService_connectquery.ts @@ -0,0 +1,35 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/spend_limit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { SpendLimitService } from "./spend_limit_pb"; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit + */ +export const createSpendLimit = SpendLimitService.method.createSpendLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit + */ +export const getSpendLimit = SpendLimitService.method.getSpendLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits + */ +export const listSpendLimits = SpendLimitService.method.listSpendLimits; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit + */ +export const updateSpendLimit = SpendLimitService.method.updateSpendLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit + */ +export const deleteSpendLimit = SpendLimitService.method.deleteSpendLimit; + +/** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage + */ +export const getSpendLimitUsage = SpendLimitService.method.getSpendLimitUsage; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit_pb.ts new file mode 100644 index 0000000000..958a716c66 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/spend_limit_pb.ts @@ -0,0 +1,577 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/spend_limit.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/spend_limit.proto. + */ +export const file_redpanda_api_aigateway_v1_spend_limit: GenFile = /*@__PURE__*/ + fileDesc("CityZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3NwZW5kX2xpbWl0LnByb3RvEhlyZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxIlYKGENyZWF0ZVNwZW5kTGltaXRSZXNwb25zZRI6CgtzcGVuZF9saW1pdBgBIAEoCzIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdCJTChVHZXRTcGVuZExpbWl0UmVzcG9uc2USOgoLc3BlbmRfbGltaXQYASABKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kTGltaXQiVgoYVXBkYXRlU3BlbmRMaW1pdFJlc3BvbnNlEjoKC3NwZW5kX2xpbWl0GAEgASgLMiUucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TcGVuZExpbWl0IhoKGERlbGV0ZVNwZW5kTGltaXRSZXNwb25zZSJjChpHZXRTcGVuZExpbWl0VXNhZ2VSZXNwb25zZRJFChFzcGVuZF9saW1pdF91c2FnZRgBIAEoCzIqLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdFVzYWdlIt8HCgpTcGVuZExpbWl0EhEKBG5hbWUYASABKAlCA+BBCBIgCgxkaXNwbGF5X25hbWUYAiABKAlCCuBBArpIBHICEAESEwoLZGVzY3JpcHRpb24YAyABKAkSJAoQbWF0Y2hfZXhwcmVzc2lvbhgEIAEoCUIK4EECukgEcgIQARIVCg1rZXlfZXh0cmFjdG9yGAUgASgJEh8KC2xpbWl0X2NlbnRzGAYgASgDQgrgQQK6SAQiAigAEkYKBndpbmRvdxgHIAEoCzIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdFdpbmRvd0IJ4EECukgDyAEBEkgKBmFjdGlvbhgIIAEoDjIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdEFjdGlvbkIL4EECukgFggECIAASGAoQYWxlcnRfdGhyZXNob2xkcxgJIAMoBRIPCgdlbmFibGVkGAogASgIEkUKCG1ldGFkYXRhGAsgAygLMjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5TcGVuZExpbWl0Lk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSIgoRdG9rZW5zX3Blcl9taW51dGUYDiABKANCB7pIBCICKAASHwoOdG9rZW5zX3Blcl9kYXkYDyABKANCB7pIBCICKAAaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOsIC6kFuCiFhaWdhdGV3YXkucmVkcGFuZGEuY29tL1NwZW5kTGltaXQSLWdhdGV3YXlzL3tnYXRld2F5fS9zcGVuZC1saW1pdHMve3NwZW5kX2xpbWl0fRIac3BlbmQtbGltaXRzL3tzcGVuZF9saW1pdH26SM0BGsoBCh1zcGVuZGxpbWl0LmF0X2xlYXN0X29uZV9saW1pdBJaYXQgbGVhc3Qgb25lIGxpbWl0IChsaW1pdF9jZW50cywgdG9rZW5zX3Blcl9taW51dGUsIHRva2Vuc19wZXJfZGF5KSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwGk10aGlzLmxpbWl0X2NlbnRzID4gMCB8fCB0aGlzLnRva2Vuc19wZXJfbWludXRlID4gMCB8fCB0aGlzLnRva2Vuc19wZXJfZGF5ID4gMCKMAQoQU3BlbmRMaW1pdFdpbmRvdxIdCgxzaXplX3NlY29uZHMYASABKAVCB7pIBBoCIAASRwoEdHlwZRgCIAEoDjIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdFdpbmRvd1R5cGVCCLpIBYIBAiAAEhAKCHJlc2V0X2F0GAMgASgJIpACCg9TcGVuZExpbWl0VXNhZ2USOwoLc3BlbmRfbGltaXQYASABKAlCJvpBIwohYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9TcGVuZExpbWl0EhsKE2N1cnJlbnRfc3BlbmRfY2VudHMYAiABKAMSEwoLbGltaXRfY2VudHMYAyABKAMSFwoPcGVyY2VudGFnZV91c2VkGAQgASgFEjAKDHdpbmRvd19zdGFydBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKd2luZG93X2VuZBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoLaXNfZXhjZWVkZWQYByABKAgihgEKF0NyZWF0ZVNwZW5kTGltaXRSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCRJFCgtzcGVuZF9saW1pdBgDIAEoCzIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdEIJ4EECukgDyAEBSgQIAhADUg5zcGVuZF9saW1pdF9pZCJPChRHZXRTcGVuZExpbWl0UmVxdWVzdBI3CgRuYW1lGAEgASgJQingQQL6QSMKIWFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vU3BlbmRMaW1pdCJxChZMaXN0U3BlbmRMaW1pdHNSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCRIOCgZmaWx0ZXIYBCABKAkSEAoIb3JkZXJfYnkYBSABKAkigwEKF0xpc3RTcGVuZExpbWl0c1Jlc3BvbnNlEjsKDHNwZW5kX2xpbWl0cxgBIAMoCzIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU3BlbmRMaW1pdBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKRAQoXVXBkYXRlU3BlbmRMaW1pdFJlcXVlc3QSRQoLc3BlbmRfbGltaXQYASABKAsyJS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlNwZW5kTGltaXRCCeBBArpIA8gBARIvCgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siUgoXRGVsZXRlU3BlbmRMaW1pdFJlcXVlc3QSNwoEbmFtZRgBIAEoCUIp4EEC+kEjCiFhaWdhdGV3YXkucmVkcGFuZGEuY29tL1NwZW5kTGltaXQiZwoZR2V0U3BlbmRMaW1pdFVzYWdlUmVxdWVzdBI3CgRuYW1lGAEgASgJQingQQL6QSMKIWFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vU3BlbmRMaW1pdBIRCglrZXlfdmFsdWUYAiABKAkq8wEKFFNwZW5kTGltaXRXaW5kb3dUeXBlEicKI1NQRU5EX0xJTUlUX1dJTkRPV19UWVBFX1VOU1BFQ0lGSUVEEAASIwofU1BFTkRfTElNSVRfV0lORE9XX1RZUEVfU0xJRElORxABEiEKHVNQRU5EX0xJTUlUX1dJTkRPV19UWVBFX0ZJWEVEEAISIQodU1BFTkRfTElNSVRfV0lORE9XX1RZUEVfREFJTFkQAxIiCh5TUEVORF9MSU1JVF9XSU5ET1dfVFlQRV9XRUVLTFkQBBIjCh9TUEVORF9MSU1JVF9XSU5ET1dfVFlQRV9NT05USExZEAUqlAEKEFNwZW5kTGltaXRBY3Rpb24SIgoeU1BFTkRfTElNSVRfQUNUSU9OX1VOU1BFQ0lGSUVEEAASHAoYU1BFTkRfTElNSVRfQUNUSU9OX0JMT0NLEAESHAoYU1BFTkRfTElNSVRfQUNUSU9OX0FMRVJUEAISIAocU1BFTkRfTElNSVRfQUNUSU9OX0RPV05HUkFERRADMo8KChFTcGVuZExpbWl0U2VydmljZRLXAQoQQ3JlYXRlU3BlbmRMaW1pdBIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlU3BlbmRMaW1pdFJlcXVlc3QaMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZVNwZW5kTGltaXRSZXNwb25zZSJagtPkkwJUOgtzcGVuZF9saW1pdFofOgtzcGVuZF9saW1pdCIQL3YxL3NwZW5kLWxpbWl0cyIkL3YxL3twYXJlbnQ9Z2F0ZXdheXMvKn0vc3BlbmQtbGltaXRzEr0BCg1HZXRTcGVuZExpbWl0Ei8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRTcGVuZExpbWl0UmVxdWVzdBowLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRMaW1pdFJlc3BvbnNlIkmC0+STAkNaGxIZL3YxL3tuYW1lPXNwZW5kLWxpbWl0cy8qfRIkL3YxL3tuYW1lPWdhdGV3YXlzLyovc3BlbmQtbGltaXRzLyp9EroBCg9MaXN0U3BlbmRMaW1pdHMSMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RTcGVuZExpbWl0c1JlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RTcGVuZExpbWl0c1Jlc3BvbnNlIkCC0+STAjpaEhIQL3YxL3NwZW5kLWxpbWl0cxIkL3YxL3twYXJlbnQ9Z2F0ZXdheXMvKn0vc3BlbmQtbGltaXRzEvgBChBVcGRhdGVTcGVuZExpbWl0EjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVTcGVuZExpbWl0UmVxdWVzdBozLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlU3BlbmRMaW1pdFJlc3BvbnNlInuC0+STAnU6C3NwZW5kX2xpbWl0WjQ6C3NwZW5kX2xpbWl0MiUvdjEve3NwZW5kX2xpbWl0Lm5hbWU9c3BlbmQtbGltaXRzLyp9MjAvdjEve3NwZW5kX2xpbWl0Lm5hbWU9Z2F0ZXdheXMvKi9zcGVuZC1saW1pdHMvKn0SxgEKEERlbGV0ZVNwZW5kTGltaXQSMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVNwZW5kTGltaXRSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVTcGVuZExpbWl0UmVzcG9uc2UiSYLT5JMCQ1obKhkvdjEve25hbWU9c3BlbmQtbGltaXRzLyp9KiQvdjEve25hbWU9Z2F0ZXdheXMvKi9zcGVuZC1saW1pdHMvKn0S3gEKEkdldFNwZW5kTGltaXRVc2FnZRI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRMaW1pdFVzYWdlUmVxdWVzdBo1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0U3BlbmRMaW1pdFVzYWdlUmVzcG9uc2UiW4LT5JMCVVokEiIvdjEve25hbWU9c3BlbmQtbGltaXRzLyp9OmdldFVzYWdlEi0vdjEve25hbWU9Z2F0ZXdheXMvKi9zcGVuZC1saW1pdHMvKn06Z2V0VXNhZ2VChAIKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQg9TcGVuZExpbWl0UHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Response message for CreateSpendLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateSpendLimitResponse + */ +export type CreateSpendLimitResponse = Message<"redpanda.api.aigateway.v1.CreateSpendLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 1; + */ + spendLimit?: SpendLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateSpendLimitResponse. + * Use `create(CreateSpendLimitResponseSchema)` to create a new message. + */ +export const CreateSpendLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 0); + +/** + * Response message for GetSpendLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetSpendLimitResponse + */ +export type GetSpendLimitResponse = Message<"redpanda.api.aigateway.v1.GetSpendLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 1; + */ + spendLimit?: SpendLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendLimitResponse. + * Use `create(GetSpendLimitResponseSchema)` to create a new message. + */ +export const GetSpendLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 1); + +/** + * Response message for UpdateSpendLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateSpendLimitResponse + */ +export type UpdateSpendLimitResponse = Message<"redpanda.api.aigateway.v1.UpdateSpendLimitResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 1; + */ + spendLimit?: SpendLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateSpendLimitResponse. + * Use `create(UpdateSpendLimitResponseSchema)` to create a new message. + */ +export const UpdateSpendLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 2); + +/** + * Response message for DeleteSpendLimit RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteSpendLimitResponse + */ +export type DeleteSpendLimitResponse = Message<"redpanda.api.aigateway.v1.DeleteSpendLimitResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteSpendLimitResponse. + * Use `create(DeleteSpendLimitResponseSchema)` to create a new message. + */ +export const DeleteSpendLimitResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 3); + +/** + * Response message for GetSpendLimitUsage RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetSpendLimitUsageResponse + */ +export type GetSpendLimitUsageResponse = Message<"redpanda.api.aigateway.v1.GetSpendLimitUsageResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimitUsage spend_limit_usage = 1; + */ + spendLimitUsage?: SpendLimitUsage; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendLimitUsageResponse. + * Use `create(GetSpendLimitUsageResponseSchema)` to create a new message. + */ +export const GetSpendLimitUsageResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 4); + +/** + * @generated from message redpanda.api.aigateway.v1.SpendLimit + */ +export type SpendLimit = Message<"redpanda.api.aigateway.v1.SpendLimit"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * @generated from field: string description = 3; + */ + description: string; + + /** + * @generated from field: string match_expression = 4; + */ + matchExpression: string; + + /** + * CEL expression to extract spend limit key (e.g., "request.headers['X-User-ID'][0]") + * If not provided, a global spend limit is applied + * Example: request.context.oidc_claims.sub (per-user budgets) + * Example: request.context.oidc_claims.org_id (per-organization budgets) + * + * @generated from field: string key_extractor = 5; + */ + keyExtractor: string; + + /** + * @generated from field: int64 limit_cents = 6; + */ + limitCents: bigint; + + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimitWindow window = 7; + */ + window?: SpendLimitWindow; + + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimitAction action = 8; + */ + action: SpendLimitAction; + + /** + * @generated from field: repeated int32 alert_thresholds = 9; + */ + alertThresholds: number[]; + + /** + * @generated from field: bool enabled = 10; + */ + enabled: boolean; + + /** + * @generated from field: map metadata = 11; + */ + metadata: { [key: string]: string }; + + /** + * @generated from field: google.protobuf.Timestamp create_time = 12; + */ + createTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp update_time = 13; + */ + updateTime?: Timestamp; + + /** + * Token-based limits (usage quotas, combined input+output tokens) + * Aligns with CUE schema: schema_spendlimit.cue lines 27-30 + * 0 = unlimited + * + * @generated from field: int64 tokens_per_minute = 14; + */ + tokensPerMinute: bigint; + + /** + * @generated from field: int64 tokens_per_day = 15; + */ + tokensPerDay: bigint; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendLimit. + * Use `create(SpendLimitSchema)` to create a new message. + */ +export const SpendLimitSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 5); + +/** + * @generated from message redpanda.api.aigateway.v1.SpendLimitWindow + */ +export type SpendLimitWindow = Message<"redpanda.api.aigateway.v1.SpendLimitWindow"> & { + /** + * @generated from field: int32 size_seconds = 1; + */ + sizeSeconds: number; + + /** + * Must not be UNSPECIFIED + * + * @generated from field: redpanda.api.aigateway.v1.SpendLimitWindowType type = 2; + */ + type: SpendLimitWindowType; + + /** + * @generated from field: string reset_at = 3; + */ + resetAt: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendLimitWindow. + * Use `create(SpendLimitWindowSchema)` to create a new message. + */ +export const SpendLimitWindowSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 6); + +/** + * @generated from message redpanda.api.aigateway.v1.SpendLimitUsage + */ +export type SpendLimitUsage = Message<"redpanda.api.aigateway.v1.SpendLimitUsage"> & { + /** + * @generated from field: string spend_limit = 1; + */ + spendLimit: string; + + /** + * @generated from field: int64 current_spend_cents = 2; + */ + currentSpendCents: bigint; + + /** + * @generated from field: int64 limit_cents = 3; + */ + limitCents: bigint; + + /** + * @generated from field: int32 percentage_used = 4; + */ + percentageUsed: number; + + /** + * @generated from field: google.protobuf.Timestamp window_start = 5; + */ + windowStart?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp window_end = 6; + */ + windowEnd?: Timestamp; + + /** + * @generated from field: bool is_exceeded = 7; + */ + isExceeded: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SpendLimitUsage. + * Use `create(SpendLimitUsageSchema)` to create a new message. + */ +export const SpendLimitUsageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 7); + +/** + * @generated from message redpanda.api.aigateway.v1.CreateSpendLimitRequest + */ +export type CreateSpendLimitRequest = Message<"redpanda.api.aigateway.v1.CreateSpendLimitRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 3; + */ + spendLimit?: SpendLimit; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateSpendLimitRequest. + * Use `create(CreateSpendLimitRequestSchema)` to create a new message. + */ +export const CreateSpendLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 8); + +/** + * @generated from message redpanda.api.aigateway.v1.GetSpendLimitRequest + */ +export type GetSpendLimitRequest = Message<"redpanda.api.aigateway.v1.GetSpendLimitRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendLimitRequest. + * Use `create(GetSpendLimitRequestSchema)` to create a new message. + */ +export const GetSpendLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 9); + +/** + * @generated from message redpanda.api.aigateway.v1.ListSpendLimitsRequest + */ +export type ListSpendLimitsRequest = Message<"redpanda.api.aigateway.v1.ListSpendLimitsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListSpendLimitsRequest. + * Use `create(ListSpendLimitsRequestSchema)` to create a new message. + */ +export const ListSpendLimitsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 10); + +/** + * @generated from message redpanda.api.aigateway.v1.ListSpendLimitsResponse + */ +export type ListSpendLimitsResponse = Message<"redpanda.api.aigateway.v1.ListSpendLimitsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.SpendLimit spend_limits = 1; + */ + spendLimits: SpendLimit[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListSpendLimitsResponse. + * Use `create(ListSpendLimitsResponseSchema)` to create a new message. + */ +export const ListSpendLimitsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 11); + +/** + * @generated from message redpanda.api.aigateway.v1.UpdateSpendLimitRequest + */ +export type UpdateSpendLimitRequest = Message<"redpanda.api.aigateway.v1.UpdateSpendLimitRequest"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.SpendLimit spend_limit = 1; + */ + spendLimit?: SpendLimit; + + /** + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateSpendLimitRequest. + * Use `create(UpdateSpendLimitRequestSchema)` to create a new message. + */ +export const UpdateSpendLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 12); + +/** + * @generated from message redpanda.api.aigateway.v1.DeleteSpendLimitRequest + */ +export type DeleteSpendLimitRequest = Message<"redpanda.api.aigateway.v1.DeleteSpendLimitRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteSpendLimitRequest. + * Use `create(DeleteSpendLimitRequestSchema)` to create a new message. + */ +export const DeleteSpendLimitRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 13); + +/** + * @generated from message redpanda.api.aigateway.v1.GetSpendLimitUsageRequest + */ +export type GetSpendLimitUsageRequest = Message<"redpanda.api.aigateway.v1.GetSpendLimitUsageRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * The extracted key value to get usage for (e.g., user ID, org ID) + * If not provided, returns global usage + * + * @generated from field: string key_value = 2; + */ + keyValue: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetSpendLimitUsageRequest. + * Use `create(GetSpendLimitUsageRequestSchema)` to create a new message. + */ +export const GetSpendLimitUsageRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_spend_limit, 14); + +/** + * @generated from enum redpanda.api.aigateway.v1.SpendLimitWindowType + */ +export enum SpendLimitWindowType { + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_SLIDING = 1; + */ + SLIDING = 1, + + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_FIXED = 2; + */ + FIXED = 2, + + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_DAILY = 3; + */ + DAILY = 3, + + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_WEEKLY = 4; + */ + WEEKLY = 4, + + /** + * @generated from enum value: SPEND_LIMIT_WINDOW_TYPE_MONTHLY = 5; + */ + MONTHLY = 5, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.SpendLimitWindowType. + */ +export const SpendLimitWindowTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_spend_limit, 0); + +/** + * @generated from enum redpanda.api.aigateway.v1.SpendLimitAction + */ +export enum SpendLimitAction { + /** + * @generated from enum value: SPEND_LIMIT_ACTION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: SPEND_LIMIT_ACTION_BLOCK = 1; + */ + BLOCK = 1, + + /** + * @generated from enum value: SPEND_LIMIT_ACTION_ALERT = 2; + */ + ALERT = 2, + + /** + * @generated from enum value: SPEND_LIMIT_ACTION_DOWNGRADE = 3; + */ + DOWNGRADE = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.SpendLimitAction. + */ +export const SpendLimitActionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_spend_limit, 1); + +/** + * @generated from service redpanda.api.aigateway.v1.SpendLimitService + */ +export const SpendLimitService: GenService<{ + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.CreateSpendLimit + */ + createSpendLimit: { + methodKind: "unary"; + input: typeof CreateSpendLimitRequestSchema; + output: typeof CreateSpendLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimit + */ + getSpendLimit: { + methodKind: "unary"; + input: typeof GetSpendLimitRequestSchema; + output: typeof GetSpendLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.ListSpendLimits + */ + listSpendLimits: { + methodKind: "unary"; + input: typeof ListSpendLimitsRequestSchema; + output: typeof ListSpendLimitsResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.UpdateSpendLimit + */ + updateSpendLimit: { + methodKind: "unary"; + input: typeof UpdateSpendLimitRequestSchema; + output: typeof UpdateSpendLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.DeleteSpendLimit + */ + deleteSpendLimit: { + methodKind: "unary"; + input: typeof DeleteSpendLimitRequestSchema; + output: typeof DeleteSpendLimitResponseSchema; + }, + /** + * @generated from rpc redpanda.api.aigateway.v1.SpendLimitService.GetSpendLimitUsage + */ + getSpendLimitUsage: { + methodKind: "unary"; + input: typeof GetSpendLimitUsageRequestSchema; + output: typeof GetSpendLimitUsageResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_spend_limit, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/sso-SSOService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/sso-SSOService_connectquery.ts new file mode 100644 index 0000000000..60d7150b6c --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/sso-SSOService_connectquery.ts @@ -0,0 +1,87 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/sso.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { SSOService } from "./sso_pb"; + +/** + * Creates a new identity provider within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider + */ +export const createIdentityProvider = SSOService.method.createIdentityProvider; + +/** + * Gets an identity provider by name. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.GetIdentityProvider + */ +export const getIdentityProvider = SSOService.method.getIdentityProvider; + +/** + * Lists identity providers within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.ListIdentityProviders + */ +export const listIdentityProviders = SSOService.method.listIdentityProviders; + +/** + * Updates an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider + */ +export const updateIdentityProvider = SSOService.method.updateIdentityProvider; + +/** + * Deletes an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider + */ +export const deleteIdentityProvider = SSOService.method.deleteIdentityProvider; + +/** + * Adds an email domain to an identity provider for Home Realm Discovery. + * The domain must be verified via DNS TXT record before it becomes active. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.AddDomain + */ +export const addDomain = SSOService.method.addDomain; + +/** + * Lists domains associated with an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.ListDomains + */ +export const listDomains = SSOService.method.listDomains; + +/** + * Removes a domain from an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.RemoveDomain + */ +export const removeDomain = SSOService.method.removeDomain; + +/** + * Initiates or retries domain verification via DNS TXT record. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.VerifyDomain + */ +export const verifyDomain = SSOService.method.verifyDomain; + +/** + * Looks up the identity provider for an email address based on domain. + * Used during login to determine which IdP to redirect to. + * Returns NOT_FOUND if no IdP is configured for the domain. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail + */ +export const lookupIdPByEmail = SSOService.method.lookupIdPByEmail; + +/** + * Tests OIDC credentials using the client credentials grant. + * Validates that the client_id and client_secret can obtain a token + * and returns the decoded token claims. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.TestCredentials + */ +export const testCredentials = SSOService.method.testCredentials; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/sso_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/sso_pb.ts new file mode 100644 index 0000000000..9e5ceda19f --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/sso_pb.ts @@ -0,0 +1,1334 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/sso.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/sso.proto. + */ +export const file_redpanda_api_aigateway_v1_sso: GenFile = /*@__PURE__*/ + fileDesc("CiNyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3Nzby5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSKeBwoQSWRlbnRpdHlQcm92aWRlchIRCgRuYW1lGAEgASgJQgPgQQgSIwoMZGlzcGxheV9uYW1lGAIgASgJQg3gQQK6SAdyBRABGP8BEkwKBHR5cGUYAyABKA4yLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklkZW50aXR5UHJvdmlkZXJUeXBlQg3gQQK6SAeCAQQQASAAEg8KB2VuYWJsZWQYBCABKAgSRwoLb2lkY19jb25maWcYBSABKAsyLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLk9JRENQcm92aWRlckNvbmZpZ0ID4EECEkAKDmNsYWltX21hcHBpbmdzGAYgASgLMigucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DbGFpbU1hcHBpbmdzEkoKEGppdF9wcm92aXNpb25pbmcYByABKAsyMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkpJVFByb3Zpc2lvbmluZ0NvbmZpZxIZChFhdXRvX2xpbmtfZW5hYmxlZBgNIAEoCBI6CgthdXRoX21ldGhvZBgOIAEoDjIlLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQXV0aE1ldGhvZBJLCghtZXRhZGF0YRgPIAMoCzI5LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSWRlbnRpdHlQcm92aWRlci5NZXRhZGF0YUVudHJ5EkYKEXByb3ZpZGVyX3RlbXBsYXRlGAggASgOMisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Qcm92aWRlclRlbXBsYXRlEjQKC2NyZWF0ZV90aW1lGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjQKC3VwZGF0ZV90aW1lGAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEhQKB2NyZWF0b3IYCyABKAlCA+BBAxIUCgd1cGRhdGVyGAwgASgJQgPgQQMaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOmfqQWQKJ2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vSWRlbnRpdHlQcm92aWRlchI5YWNjb3VudHMve2FjY291bnR9L2lkZW50aXR5LXByb3ZpZGVycy97aWRlbnRpdHlfcHJvdmlkZXJ9IpgCChJPSURDUHJvdmlkZXJDb25maWcSIQoKaXNzdWVyX3VybBgBIAEoCUIN4EECukgHcgUQARiAEBIgCgljbGllbnRfaWQYAiABKAlCDeBBArpIB3IFEAEY/wESGgoNY2xpZW50X3NlY3JldBgDIAEoCUID4EEEEg4KBnNjb3BlcxgEIAMoCRIZChFhbGxvd2VkX2F1ZGllbmNlcxgJIAMoCRIRCglsb2dpbl91cmwYCiABKAkSHgoWYXV0aG9yaXphdGlvbl9lbmRwb2ludBgFIAEoCRIWCg50b2tlbl9lbmRwb2ludBgGIAEoCRIZChF1c2VyaW5mb19lbmRwb2ludBgHIAEoCRIQCghqd2tzX3VyaRgIIAEoCSKMAgoNQ2xhaW1NYXBwaW5ncxITCgtlbWFpbF9jbGFpbRgBIAEoCRISCgpuYW1lX2NsYWltGAIgASgJEhgKEGdpdmVuX25hbWVfY2xhaW0YAyABKAkSGQoRZmFtaWx5X25hbWVfY2xhaW0YBCABKAkSFQoNcGljdHVyZV9jbGFpbRgFIAEoCRJRCg1jdXN0b21fY2xhaW1zGAYgAygLMjoucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DbGFpbU1hcHBpbmdzLkN1c3RvbUNsYWltc0VudHJ5GjMKEUN1c3RvbUNsYWltc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEipgEKFUpJVFByb3Zpc2lvbmluZ0NvbmZpZxIPCgdlbmFibGVkGAEgASgIEkYKFGRlZmF1bHRfb3JnYW5pemF0aW9uGAIgASgJQij6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEjQKDGRlZmF1bHRfcm9sZRgDIAEoCUIeukgbchlSBWFkbWluUgZtZW1iZXJSBnZpZXdlclIAIusDCgtFbWFpbERvbWFpbhIRCgRuYW1lGAEgASgJQgPgQQgSHQoGZG9tYWluGAIgASgJQg3gQQK6SAdyBRABGP0BEg8KB2VuYWJsZWQYAyABKAgSVQoTdmVyaWZpY2F0aW9uX3N0YXR1cxgEIAEoDjIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRG9tYWluVmVyaWZpY2F0aW9uU3RhdHVzQgPgQQMSHwoSdmVyaWZpY2F0aW9uX3Rva2VuGAUgASgJQgPgQQMSQAoXdmVyaWZpY2F0aW9uX2V4cGlyZXNfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdmVyaWZpZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLY3JlYXRlX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQM6c+pBcAoiYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9FbWFpbERvbWFpbhJKYWNjb3VudHMve2FjY291bnR9L2lkZW50aXR5LXByb3ZpZGVycy97aWRlbnRpdHlfcHJvdmlkZXJ9L2RvbWFpbnMve2RvbWFpbn0ixwEKHUNyZWF0ZUlkZW50aXR5UHJvdmlkZXJSZXF1ZXN0EjYKBnBhcmVudBgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQSIQoUaWRlbnRpdHlfcHJvdmlkZXJfaWQYAiABKAlCA+BBARJLChFpZGVudGl0eV9wcm92aWRlchgDIAEoCzIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSWRlbnRpdHlQcm92aWRlckID4EECImgKHkNyZWF0ZUlkZW50aXR5UHJvdmlkZXJSZXNwb25zZRJGChFpZGVudGl0eV9wcm92aWRlchgBIAEoCzIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSWRlbnRpdHlQcm92aWRlciJbChpHZXRJZGVudGl0eVByb3ZpZGVyUmVxdWVzdBI9CgRuYW1lGAEgASgJQi/gQQL6QSkKJ2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vSWRlbnRpdHlQcm92aWRlciKGAQobR2V0SWRlbnRpdHlQcm92aWRlclJlc3BvbnNlEkYKEWlkZW50aXR5X3Byb3ZpZGVyGAEgASgLMisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5JZGVudGl0eVByb3ZpZGVyEh8KEmxpbmtlZF91c2Vyc19jb3VudBgCIAEoBUID4EEDIq0BChxMaXN0SWRlbnRpdHlQcm92aWRlcnNSZXF1ZXN0EjYKBnBhcmVudBgBIAEoCUIm4EEC+kEgCh5haWdhdGV3YXkucmVkcGFuZGEuY29tL0FjY291bnQSHwoJcGFnZV9zaXplGAIgASgFQgzgQQG6SAYaBBhkKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhsKDmZpbHRlcl9lbmFibGVkGAQgASgIQgPgQQEilQEKHUxpc3RJZGVudGl0eVByb3ZpZGVyc1Jlc3BvbnNlEkcKEmlkZW50aXR5X3Byb3ZpZGVycxgBIAMoCzIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuSWRlbnRpdHlQcm92aWRlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKiAQodVXBkYXRlSWRlbnRpdHlQcm92aWRlclJlcXVlc3QSSwoRaWRlbnRpdHlfcHJvdmlkZXIYASABKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklkZW50aXR5UHJvdmlkZXJCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJoCh5VcGRhdGVJZGVudGl0eVByb3ZpZGVyUmVzcG9uc2USRgoRaWRlbnRpdHlfcHJvdmlkZXIYASABKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklkZW50aXR5UHJvdmlkZXIicgodRGVsZXRlSWRlbnRpdHlQcm92aWRlclJlcXVlc3QSPQoEbmFtZRgBIAEoCUIv4EEC+kEpCidhaWdhdGV3YXkucmVkcGFuZGEuY29tL0lkZW50aXR5UHJvdmlkZXISEgoFZm9yY2UYAiABKAhCA+BBASIgCh5EZWxldGVJZGVudGl0eVByb3ZpZGVyUmVzcG9uc2UicgoQQWRkRG9tYWluUmVxdWVzdBI/CgZwYXJlbnQYASABKAlCL+BBAvpBKQonYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9JZGVudGl0eVByb3ZpZGVyEh0KBmRvbWFpbhgCIAEoCUIN4EECukgHcgUQARj9ASJ0ChFBZGREb21haW5SZXNwb25zZRI8CgxlbWFpbF9kb21haW4YASABKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkVtYWlsRG9tYWluEiEKGXZlcmlmaWNhdGlvbl9pbnN0cnVjdGlvbnMYAiABKAkijwEKEkxpc3REb21haW5zUmVxdWVzdBI/CgZwYXJlbnQYASABKAlCL+BBAvpBKQonYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9JZGVudGl0eVByb3ZpZGVyEh8KCXBhZ2Vfc2l6ZRgCIAEoBUIM4EEBukgGGgQYZCgAEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJ7ChNMaXN0RG9tYWluc1Jlc3BvbnNlEjcKB2RvbWFpbnMYASADKAsyJi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkVtYWlsRG9tYWluEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIk8KE1JlbW92ZURvbWFpblJlcXVlc3QSOAoEbmFtZRgBIAEoCUIq4EEC+kEkCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0VtYWlsRG9tYWluIhYKFFJlbW92ZURvbWFpblJlc3BvbnNlIk8KE1ZlcmlmeURvbWFpblJlcXVlc3QSOAoEbmFtZRgBIAEoCUIq4EEC+kEkCiJhaWdhdGV3YXkucmVkcGFuZGEuY29tL0VtYWlsRG9tYWluIn0KFFZlcmlmeURvbWFpblJlc3BvbnNlEjwKDGVtYWlsX2RvbWFpbhgBIAEoCzImLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRW1haWxEb21haW4SEAoIdmVyaWZpZWQYAiABKAgSFQoNZXJyb3JfbWVzc2FnZRgDIAEoCSJsChdMb29rdXBJZFBCeUVtYWlsUmVxdWVzdBI2CgZwYXJlbnQYASABKAlCJuBBAvpBIAoeYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9BY2NvdW50EhkKBWVtYWlsGAIgASgJQgrgQQK6SARyAmABIqwBChhMb29rdXBJZFBCeUVtYWlsUmVzcG9uc2USRgoRaWRlbnRpdHlfcHJvdmlkZXIYASABKAsyKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLklkZW50aXR5UHJvdmlkZXISDwoHaGFzX2lkcBgCIAEoCBIZChFhdXRob3JpemF0aW9uX3VybBgDIAEoCRIcChRhbGxvd19wYXNzd29yZF9sb2dpbhgEIAEoCCKRAQoWVGVzdENyZWRlbnRpYWxzUmVxdWVzdBIhCgppc3N1ZXJfdXJsGAEgASgJQg3gQQK6SAdyBRABGIAQEiAKCWNsaWVudF9pZBgCIAEoCUIN4EECukgHcgUQARj/ARIkCg1jbGllbnRfc2VjcmV0GAMgASgJQg3gQQK6SAdyBRABGIAESgQIBBAFUgZzY29wZXMiggIKF1Rlc3RDcmVkZW50aWFsc1Jlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSFQoNZXJyb3JfbWVzc2FnZRgCIAEoCRJOCgZjbGFpbXMYBSADKAsyPi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlc3RDcmVkZW50aWFsc1Jlc3BvbnNlLkNsYWltc0VudHJ5EhwKFGFjY2Vzc190b2tlbl9wcmV2aWV3GAYgASgJGi0KC0NsYWltc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFKBAgDEARKBAgEEAVSCnRva2VuX3R5cGVSCmV4cGlyZXNfaW4qXwoUSWRlbnRpdHlQcm92aWRlclR5cGUSJgoiSURFTlRJVFlfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEh8KG0lERU5USVRZX1BST1ZJREVSX1RZUEVfT0lEQxABKmkKCkF1dGhNZXRob2QSGwoXQVVUSF9NRVRIT0RfVU5TUEVDSUZJRUQQABIiCh5BVVRIX01FVEhPRF9BVVRIT1JJWkFUSU9OX0NPREUQARIaChZBVVRIX01FVEhPRF9KV1RfQkVBUkVSEAIq6QEKEFByb3ZpZGVyVGVtcGxhdGUSIQodUFJPVklERVJfVEVNUExBVEVfVU5TUEVDSUZJRUQQABIdChlQUk9WSURFUl9URU1QTEFURV9HRU5FUklDEAESHAoYUFJPVklERVJfVEVNUExBVEVfR09PR0xFEAISHAoYUFJPVklERVJfVEVNUExBVEVfR0lUSFVCEAMSGgoWUFJPVklERVJfVEVNUExBVEVfT0tUQRAEEh4KGlBST1ZJREVSX1RFTVBMQVRFX0FaVVJFX0FEEAUSGwoXUFJPVklERVJfVEVNUExBVEVfQVVUSDAQBirmAQoYRG9tYWluVmVyaWZpY2F0aW9uU3RhdHVzEioKJkRPTUFJTl9WRVJJRklDQVRJT05fU1RBVFVTX1VOU1BFQ0lGSUVEEAASJgoiRE9NQUlOX1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElORxABEicKI0RPTUFJTl9WRVJJRklDQVRJT05fU1RBVFVTX1ZFUklGSUVEEAISJQohRE9NQUlOX1ZFUklGSUNBVElPTl9TVEFUVVNfRkFJTEVEEAMSJgoiRE9NQUlOX1ZFUklGSUNBVElPTl9TVEFUVVNfRVhQSVJFRBAEMtMQCgpTU09TZXJ2aWNlEtQBChZDcmVhdGVJZGVudGl0eVByb3ZpZGVyEjgucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVJZGVudGl0eVByb3ZpZGVyUmVxdWVzdBo5LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlSWRlbnRpdHlQcm92aWRlclJlc3BvbnNlIkWC0+STAj86EWlkZW50aXR5X3Byb3ZpZGVyIiovdjEve3BhcmVudD1hY2NvdW50cy8qfS9pZGVudGl0eS1wcm92aWRlcnMSuAEKE0dldElkZW50aXR5UHJvdmlkZXISNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldElkZW50aXR5UHJvdmlkZXJSZXF1ZXN0GjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRJZGVudGl0eVByb3ZpZGVyUmVzcG9uc2UiMoLT5JMCLBIqL3YxL3tuYW1lPWFjY291bnRzLyovaWRlbnRpdHktcHJvdmlkZXJzLyp9Er4BChVMaXN0SWRlbnRpdHlQcm92aWRlcnMSNy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RJZGVudGl0eVByb3ZpZGVyc1JlcXVlc3QaOC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RJZGVudGl0eVByb3ZpZGVyc1Jlc3BvbnNlIjKC0+STAiwSKi92MS97cGFyZW50PWFjY291bnRzLyp9L2lkZW50aXR5LXByb3ZpZGVycxLmAQoWVXBkYXRlSWRlbnRpdHlQcm92aWRlchI4LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlSWRlbnRpdHlQcm92aWRlclJlcXVlc3QaOS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZUlkZW50aXR5UHJvdmlkZXJSZXNwb25zZSJXgtPkkwJROhFpZGVudGl0eV9wcm92aWRlcjI8L3YxL3tpZGVudGl0eV9wcm92aWRlci5uYW1lPWFjY291bnRzLyovaWRlbnRpdHktcHJvdmlkZXJzLyp9EsEBChZEZWxldGVJZGVudGl0eVByb3ZpZGVyEjgucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVJZGVudGl0eVByb3ZpZGVyUmVxdWVzdBo5LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlSWRlbnRpdHlQcm92aWRlclJlc3BvbnNlIjKC0+STAiwqKi92MS97bmFtZT1hY2NvdW50cy8qL2lkZW50aXR5LXByb3ZpZGVycy8qfRKnAQoJQWRkRG9tYWluEisucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BZGREb21haW5SZXF1ZXN0GiwucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BZGREb21haW5SZXNwb25zZSI/gtPkkwI5OgEqIjQvdjEve3BhcmVudD1hY2NvdW50cy8qL2lkZW50aXR5LXByb3ZpZGVycy8qfS9kb21haW5zEqoBCgtMaXN0RG9tYWlucxItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdERvbWFpbnNSZXF1ZXN0Gi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0RG9tYWluc1Jlc3BvbnNlIjyC0+STAjYSNC92MS97cGFyZW50PWFjY291bnRzLyovaWRlbnRpdHktcHJvdmlkZXJzLyp9L2RvbWFpbnMSrQEKDFJlbW92ZURvbWFpbhIuLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVtb3ZlRG9tYWluUmVxdWVzdBovLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVtb3ZlRG9tYWluUmVzcG9uc2UiPILT5JMCNio0L3YxL3tuYW1lPWFjY291bnRzLyovaWRlbnRpdHktcHJvdmlkZXJzLyovZG9tYWlucy8qfRK0AQoMVmVyaWZ5RG9tYWluEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5WZXJpZnlEb21haW5SZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5WZXJpZnlEb21haW5SZXNwb25zZSJDgtPkkwI9IjsvdjEve25hbWU9YWNjb3VudHMvKi9pZGVudGl0eS1wcm92aWRlcnMvKi9kb21haW5zLyp9OnZlcmlmeRK9AQoQTG9va3VwSWRQQnlFbWFpbBIyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTG9va3VwSWRQQnlFbWFpbFJlcXVlc3QaMy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxvb2t1cElkUEJ5RW1haWxSZXNwb25zZSJAgtPkkwI6EjgvdjEve3BhcmVudD1hY2NvdW50cy8qfS9pZGVudGl0eS1wcm92aWRlcnM6bG9va3VwQnlFbWFpbBKrAQoPVGVzdENyZWRlbnRpYWxzEjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZXN0Q3JlZGVudGlhbHNSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZXN0Q3JlZGVudGlhbHNSZXNwb25zZSIxgtPkkwIrOgEqIiYvdjEvaWRlbnRpdHktcHJvdmlkZXJzOnRlc3RDcmVkZW50aWFscxoZykEWYWlnYXRld2F5LnJlZHBhbmRhLmNvbUL9AQodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCCFNzb1Byb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * IdentityProvider represents an external OIDC identity provider configuration. + * + * @generated from message redpanda.api.aigateway.v1.IdentityProvider + */ +export type IdentityProvider = Message<"redpanda.api.aigateway.v1.IdentityProvider"> & { + /** + * Resource name. Format: `accounts/{account}/identity-providers/{identity_provider}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name shown in UI (e.g., "Corporate Okta") + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Provider type. Currently only OIDC is supported. + * + * @generated from field: redpanda.api.aigateway.v1.IdentityProviderType type = 3; + */ + type: IdentityProviderType; + + /** + * Whether this IdP is enabled for authentication. + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * OIDC configuration. + * + * @generated from field: redpanda.api.aigateway.v1.OIDCProviderConfig oidc_config = 5; + */ + oidcConfig?: OIDCProviderConfig; + + /** + * Claim mappings from IdP claims to internal user attributes. + * + * @generated from field: redpanda.api.aigateway.v1.ClaimMappings claim_mappings = 6; + */ + claimMappings?: ClaimMappings; + + /** + * JIT (Just-In-Time) provisioning settings. + * + * @generated from field: redpanda.api.aigateway.v1.JITProvisioningConfig jit_provisioning = 7; + */ + jitProvisioning?: JITProvisioningConfig; + + /** + * Whether to automatically link SSO identities to existing users by email. + * When enabled, if a user logs in via SSO and their verified email matches + * an existing user account, the SSO identity is linked to that account. + * + * @generated from field: bool auto_link_enabled = 13; + */ + autoLinkEnabled: boolean; + + /** + * Authentication method this IdP supports. + * AUTH_METHOD_AUTHORIZATION_CODE for browser SSO, AUTH_METHOD_JWT_BEARER for API tokens. + * + * @generated from field: redpanda.api.aigateway.v1.AuthMethod auth_method = 14; + */ + authMethod: AuthMethod; + + /** + * Metadata for system management and bootstrap tracking. + * Used to mark IdPs as system_managed (synced from config). + * + * @generated from field: map metadata = 15; + */ + metadata: { [key: string]: string }; + + /** + * Provider template used for pre-built configurations. + * + * @generated from field: redpanda.api.aigateway.v1.ProviderTemplate provider_template = 8; + */ + providerTemplate: ProviderTemplate; + + /** + * Output only. Creation timestamp. + * + * @generated from field: google.protobuf.Timestamp create_time = 9; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp. + * + * @generated from field: google.protobuf.Timestamp update_time = 10; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (user ID or service account). + * + * @generated from field: string creator = 11; + */ + creator: string; + + /** + * Output only. Last updater. + * + * @generated from field: string updater = 12; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.IdentityProvider. + * Use `create(IdentityProviderSchema)` to create a new message. + */ +export const IdentityProviderSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 0); + +/** + * OIDCProviderConfig contains OIDC-specific configuration for identity providers. + * + * @generated from message redpanda.api.aigateway.v1.OIDCProviderConfig + */ +export type OIDCProviderConfig = Message<"redpanda.api.aigateway.v1.OIDCProviderConfig"> & { + /** + * Required. The issuer URL (e.g., "https://accounts.google.com"). + * Used for OIDC discovery (.well-known/openid-configuration). + * + * @generated from field: string issuer_url = 1; + */ + issuerUrl: string; + + /** + * Required. OAuth2 client ID from the IdP. + * + * @generated from field: string client_id = 2; + */ + clientId: string; + + /** + * OAuth2 client secret. Only provided in create/update requests. + * Never returned in get/list responses (stored via SecretsService). + * + * @generated from field: string client_secret = 3; + */ + clientSecret: string; + + /** + * OAuth2 scopes to request. Defaults to ["openid", "profile", "email"]. + * + * @generated from field: repeated string scopes = 4; + */ + scopes: string[]; + + /** + * Allowed audiences for token validation (required for jwt_bearer auth_method). + * Tokens must contain at least one of these audiences in the "aud" claim. + * SECURITY: Without this for jwt_bearer, any token from the issuer would be + * accepted, allowing tokens issued for other applications to access the API. + * + * @generated from field: repeated string allowed_audiences = 9; + */ + allowedAudiences: string[]; + + /** + * Login URL for auth failure redirect (required for jwt_bearer auth_method). + * When authentication fails, the API returns this URL so the WebUI can + * redirect the user back to the parent application for re-authentication. + * + * @generated from field: string login_url = 10; + */ + loginUrl: string; + + /** + * Optional. Custom authorization endpoint (overrides discovery). + * + * @generated from field: string authorization_endpoint = 5; + */ + authorizationEndpoint: string; + + /** + * Optional. Custom token endpoint (overrides discovery). + * + * @generated from field: string token_endpoint = 6; + */ + tokenEndpoint: string; + + /** + * Optional. Custom userinfo endpoint (overrides discovery). + * + * @generated from field: string userinfo_endpoint = 7; + */ + userinfoEndpoint: string; + + /** + * Optional. Custom JWKS URI (overrides discovery). + * + * @generated from field: string jwks_uri = 8; + */ + jwksUri: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OIDCProviderConfig. + * Use `create(OIDCProviderConfigSchema)` to create a new message. + */ +export const OIDCProviderConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 1); + +/** + * ClaimMappings defines how external IdP claims map to internal user attributes. + * + * @generated from message redpanda.api.aigateway.v1.ClaimMappings + */ +export type ClaimMappings = Message<"redpanda.api.aigateway.v1.ClaimMappings"> & { + /** + * Claim containing the user's email address. + * Default: "email" + * + * @generated from field: string email_claim = 1; + */ + emailClaim: string; + + /** + * Claim containing the user's display name. + * Default: "name" + * + * @generated from field: string name_claim = 2; + */ + nameClaim: string; + + /** + * Claim containing the user's given/first name. + * Default: "given_name" + * + * @generated from field: string given_name_claim = 3; + */ + givenNameClaim: string; + + /** + * Claim containing the user's family/last name. + * Default: "family_name" + * + * @generated from field: string family_name_claim = 4; + */ + familyNameClaim: string; + + /** + * Claim containing the user's profile picture URL. + * Default: "picture" + * + * @generated from field: string picture_claim = 5; + */ + pictureClaim: string; + + /** + * Additional custom claim mappings. + * Key: internal attribute name, Value: external claim name + * + * @generated from field: map custom_claims = 6; + */ + customClaims: { [key: string]: string }; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ClaimMappings. + * Use `create(ClaimMappingsSchema)` to create a new message. + */ +export const ClaimMappingsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 2); + +/** + * JITProvisioningConfig controls automatic user creation on first login. + * + * @generated from message redpanda.api.aigateway.v1.JITProvisioningConfig + */ +export type JITProvisioningConfig = Message<"redpanda.api.aigateway.v1.JITProvisioningConfig"> & { + /** + * Whether to automatically create users on first SSO login. + * + * @generated from field: bool enabled = 1; + */ + enabled: boolean; + + /** + * Default organization to add JIT-provisioned users to. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string default_organization = 2; + */ + defaultOrganization: string; + + /** + * Default role for JIT-provisioned users in the organization. + * Values: "admin", "member", "viewer". Default: "member" + * + * @generated from field: string default_role = 3; + */ + defaultRole: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.JITProvisioningConfig. + * Use `create(JITProvisioningConfigSchema)` to create a new message. + */ +export const JITProvisioningConfigSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 3); + +/** + * EmailDomain represents an email domain mapped to an identity provider. + * + * @generated from message redpanda.api.aigateway.v1.EmailDomain + */ +export type EmailDomain = Message<"redpanda.api.aigateway.v1.EmailDomain"> & { + /** + * Resource name. Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * The email domain (e.g., "example.com"). + * + * @generated from field: string domain = 2; + */ + domain: string; + + /** + * Whether this domain is enabled for Home Realm Discovery. + * Only verified domains can be enabled. + * + * @generated from field: bool enabled = 3; + */ + enabled: boolean; + + /** + * Verification status. + * + * @generated from field: redpanda.api.aigateway.v1.DomainVerificationStatus verification_status = 4; + */ + verificationStatus: DomainVerificationStatus; + + /** + * DNS TXT record value for verification. + * Add as: _redpanda-aigateway-verify.{domain} TXT "{verification_token}" + * + * @generated from field: string verification_token = 5; + */ + verificationToken: string; + + /** + * Verification token expiration time. + * + * @generated from field: google.protobuf.Timestamp verification_expires_at = 6; + */ + verificationExpiresAt?: Timestamp; + + /** + * When the domain was verified. + * + * @generated from field: google.protobuf.Timestamp verified_at = 7; + */ + verifiedAt?: Timestamp; + + /** + * Output only. Creation timestamp. + * + * @generated from field: google.protobuf.Timestamp create_time = 8; + */ + createTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.EmailDomain. + * Use `create(EmailDomainSchema)` to create a new message. + */ +export const EmailDomainSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 4); + +/** + * Request message for CreateIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.CreateIdentityProviderRequest + */ +export type CreateIdentityProviderRequest = Message<"redpanda.api.aigateway.v1.CreateIdentityProviderRequest"> & { + /** + * Required. Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Optional. The IdP ID to use. If empty, server generates one. + * + * @generated from field: string identity_provider_id = 2; + */ + identityProviderId: string; + + /** + * Required. The identity provider to create. + * + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 3; + */ + identityProvider?: IdentityProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateIdentityProviderRequest. + * Use `create(CreateIdentityProviderRequestSchema)` to create a new message. + */ +export const CreateIdentityProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 5); + +/** + * Response message for CreateIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.CreateIdentityProviderResponse + */ +export type CreateIdentityProviderResponse = Message<"redpanda.api.aigateway.v1.CreateIdentityProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 1; + */ + identityProvider?: IdentityProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateIdentityProviderResponse. + * Use `create(CreateIdentityProviderResponseSchema)` to create a new message. + */ +export const CreateIdentityProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 6); + +/** + * Request message for GetIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.GetIdentityProviderRequest + */ +export type GetIdentityProviderRequest = Message<"redpanda.api.aigateway.v1.GetIdentityProviderRequest"> & { + /** + * Required. Resource name of the identity provider. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetIdentityProviderRequest. + * Use `create(GetIdentityProviderRequestSchema)` to create a new message. + */ +export const GetIdentityProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 7); + +/** + * Response message for GetIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.GetIdentityProviderResponse + */ +export type GetIdentityProviderResponse = Message<"redpanda.api.aigateway.v1.GetIdentityProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 1; + */ + identityProvider?: IdentityProvider; + + /** + * Output only. Number of users linked to this identity provider via SSO. + * + * @generated from field: int32 linked_users_count = 2; + */ + linkedUsersCount: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetIdentityProviderResponse. + * Use `create(GetIdentityProviderResponseSchema)` to create a new message. + */ +export const GetIdentityProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 8); + +/** + * Request message for ListIdentityProviders. + * + * @generated from message redpanda.api.aigateway.v1.ListIdentityProvidersRequest + */ +export type ListIdentityProvidersRequest = Message<"redpanda.api.aigateway.v1.ListIdentityProvidersRequest"> & { + /** + * Required. Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of IdPs to return (max 100). + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call. + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter by enabled status. + * + * @generated from field: bool filter_enabled = 4; + */ + filterEnabled: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListIdentityProvidersRequest. + * Use `create(ListIdentityProvidersRequestSchema)` to create a new message. + */ +export const ListIdentityProvidersRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 9); + +/** + * Response message for ListIdentityProviders. + * + * @generated from message redpanda.api.aigateway.v1.ListIdentityProvidersResponse + */ +export type ListIdentityProvidersResponse = Message<"redpanda.api.aigateway.v1.ListIdentityProvidersResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.IdentityProvider identity_providers = 1; + */ + identityProviders: IdentityProvider[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListIdentityProvidersResponse. + * Use `create(ListIdentityProvidersResponseSchema)` to create a new message. + */ +export const ListIdentityProvidersResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 10); + +/** + * Request message for UpdateIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.UpdateIdentityProviderRequest + */ +export type UpdateIdentityProviderRequest = Message<"redpanda.api.aigateway.v1.UpdateIdentityProviderRequest"> & { + /** + * Required. The identity provider to update. + * + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 1; + */ + identityProvider?: IdentityProvider; + + /** + * Fields to update. If not specified, all non-empty fields are updated. + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateIdentityProviderRequest. + * Use `create(UpdateIdentityProviderRequestSchema)` to create a new message. + */ +export const UpdateIdentityProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 11); + +/** + * Response message for UpdateIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.UpdateIdentityProviderResponse + */ +export type UpdateIdentityProviderResponse = Message<"redpanda.api.aigateway.v1.UpdateIdentityProviderResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 1; + */ + identityProvider?: IdentityProvider; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateIdentityProviderResponse. + * Use `create(UpdateIdentityProviderResponseSchema)` to create a new message. + */ +export const UpdateIdentityProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 12); + +/** + * Request message for DeleteIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.DeleteIdentityProviderRequest + */ +export type DeleteIdentityProviderRequest = Message<"redpanda.api.aigateway.v1.DeleteIdentityProviderRequest"> & { + /** + * Required. Resource name of the identity provider to delete. + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, also delete all associated domains and user identity links. + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteIdentityProviderRequest. + * Use `create(DeleteIdentityProviderRequestSchema)` to create a new message. + */ +export const DeleteIdentityProviderRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 13); + +/** + * Response message for DeleteIdentityProvider. + * + * @generated from message redpanda.api.aigateway.v1.DeleteIdentityProviderResponse + */ +export type DeleteIdentityProviderResponse = Message<"redpanda.api.aigateway.v1.DeleteIdentityProviderResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteIdentityProviderResponse. + * Use `create(DeleteIdentityProviderResponseSchema)` to create a new message. + */ +export const DeleteIdentityProviderResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 14); + +/** + * Request message for AddDomain. + * + * @generated from message redpanda.api.aigateway.v1.AddDomainRequest + */ +export type AddDomainRequest = Message<"redpanda.api.aigateway.v1.AddDomainRequest"> & { + /** + * Required. Parent identity provider. + * Format: `accounts/{account}/identity-providers/{idp}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Required. The email domain to add (e.g., "example.com"). + * + * @generated from field: string domain = 2; + */ + domain: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddDomainRequest. + * Use `create(AddDomainRequestSchema)` to create a new message. + */ +export const AddDomainRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 15); + +/** + * Response message for AddDomain. + * + * @generated from message redpanda.api.aigateway.v1.AddDomainResponse + */ +export type AddDomainResponse = Message<"redpanda.api.aigateway.v1.AddDomainResponse"> & { + /** + * The created domain with verification instructions. + * + * @generated from field: redpanda.api.aigateway.v1.EmailDomain email_domain = 1; + */ + emailDomain?: EmailDomain; + + /** + * Instructions for DNS verification. + * + * @generated from field: string verification_instructions = 2; + */ + verificationInstructions: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddDomainResponse. + * Use `create(AddDomainResponseSchema)` to create a new message. + */ +export const AddDomainResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 16); + +/** + * Request message for ListDomains. + * + * @generated from message redpanda.api.aigateway.v1.ListDomainsRequest + */ +export type ListDomainsRequest = Message<"redpanda.api.aigateway.v1.ListDomainsRequest"> & { + /** + * Required. Parent identity provider. + * Format: `accounts/{account}/identity-providers/{idp}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of domains to return. + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call. + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListDomainsRequest. + * Use `create(ListDomainsRequestSchema)` to create a new message. + */ +export const ListDomainsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 17); + +/** + * Response message for ListDomains. + * + * @generated from message redpanda.api.aigateway.v1.ListDomainsResponse + */ +export type ListDomainsResponse = Message<"redpanda.api.aigateway.v1.ListDomainsResponse"> & { + /** + * @generated from field: repeated redpanda.api.aigateway.v1.EmailDomain domains = 1; + */ + domains: EmailDomain[]; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListDomainsResponse. + * Use `create(ListDomainsResponseSchema)` to create a new message. + */ +export const ListDomainsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 18); + +/** + * Request message for RemoveDomain. + * + * @generated from message redpanda.api.aigateway.v1.RemoveDomainRequest + */ +export type RemoveDomainRequest = Message<"redpanda.api.aigateway.v1.RemoveDomainRequest"> & { + /** + * Required. Resource name of the domain to remove. + * Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveDomainRequest. + * Use `create(RemoveDomainRequestSchema)` to create a new message. + */ +export const RemoveDomainRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 19); + +/** + * Response message for RemoveDomain. + * + * @generated from message redpanda.api.aigateway.v1.RemoveDomainResponse + */ +export type RemoveDomainResponse = Message<"redpanda.api.aigateway.v1.RemoveDomainResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveDomainResponse. + * Use `create(RemoveDomainResponseSchema)` to create a new message. + */ +export const RemoveDomainResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 20); + +/** + * Request message for VerifyDomain. + * + * @generated from message redpanda.api.aigateway.v1.VerifyDomainRequest + */ +export type VerifyDomainRequest = Message<"redpanda.api.aigateway.v1.VerifyDomainRequest"> & { + /** + * Required. Resource name of the domain to verify. + * Format: `accounts/{account}/identity-providers/{idp}/domains/{domain}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.VerifyDomainRequest. + * Use `create(VerifyDomainRequestSchema)` to create a new message. + */ +export const VerifyDomainRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 21); + +/** + * Response message for VerifyDomain. + * + * @generated from message redpanda.api.aigateway.v1.VerifyDomainResponse + */ +export type VerifyDomainResponse = Message<"redpanda.api.aigateway.v1.VerifyDomainResponse"> & { + /** + * Updated domain with verification result. + * + * @generated from field: redpanda.api.aigateway.v1.EmailDomain email_domain = 1; + */ + emailDomain?: EmailDomain; + + /** + * Whether verification succeeded. + * + * @generated from field: bool verified = 2; + */ + verified: boolean; + + /** + * Error message if verification failed. + * + * @generated from field: string error_message = 3; + */ + errorMessage: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.VerifyDomainResponse. + * Use `create(VerifyDomainResponseSchema)` to create a new message. + */ +export const VerifyDomainResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 22); + +/** + * Request message for LookupIdPByEmail. + * + * @generated from message redpanda.api.aigateway.v1.LookupIdPByEmailRequest + */ +export type LookupIdPByEmailRequest = Message<"redpanda.api.aigateway.v1.LookupIdPByEmailRequest"> & { + /** + * Required. Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Required. The email address to look up. + * + * @generated from field: string email = 2; + */ + email: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LookupIdPByEmailRequest. + * Use `create(LookupIdPByEmailRequestSchema)` to create a new message. + */ +export const LookupIdPByEmailRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 23); + +/** + * Response message for LookupIdPByEmail. + * + * @generated from message redpanda.api.aigateway.v1.LookupIdPByEmailResponse + */ +export type LookupIdPByEmailResponse = Message<"redpanda.api.aigateway.v1.LookupIdPByEmailResponse"> & { + /** + * The identity provider for this email domain. + * Empty if no IdP is configured (user should use password login). + * + * @generated from field: redpanda.api.aigateway.v1.IdentityProvider identity_provider = 1; + */ + identityProvider?: IdentityProvider; + + /** + * Whether an IdP was found for this email domain. + * + * @generated from field: bool has_idp = 2; + */ + hasIdp: boolean; + + /** + * The authorization URL to redirect the user to. + * Only set if has_idp is true. + * + * @generated from field: string authorization_url = 3; + */ + authorizationUrl: string; + + /** + * Whether the user can also authenticate via password. + * True if the user exists and has a password set (e.g., super admins). + * When both has_idp and allow_password_login are true, UI should show both options. + * + * @generated from field: bool allow_password_login = 4; + */ + allowPasswordLogin: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.LookupIdPByEmailResponse. + * Use `create(LookupIdPByEmailResponseSchema)` to create a new message. + */ +export const LookupIdPByEmailResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 24); + +/** + * Request message for TestCredentials. + * Tests that the client_id and client_secret are valid by attempting + * a client credentials grant. No scopes are sent - we only validate credentials. + * + * @generated from message redpanda.api.aigateway.v1.TestCredentialsRequest + */ +export type TestCredentialsRequest = Message<"redpanda.api.aigateway.v1.TestCredentialsRequest"> & { + /** + * Required. The OIDC issuer URL. + * + * @generated from field: string issuer_url = 1; + */ + issuerUrl: string; + + /** + * Required. The OAuth2 client ID. + * + * @generated from field: string client_id = 2; + */ + clientId: string; + + /** + * Required. The OAuth2 client secret. + * + * @generated from field: string client_secret = 3; + */ + clientSecret: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TestCredentialsRequest. + * Use `create(TestCredentialsRequestSchema)` to create a new message. + */ +export const TestCredentialsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 25); + +/** + * Response message for TestCredentials. + * + * @generated from message redpanda.api.aigateway.v1.TestCredentialsResponse + */ +export type TestCredentialsResponse = Message<"redpanda.api.aigateway.v1.TestCredentialsResponse"> & { + /** + * Whether the test succeeded. + * + * @generated from field: bool success = 1; + */ + success: boolean; + + /** + * Error message if the test failed (or success note if credentials valid). + * + * @generated from field: string error_message = 2; + */ + errorMessage: string; + + /** + * Decoded token claims as JSON. + * Contains standard claims (iss, sub, aud, exp, iat) and custom claims. + * + * @generated from field: map claims = 5; + */ + claims: { [key: string]: string }; + + /** + * The raw access token (truncated for security). + * Shows first 10 and last 10 characters with ... in between. + * + * @generated from field: string access_token_preview = 6; + */ + accessTokenPreview: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TestCredentialsResponse. + * Use `create(TestCredentialsResponseSchema)` to create a new message. + */ +export const TestCredentialsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_sso, 26); + +/** + * IdentityProviderType specifies the protocol used by the identity provider. + * + * @generated from enum redpanda.api.aigateway.v1.IdentityProviderType + */ +export enum IdentityProviderType { + /** + * @generated from enum value: IDENTITY_PROVIDER_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * OpenID Connect (OIDC) provider + * + * @generated from enum value: IDENTITY_PROVIDER_TYPE_OIDC = 1; + */ + OIDC = 1, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.IdentityProviderType. + */ +export const IdentityProviderTypeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_sso, 0); + +/** + * AuthMethod specifies how an IdP can be used for authentication. + * + * @generated from enum redpanda.api.aigateway.v1.AuthMethod + */ +export enum AuthMethod { + /** + * @generated from enum value: AUTH_METHOD_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * OAuth2 Authorization Code flow with PKCE (browser SSO). + * Used for WebUI login where the user is redirected to the IdP. + * + * @generated from enum value: AUTH_METHOD_AUTHORIZATION_CODE = 1; + */ + AUTHORIZATION_CODE = 1, + + /** + * Direct Bearer token validation (API authentication). + * Used for CLI/API access where tokens are obtained externally. + * + * @generated from enum value: AUTH_METHOD_JWT_BEARER = 2; + */ + JWT_BEARER = 2, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.AuthMethod. + */ +export const AuthMethodSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_sso, 1); + +/** + * ProviderTemplate identifies pre-built provider configurations. + * + * @generated from enum redpanda.api.aigateway.v1.ProviderTemplate + */ +export enum ProviderTemplate { + /** + * @generated from enum value: PROVIDER_TEMPLATE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Generic OIDC provider (manual configuration) + * + * @generated from enum value: PROVIDER_TEMPLATE_GENERIC = 1; + */ + GENERIC = 1, + + /** + * Google Workspace / Google Cloud Identity + * + * @generated from enum value: PROVIDER_TEMPLATE_GOOGLE = 2; + */ + GOOGLE = 2, + + /** + * GitHub (OAuth2 with OIDC-like claims) + * + * @generated from enum value: PROVIDER_TEMPLATE_GITHUB = 3; + */ + GITHUB = 3, + + /** + * Okta + * + * @generated from enum value: PROVIDER_TEMPLATE_OKTA = 4; + */ + OKTA = 4, + + /** + * Microsoft Azure AD / Entra ID + * + * @generated from enum value: PROVIDER_TEMPLATE_AZURE_AD = 5; + */ + AZURE_AD = 5, + + /** + * Auth0 + * + * @generated from enum value: PROVIDER_TEMPLATE_AUTH0 = 6; + */ + AUTH0 = 6, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.ProviderTemplate. + */ +export const ProviderTemplateSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_sso, 2); + +/** + * DomainVerificationStatus indicates the verification state of a domain. + * + * @generated from enum redpanda.api.aigateway.v1.DomainVerificationStatus + */ +export enum DomainVerificationStatus { + /** + * @generated from enum value: DOMAIN_VERIFICATION_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Verification pending - DNS record not yet added or checked + * + * @generated from enum value: DOMAIN_VERIFICATION_STATUS_PENDING = 1; + */ + PENDING = 1, + + /** + * Domain successfully verified + * + * @generated from enum value: DOMAIN_VERIFICATION_STATUS_VERIFIED = 2; + */ + VERIFIED = 2, + + /** + * Verification failed (DNS record not found or mismatch) + * + * @generated from enum value: DOMAIN_VERIFICATION_STATUS_FAILED = 3; + */ + FAILED = 3, + + /** + * Verification token expired + * + * @generated from enum value: DOMAIN_VERIFICATION_STATUS_EXPIRED = 4; + */ + EXPIRED = 4, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.DomainVerificationStatus. + */ +export const DomainVerificationStatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_sso, 3); + +/** + * SSOService manages external identity providers for federated authentication. + * Identity providers allow users to authenticate via external OIDC providers (Google, Okta, etc.) + * while the gateway remains the central authentication authority. + * Resource name: accounts/{account_id}/identity-providers/{idp_id} + * + * @generated from service redpanda.api.aigateway.v1.SSOService + */ +export const SSOService: GenService<{ + /** + * Creates a new identity provider within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.CreateIdentityProvider + */ + createIdentityProvider: { + methodKind: "unary"; + input: typeof CreateIdentityProviderRequestSchema; + output: typeof CreateIdentityProviderResponseSchema; + }, + /** + * Gets an identity provider by name. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.GetIdentityProvider + */ + getIdentityProvider: { + methodKind: "unary"; + input: typeof GetIdentityProviderRequestSchema; + output: typeof GetIdentityProviderResponseSchema; + }, + /** + * Lists identity providers within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.ListIdentityProviders + */ + listIdentityProviders: { + methodKind: "unary"; + input: typeof ListIdentityProvidersRequestSchema; + output: typeof ListIdentityProvidersResponseSchema; + }, + /** + * Updates an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.UpdateIdentityProvider + */ + updateIdentityProvider: { + methodKind: "unary"; + input: typeof UpdateIdentityProviderRequestSchema; + output: typeof UpdateIdentityProviderResponseSchema; + }, + /** + * Deletes an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.DeleteIdentityProvider + */ + deleteIdentityProvider: { + methodKind: "unary"; + input: typeof DeleteIdentityProviderRequestSchema; + output: typeof DeleteIdentityProviderResponseSchema; + }, + /** + * Adds an email domain to an identity provider for Home Realm Discovery. + * The domain must be verified via DNS TXT record before it becomes active. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.AddDomain + */ + addDomain: { + methodKind: "unary"; + input: typeof AddDomainRequestSchema; + output: typeof AddDomainResponseSchema; + }, + /** + * Lists domains associated with an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.ListDomains + */ + listDomains: { + methodKind: "unary"; + input: typeof ListDomainsRequestSchema; + output: typeof ListDomainsResponseSchema; + }, + /** + * Removes a domain from an identity provider. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.RemoveDomain + */ + removeDomain: { + methodKind: "unary"; + input: typeof RemoveDomainRequestSchema; + output: typeof RemoveDomainResponseSchema; + }, + /** + * Initiates or retries domain verification via DNS TXT record. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.VerifyDomain + */ + verifyDomain: { + methodKind: "unary"; + input: typeof VerifyDomainRequestSchema; + output: typeof VerifyDomainResponseSchema; + }, + /** + * Looks up the identity provider for an email address based on domain. + * Used during login to determine which IdP to redirect to. + * Returns NOT_FOUND if no IdP is configured for the domain. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.LookupIdPByEmail + */ + lookupIdPByEmail: { + methodKind: "unary"; + input: typeof LookupIdPByEmailRequestSchema; + output: typeof LookupIdPByEmailResponseSchema; + }, + /** + * Tests OIDC credentials using the client credentials grant. + * Validates that the client_id and client_secret can obtain a token + * and returns the decoded token claims. + * + * @generated from rpc redpanda.api.aigateway.v1.SSOService.TestCredentials + */ + testCredentials: { + methodKind: "unary"; + input: typeof TestCredentialsRequestSchema; + output: typeof TestCredentialsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_sso, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/team-TeamService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/team-TeamService_connectquery.ts new file mode 100644 index 0000000000..0c8cce18a5 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/team-TeamService_connectquery.ts @@ -0,0 +1,75 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/team.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { TeamService } from "./team_pb"; + +/** + * Creates a new team within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.CreateTeam + */ +export const createTeam = TeamService.method.createTeam; + +/** + * Gets a team by name. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.GetTeam + */ +export const getTeam = TeamService.method.getTeam; + +/** + * Lists teams within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.ListTeams + */ +export const listTeams = TeamService.method.listTeams; + +/** + * Updates a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.UpdateTeam + */ +export const updateTeam = TeamService.method.updateTeam; + +/** + * Deletes a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.DeleteTeam + */ +export const deleteTeam = TeamService.method.deleteTeam; + +/** + * Adds a user to a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.AddTeamMember + */ +export const addTeamMember = TeamService.method.addTeamMember; + +/** + * Gets a team membership. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.GetTeamMember + */ +export const getTeamMember = TeamService.method.getTeamMember; + +/** + * Lists members of a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.ListTeamMembers + */ +export const listTeamMembers = TeamService.method.listTeamMembers; + +/** + * Updates a team member's role. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.UpdateTeamMember + */ +export const updateTeamMember = TeamService.method.updateTeamMember; + +/** + * Removes a user from a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.RemoveTeamMember + */ +export const removeTeamMember = TeamService.method.removeTeamMember; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/team_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/team_pb.ts new file mode 100644 index 0000000000..4dc0caf351 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/team_pb.ts @@ -0,0 +1,818 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/team.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/team.proto. + */ +export const file_redpanda_api_aigateway_v1_team: GenFile = /*@__PURE__*/ + fileDesc("CiRyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3RlYW0ucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEi0wMKBFRlYW0SEQoEbmFtZRgBIAEoCUID4EEIEiMKDGRpc3BsYXlfbmFtZRgCIAEoCUIN4EECukgHcgUQARj/ARIYCgtkZXNjcmlwdGlvbhgDIAEoCUID4EEBEg8KB2VuYWJsZWQYBCABKAgSPwoIbWV0YWRhdGEYBSADKAsyLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW0uTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGAggASgJQgPgQQMSFAoHdXBkYXRlchgJIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpe6kFbChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0SPGFjY291bnRzL3thY2NvdW50fS9vcmdhbml6YXRpb25zL3tvcmdhbml6YXRpb259L3RlYW1zL3t0ZWFtfSLZAgoOVGVhbU1lbWJlcnNoaXASEQoEbmFtZRgBIAEoCUID4EEIEjEKBHVzZXIYAiABKAlCI+BBAvpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Vc2VyEjYKBHJvbGUYAyABKA4yIy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW1Sb2xlQgPgQQISNAoLY3JlYXRlX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSFAoHY3JlYXRvchgFIAEoCUID4EEDOn3qQXoKJWFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVGVhbU1lbWJlcnNoaXASUWFjY291bnRzL3thY2NvdW50fS9vcmdhbml6YXRpb25zL3tvcmdhbml6YXRpb259L3RlYW1zL3t0ZWFtfS9tZW1iZXJzL3ttZW1iZXJzaGlwfSKaAQoRQ3JlYXRlVGVhbVJlcXVlc3QSOwoGcGFyZW50GAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEhQKB3RlYW1faWQYAiABKAlCA+BBARIyCgR0ZWFtGAMgASgLMh8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtQgPgQQIiQwoSQ3JlYXRlVGVhbVJlc3BvbnNlEi0KBHRlYW0YASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW0iQwoOR2V0VGVhbVJlcXVlc3QSMQoEbmFtZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0iQAoPR2V0VGVhbVJlc3BvbnNlEi0KBHRlYW0YASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW0itgEKEExpc3RUZWFtc1JlcXVlc3QSOwoGcGFyZW50GAEgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEiAKCXBhZ2Vfc2l6ZRgCIAEoBUIN4EEBukgHGgUY6AcoABIXCgpwYWdlX3Rva2VuGAMgASgJQgPgQQESEwoGZmlsdGVyGAQgASgJQgPgQQESFQoIb3JkZXJfYnkYBSABKAlCA+BBASJwChFMaXN0VGVhbXNSZXNwb25zZRIuCgV0ZWFtcxgBIAMoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGVhbRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSJ9ChFVcGRhdGVUZWFtUmVxdWVzdBIyCgR0ZWFtGAEgASgLMh8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtQgPgQQISNAoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgPgQQEiQwoSVXBkYXRlVGVhbVJlc3BvbnNlEi0KBHRlYW0YASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlRlYW0iWgoRRGVsZXRlVGVhbVJlcXVlc3QSMQoEbmFtZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0SEgoFZm9yY2UYAiABKAhCA+BBASIUChJEZWxldGVUZWFtUmVzcG9uc2UitgEKFEFkZFRlYW1NZW1iZXJSZXF1ZXN0EjMKBnBhcmVudBgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW0SMQoEdXNlchgCIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1VzZXISNgoEcm9sZRgDIAEoDjIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGVhbVJvbGVCA+BBAiJWChVBZGRUZWFtTWVtYmVyUmVzcG9uc2USPQoKbWVtYmVyc2hpcBgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGVhbU1lbWJlcnNoaXAiUwoUR2V0VGVhbU1lbWJlclJlcXVlc3QSOwoEbmFtZRgBIAEoCUIt4EEC+kEnCiVhaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW1NZW1iZXJzaGlwIlYKFUdldFRlYW1NZW1iZXJSZXNwb25zZRI9CgptZW1iZXJzaGlwGAEgASgLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtTWVtYmVyc2hpcCKIAQoWTGlzdFRlYW1NZW1iZXJzUmVxdWVzdBIzCgZwYXJlbnQYASABKAlCI+BBAvpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9UZWFtEiAKCXBhZ2Vfc2l6ZRgCIAEoBUIN4EEBukgHGgUY6AcoABIXCgpwYWdlX3Rva2VuGAMgASgJQgPgQQEihgEKF0xpc3RUZWFtTWVtYmVyc1Jlc3BvbnNlEj4KC21lbWJlcnNoaXBzGAEgAygLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5UZWFtTWVtYmVyc2hpcBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSKTAQoXVXBkYXRlVGVhbU1lbWJlclJlcXVlc3QSQgoKbWVtYmVyc2hpcBgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGVhbU1lbWJlcnNoaXBCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBASJZChhVcGRhdGVUZWFtTWVtYmVyUmVzcG9uc2USPQoKbWVtYmVyc2hpcBgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVGVhbU1lbWJlcnNoaXAiVgoXUmVtb3ZlVGVhbU1lbWJlclJlcXVlc3QSOwoEbmFtZRgBIAEoCUIt4EEC+kEnCiVhaWdhdGV3YXkucmVkcGFuZGEuY29tL1RlYW1NZW1iZXJzaGlwIhoKGFJlbW92ZVRlYW1NZW1iZXJSZXNwb25zZSpmCghUZWFtUm9sZRIZChVURUFNX1JPTEVfVU5TUEVDSUZJRUQQABITCg9URUFNX1JPTEVfQURNSU4QARIUChBURUFNX1JPTEVfTUVNQkVSEAISFAoQVEVBTV9ST0xFX1ZJRVdFUhADMpMOCgtUZWFtU2VydmljZRKmAQoKQ3JlYXRlVGVhbRIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlVGVhbVJlcXVlc3QaLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZVRlYW1SZXNwb25zZSI7gtPkkwI1OgR0ZWFtIi0vdjEve3BhcmVudD1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKn0vdGVhbXMSlwEKB0dldFRlYW0SKS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFRlYW1SZXF1ZXN0GioucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRUZWFtUmVzcG9uc2UiNYLT5JMCLxItL3YxL3tuYW1lPWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qL3RlYW1zLyp9Ep0BCglMaXN0VGVhbXMSKy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RUZWFtc1JlcXVlc3QaLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RUZWFtc1Jlc3BvbnNlIjWC0+STAi8SLS92MS97cGFyZW50PWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qfS90ZWFtcxKrAQoKVXBkYXRlVGVhbRIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlVGVhbVJlcXVlc3QaLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVRlYW1SZXNwb25zZSJAgtPkkwI6OgR0ZWFtMjIvdjEve3RlYW0ubmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKi90ZWFtcy8qfRKgAQoKRGVsZXRlVGVhbRIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlVGVhbVJlcXVlc3QaLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVRlYW1SZXNwb25zZSI1gtPkkwIvKi0vdjEve25hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovdGVhbXMvKn0StgEKDUFkZFRlYW1NZW1iZXISLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkFkZFRlYW1NZW1iZXJSZXF1ZXN0GjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5BZGRUZWFtTWVtYmVyUmVzcG9uc2UiQoLT5JMCPDoBKiI3L3YxL3twYXJlbnQ9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovdGVhbXMvKn0vbWVtYmVycxKzAQoNR2V0VGVhbU1lbWJlchIvLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0VGVhbU1lbWJlclJlcXVlc3QaMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFRlYW1NZW1iZXJSZXNwb25zZSI/gtPkkwI5EjcvdjEve25hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovdGVhbXMvKi9tZW1iZXJzLyp9ErkBCg9MaXN0VGVhbU1lbWJlcnMSMS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RUZWFtTWVtYmVyc1JlcXVlc3QaMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RUZWFtTWVtYmVyc1Jlc3BvbnNlIj+C0+STAjkSNy92MS97cGFyZW50PWFjY291bnRzLyovb3JnYW5pemF0aW9ucy8qL3RlYW1zLyp9L21lbWJlcnMSygEKEFVwZGF0ZVRlYW1NZW1iZXISMi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVRlYW1NZW1iZXJSZXF1ZXN0GjMucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVUZWFtTWVtYmVyUmVzcG9uc2UiTYLT5JMCRzoBKjJCL3YxL3ttZW1iZXJzaGlwLm5hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovdGVhbXMvKi9tZW1iZXJzLyp9ErwBChBSZW1vdmVUZWFtTWVtYmVyEjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZW1vdmVUZWFtTWVtYmVyUmVxdWVzdBozLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVtb3ZlVGVhbU1lbWJlclJlc3BvbnNlIj+C0+STAjkqNy92MS97bmFtZT1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKi90ZWFtcy8qL21lbWJlcnMvKn0aGcpBFmFpZ2F0ZXdheS5yZWRwYW5kYS5jb21C/gEKHWNvbS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxQglUZWFtUHJvdG9QAVpLZ28ucGFuZGEuZGV2L3JlZHBhbmRhLWFpZ3cvcHJvdG9zL2dlbi9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxO2FpZ2F0ZXdheXYxogIDUkFBqgIZUmVkcGFuZGEuQXBpLkFpZ2F0ZXdheS5WMcoCGVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjHiAiVSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYxXEdQQk1ldGFkYXRh6gIcUmVkcGFuZGE6OkFwaTo6QWlnYXRld2F5OjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Team represents a group of users within an organization. + * Teams are used for access control and collaboration. + * + * @generated from message redpanda.api.aigateway.v1.Team + */ +export type Team = Message<"redpanda.api.aigateway.v1.Team"> & { + /** + * Resource name. Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * Team ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name (must be unique within organization) + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Whether this team is active + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 5; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 6; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 7; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 8; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 9; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Team. + * Use `create(TeamSchema)` to create a new message. + */ +export const TeamSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 0); + +/** + * TeamMembership represents a user's membership in a team. + * + * @generated from message redpanda.api.aigateway.v1.TeamMembership + */ +export type TeamMembership = Message<"redpanda.api.aigateway.v1.TeamMembership"> & { + /** + * Resource name. Format: `accounts/{account}/organizations/{organization}/teams/{team}/members/{membership}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Reference to the user. + * Format: `accounts/{account}/organizations/{organization}/users/{user}` + * + * @generated from field: string user = 2; + */ + user: string; + + /** + * Role in the team: admin, member, viewer + * + * @generated from field: redpanda.api.aigateway.v1.TeamRole role = 3; + */ + role: TeamRole; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 4; + */ + createTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 5; + */ + creator: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.TeamMembership. + * Use `create(TeamMembershipSchema)` to create a new message. + */ +export const TeamMembershipSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 1); + +/** + * Request message for CreateTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateTeamRequest + */ +export type CreateTeamRequest = Message<"redpanda.api.aigateway.v1.CreateTeamRequest"> & { + /** + * Required: Parent organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The team ID to use. If empty, server generates one. + * + * @generated from field: string team_id = 2; + */ + teamId: string; + + /** + * Required: The team resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Team team = 3; + */ + team?: Team; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateTeamRequest. + * Use `create(CreateTeamRequestSchema)` to create a new message. + */ +export const CreateTeamRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 2); + +/** + * Response message for CreateTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateTeamResponse + */ +export type CreateTeamResponse = Message<"redpanda.api.aigateway.v1.CreateTeamResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Team team = 1; + */ + team?: Team; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateTeamResponse. + * Use `create(CreateTeamResponseSchema)` to create a new message. + */ +export const CreateTeamResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 3); + +/** + * Request message for GetTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetTeamRequest + */ +export type GetTeamRequest = Message<"redpanda.api.aigateway.v1.GetTeamRequest"> & { + /** + * Resource name of the team. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTeamRequest. + * Use `create(GetTeamRequestSchema)` to create a new message. + */ +export const GetTeamRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 4); + +/** + * Response message for GetTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetTeamResponse + */ +export type GetTeamResponse = Message<"redpanda.api.aigateway.v1.GetTeamResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Team team = 1; + */ + team?: Team; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTeamResponse. + * Use `create(GetTeamResponseSchema)` to create a new message. + */ +export const GetTeamResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 5); + +/** + * Request message for ListTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamsRequest + */ +export type ListTeamsRequest = Message<"redpanda.api.aigateway.v1.ListTeamsRequest"> & { + /** + * Required: Parent organization. + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of teams to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListTeams call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamsRequest. + * Use `create(ListTeamsRequestSchema)` to create a new message. + */ +export const ListTeamsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 6); + +/** + * Response message for ListTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamsResponse + */ +export type ListTeamsResponse = Message<"redpanda.api.aigateway.v1.ListTeamsResponse"> & { + /** + * The list of teams + * + * @generated from field: repeated redpanda.api.aigateway.v1.Team teams = 1; + */ + teams: Team[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching teams + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamsResponse. + * Use `create(ListTeamsResponseSchema)` to create a new message. + */ +export const ListTeamsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 7); + +/** + * Request message for UpdateTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateTeamRequest + */ +export type UpdateTeamRequest = Message<"redpanda.api.aigateway.v1.UpdateTeamRequest"> & { + /** + * Required: The team resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.Team team = 1; + */ + team?: Team; + + /** + * The fields to update. + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateTeamRequest. + * Use `create(UpdateTeamRequestSchema)` to create a new message. + */ +export const UpdateTeamRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 8); + +/** + * Response message for UpdateTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateTeamResponse + */ +export type UpdateTeamResponse = Message<"redpanda.api.aigateway.v1.UpdateTeamResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Team team = 1; + */ + team?: Team; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateTeamResponse. + * Use `create(UpdateTeamResponseSchema)` to create a new message. + */ +export const UpdateTeamResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 9); + +/** + * Request message for DeleteTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteTeamRequest + */ +export type DeleteTeamRequest = Message<"redpanda.api.aigateway.v1.DeleteTeamRequest"> & { + /** + * Resource name of the team to delete. + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all memberships + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteTeamRequest. + * Use `create(DeleteTeamRequestSchema)` to create a new message. + */ +export const DeleteTeamRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 10); + +/** + * Response message for DeleteTeam RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteTeamResponse + */ +export type DeleteTeamResponse = Message<"redpanda.api.aigateway.v1.DeleteTeamResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteTeamResponse. + * Use `create(DeleteTeamResponseSchema)` to create a new message. + */ +export const DeleteTeamResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 11); + +/** + * Request message for AddTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.AddTeamMemberRequest + */ +export type AddTeamMemberRequest = Message<"redpanda.api.aigateway.v1.AddTeamMemberRequest"> & { + /** + * Required: Parent team. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Required: User to add. + * Format: `accounts/{account}/organizations/{organization}/users/{user}` + * + * @generated from field: string user = 2; + */ + user: string; + + /** + * Required: Role for the membership + * + * @generated from field: redpanda.api.aigateway.v1.TeamRole role = 3; + */ + role: TeamRole; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddTeamMemberRequest. + * Use `create(AddTeamMemberRequestSchema)` to create a new message. + */ +export const AddTeamMemberRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 12); + +/** + * Response message for AddTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.AddTeamMemberResponse + */ +export type AddTeamMemberResponse = Message<"redpanda.api.aigateway.v1.AddTeamMemberResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.TeamMembership membership = 1; + */ + membership?: TeamMembership; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddTeamMemberResponse. + * Use `create(AddTeamMemberResponseSchema)` to create a new message. + */ +export const AddTeamMemberResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 13); + +/** + * Request message for GetTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetTeamMemberRequest + */ +export type GetTeamMemberRequest = Message<"redpanda.api.aigateway.v1.GetTeamMemberRequest"> & { + /** + * Resource name of the membership. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTeamMemberRequest. + * Use `create(GetTeamMemberRequestSchema)` to create a new message. + */ +export const GetTeamMemberRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 14); + +/** + * Response message for GetTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetTeamMemberResponse + */ +export type GetTeamMemberResponse = Message<"redpanda.api.aigateway.v1.GetTeamMemberResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.TeamMembership membership = 1; + */ + membership?: TeamMembership; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetTeamMemberResponse. + * Use `create(GetTeamMemberResponseSchema)` to create a new message. + */ +export const GetTeamMemberResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 15); + +/** + * Request message for ListTeamMembers RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamMembersRequest + */ +export type ListTeamMembersRequest = Message<"redpanda.api.aigateway.v1.ListTeamMembersRequest"> & { + /** + * Required: Parent team. + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of members to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListTeamMembers call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamMembersRequest. + * Use `create(ListTeamMembersRequestSchema)` to create a new message. + */ +export const ListTeamMembersRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 16); + +/** + * Response message for ListTeamMembers RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListTeamMembersResponse + */ +export type ListTeamMembersResponse = Message<"redpanda.api.aigateway.v1.ListTeamMembersResponse"> & { + /** + * The list of memberships + * + * @generated from field: repeated redpanda.api.aigateway.v1.TeamMembership memberships = 1; + */ + memberships: TeamMembership[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListTeamMembersResponse. + * Use `create(ListTeamMembersResponseSchema)` to create a new message. + */ +export const ListTeamMembersResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 17); + +/** + * Request message for UpdateTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateTeamMemberRequest + */ +export type UpdateTeamMemberRequest = Message<"redpanda.api.aigateway.v1.UpdateTeamMemberRequest"> & { + /** + * Required: The membership to update. + * + * @generated from field: redpanda.api.aigateway.v1.TeamMembership membership = 1; + */ + membership?: TeamMembership; + + /** + * The fields to update (only role is updatable) + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateTeamMemberRequest. + * Use `create(UpdateTeamMemberRequestSchema)` to create a new message. + */ +export const UpdateTeamMemberRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 18); + +/** + * Response message for UpdateTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateTeamMemberResponse + */ +export type UpdateTeamMemberResponse = Message<"redpanda.api.aigateway.v1.UpdateTeamMemberResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.TeamMembership membership = 1; + */ + membership?: TeamMembership; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateTeamMemberResponse. + * Use `create(UpdateTeamMemberResponseSchema)` to create a new message. + */ +export const UpdateTeamMemberResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 19); + +/** + * Request message for RemoveTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.RemoveTeamMemberRequest + */ +export type RemoveTeamMemberRequest = Message<"redpanda.api.aigateway.v1.RemoveTeamMemberRequest"> & { + /** + * Resource name of the membership to remove. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveTeamMemberRequest. + * Use `create(RemoveTeamMemberRequestSchema)` to create a new message. + */ +export const RemoveTeamMemberRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 20); + +/** + * Response message for RemoveTeamMember RPC. + * + * @generated from message redpanda.api.aigateway.v1.RemoveTeamMemberResponse + */ +export type RemoveTeamMemberResponse = Message<"redpanda.api.aigateway.v1.RemoveTeamMemberResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveTeamMemberResponse. + * Use `create(RemoveTeamMemberResponseSchema)` to create a new message. + */ +export const RemoveTeamMemberResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_team, 21); + +/** + * TeamRole defines the role a user can have in a team. + * + * @generated from enum redpanda.api.aigateway.v1.TeamRole + */ +export enum TeamRole { + /** + * @generated from enum value: TEAM_ROLE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * Full team management permissions + * + * @generated from enum value: TEAM_ROLE_ADMIN = 1; + */ + ADMIN = 1, + + /** + * Standard team member permissions + * + * @generated from enum value: TEAM_ROLE_MEMBER = 2; + */ + MEMBER = 2, + + /** + * Read-only access + * + * @generated from enum value: TEAM_ROLE_VIEWER = 3; + */ + VIEWER = 3, +} + +/** + * Describes the enum redpanda.api.aigateway.v1.TeamRole. + */ +export const TeamRoleSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_redpanda_api_aigateway_v1_team, 0); + +/** + * TeamService manages teams within organizations. + * A team is a group of users for access control and collaboration. + * Resource name: accounts/{account_id}/organizations/{organization_id}/teams/{team_id} + * + * @generated from service redpanda.api.aigateway.v1.TeamService + */ +export const TeamService: GenService<{ + /** + * Creates a new team within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.CreateTeam + */ + createTeam: { + methodKind: "unary"; + input: typeof CreateTeamRequestSchema; + output: typeof CreateTeamResponseSchema; + }, + /** + * Gets a team by name. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.GetTeam + */ + getTeam: { + methodKind: "unary"; + input: typeof GetTeamRequestSchema; + output: typeof GetTeamResponseSchema; + }, + /** + * Lists teams within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.ListTeams + */ + listTeams: { + methodKind: "unary"; + input: typeof ListTeamsRequestSchema; + output: typeof ListTeamsResponseSchema; + }, + /** + * Updates a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.UpdateTeam + */ + updateTeam: { + methodKind: "unary"; + input: typeof UpdateTeamRequestSchema; + output: typeof UpdateTeamResponseSchema; + }, + /** + * Deletes a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.DeleteTeam + */ + deleteTeam: { + methodKind: "unary"; + input: typeof DeleteTeamRequestSchema; + output: typeof DeleteTeamResponseSchema; + }, + /** + * Adds a user to a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.AddTeamMember + */ + addTeamMember: { + methodKind: "unary"; + input: typeof AddTeamMemberRequestSchema; + output: typeof AddTeamMemberResponseSchema; + }, + /** + * Gets a team membership. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.GetTeamMember + */ + getTeamMember: { + methodKind: "unary"; + input: typeof GetTeamMemberRequestSchema; + output: typeof GetTeamMemberResponseSchema; + }, + /** + * Lists members of a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.ListTeamMembers + */ + listTeamMembers: { + methodKind: "unary"; + input: typeof ListTeamMembersRequestSchema; + output: typeof ListTeamMembersResponseSchema; + }, + /** + * Updates a team member's role. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.UpdateTeamMember + */ + updateTeamMember: { + methodKind: "unary"; + input: typeof UpdateTeamMemberRequestSchema; + output: typeof UpdateTeamMemberResponseSchema; + }, + /** + * Removes a user from a team. + * + * @generated from rpc redpanda.api.aigateway.v1.TeamService.RemoveTeamMember + */ + removeTeamMember: { + methodKind: "unary"; + input: typeof RemoveTeamMemberRequestSchema; + output: typeof RemoveTeamMemberResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_team, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/user-UserService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/user-UserService_connectquery.ts new file mode 100644 index 0000000000..62b6518093 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/user-UserService_connectquery.ts @@ -0,0 +1,99 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/user.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { UserService } from "./user_pb"; + +/** + * Creates a new user within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.CreateUser + */ +export const createUser = UserService.method.createUser; + +/** + * Gets a user by name. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.GetUser + */ +export const getUser = UserService.method.getUser; + +/** + * Lists users within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUsers + */ +export const listUsers = UserService.method.listUsers; + +/** + * Updates a user. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.UpdateUser + */ +export const updateUser = UserService.method.updateUser; + +/** + * Deletes a user. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.DeleteUser + */ +export const deleteUser = UserService.method.deleteUser; + +/** + * Lists organizations that a user belongs to. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUserOrganizations + */ +export const listUserOrganizations = UserService.method.listUserOrganizations; + +/** + * Adds a user to an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.AddUserToOrganization + */ +export const addUserToOrganization = UserService.method.addUserToOrganization; + +/** + * Updates a user's role in an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole + */ +export const updateUserOrganizationRole = UserService.method.updateUserOrganizationRole; + +/** + * Removes a user from an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization + */ +export const removeUserFromOrganization = UserService.method.removeUserFromOrganization; + +/** + * Lists teams that a user belongs to. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUserTeams + */ +export const listUserTeams = UserService.method.listUserTeams; + +/** + * Gets information about a user's personal access token (non-secret info only). + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo + */ +export const getPersonalTokenInfo = UserService.method.getPersonalTokenInfo; + +/** + * Rotates a user's personal access token. + * The old token is invalidated and a new one is generated. + * The new token is returned only once and should be stored securely. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RotatePersonalToken + */ +export const rotatePersonalToken = UserService.method.rotatePersonalToken; + +/** + * Reveals the user's personal access token. + * Requires re-authentication with the user's password for security. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RevealPersonalToken + */ +export const revealPersonalToken = UserService.method.revealPersonalToken; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/user_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/user_pb.ts new file mode 100644 index 0000000000..1496e4c351 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/user_pb.ts @@ -0,0 +1,1126 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/user.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/user.proto. + */ +export const file_redpanda_api_aigateway_v1_user: GenFile = /*@__PURE__*/ + fileDesc("CiRyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3VzZXIucHJvdG8SGXJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEinAUKBFVzZXISEQoEbmFtZRgBIAEoCUID4EEIEhkKBWVtYWlsGAIgASgJQgrgQQK6SARyAmABEiMKDGRpc3BsYXlfbmFtZRgDIAEoCUIN4EECukgHcgUQARj/ARIZCgxvaWRjX3N1YmplY3QYBCABKAlCA+BBARIPCgdlbmFibGVkGAUgASgIEj8KCG1ldGFkYXRhGAYgAygLMi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Vc2VyLk1ldGFkYXRhRW50cnkSNAoLY3JlYXRlX3RpbWUYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSNAoLdXBkYXRlX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSOAoPbGFzdF9sb2dpbl90aW1lGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEhQKB2NyZWF0b3IYCiABKAlCA+BBAxIUCgd1cGRhdGVyGAsgASgJQgPgQQMSSQoUZGVmYXVsdF9vcmdhbml6YXRpb24YDCABKAlCK+BBAfpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb24SQwoRZGVmYXVsdF93b3Jrc3BhY2UYDSABKAlCKOBBAfpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Xb3Jrc3BhY2UaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOkHqQT4KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVXNlchIfYWNjb3VudHMve2FjY291bnR9L3VzZXJzL3t1c2VyfSLrAgoWT3JnYW5pemF0aW9uTWVtYmVyc2hpcBIRCgRuYW1lGAEgASgJQgPgQQgSQQoMb3JnYW5pemF0aW9uGAIgASgJQivgQQL6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEiYKGW9yZ2FuaXphdGlvbl9kaXNwbGF5X25hbWUYAyABKAlCA+BBAxItCgRyb2xlGAQgASgJQh/gQQK6SBlyF1IFYWRtaW5SBm1lbWJlclIGdmlld2VyEjIKCWpvaW5fdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAzpw6kFtCi1haWdhdGV3YXkucmVkcGFuZGEuY29tL09yZ2FuaXphdGlvbk1lbWJlcnNoaXASPGFjY291bnRzL3thY2NvdW50fS91c2Vycy97dXNlcn0vb3JnYW5pemF0aW9ucy97b3JnYW5pemF0aW9ufSKIAgoRQ3JlYXRlVXNlclJlcXVlc3QSNgoGcGFyZW50GAEgASgJQibgQQL6QSAKHmFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vQWNjb3VudBIUCgd1c2VyX2lkGAIgASgJQgPgQQESMgoEdXNlchgDIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXNlckID4EECEkkKFGluaXRpYWxfb3JnYW5pemF0aW9uGAQgASgJQivgQQH6QSUKI2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uEiYKGWluaXRpYWxfb3JnYW5pemF0aW9uX3JvbGUYBSABKAlCA+BBASJnChJDcmVhdGVVc2VyUmVzcG9uc2USLQoEdXNlchgBIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXNlchIiChVwZXJzb25hbF9hY2Nlc3NfdG9rZW4YAiABKAlCA+BBAyJDCg5HZXRVc2VyUmVxdWVzdBIxCgRuYW1lGAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVXNlciJACg9HZXRVc2VyUmVzcG9uc2USLQoEdXNlchgBIAEoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXNlciKxAQoQTGlzdFVzZXJzUmVxdWVzdBI2CgZwYXJlbnQYASABKAlCJuBBAvpBIAoeYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9BY2NvdW50EiAKCXBhZ2Vfc2l6ZRgCIAEoBUIN4EEBukgHGgUY6AcoABIXCgpwYWdlX3Rva2VuGAMgASgJQgPgQQESEwoGZmlsdGVyGAQgASgJQgPgQQESFQoIb3JkZXJfYnkYBSABKAlCA+BBASJwChFMaXN0VXNlcnNSZXNwb25zZRIuCgV1c2VycxgBIAMoCzIfLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSJ9ChFVcGRhdGVVc2VyUmVxdWVzdBIyCgR1c2VyGAEgASgLMh8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Vc2VyQgPgQQISNAoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgPgQQEiQwoSVXBkYXRlVXNlclJlc3BvbnNlEi0KBHVzZXIYASABKAsyHy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVzZXIiWgoRRGVsZXRlVXNlclJlcXVlc3QSMQoEbmFtZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1VzZXISEgoFZm9yY2UYAiABKAhCA+BBASIUChJEZWxldGVVc2VyUmVzcG9uc2UijgEKHExpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QSMwoGcGFyZW50GAEgASgJQiPgQQL6QR0KG2FpZ2F0ZXdheS5yZWRwYW5kYS5jb20vVXNlchIgCglwYWdlX3NpemUYAiABKAVCDeBBAbpIBxoFGOgHKAASFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBIpQBCh1MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXNwb25zZRJGCgttZW1iZXJzaGlwcxgBIAMoCzIxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3JnYW5pemF0aW9uTWVtYmVyc2hpcBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEgoKdG90YWxfc2l6ZRgDIAEoBSLHAQocQWRkVXNlclRvT3JnYW5pemF0aW9uUmVxdWVzdBIzCgZwYXJlbnQYASABKAlCI+BBAvpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Vc2VyEkEKDG9yZ2FuaXphdGlvbhgCIAEoCUIr4EEC+kElCiNhaWdhdGV3YXkucmVkcGFuZGEuY29tL09yZ2FuaXphdGlvbhIvCgRyb2xlGAMgASgJQiHgQQG6SBtyGVIFYWRtaW5SBm1lbWJlclIGdmlld2VyUgAiZgodQWRkVXNlclRvT3JnYW5pemF0aW9uUmVzcG9uc2USRQoKbWVtYmVyc2hpcBgBIAEoCzIxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuT3JnYW5pemF0aW9uTWVtYmVyc2hpcCKXAQohVXBkYXRlVXNlck9yZ2FuaXphdGlvblJvbGVSZXF1ZXN0EkMKBG5hbWUYASABKAlCNeBBAvpBLwotYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb25NZW1iZXJzaGlwEi0KBHJvbGUYAiABKAlCH+BBArpIGXIXUgVhZG1pblIGbWVtYmVyUgZ2aWV3ZXIiawoiVXBkYXRlVXNlck9yZ2FuaXphdGlvblJvbGVSZXNwb25zZRJFCgptZW1iZXJzaGlwGAEgASgLMjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Pcmdhbml6YXRpb25NZW1iZXJzaGlwImgKIVJlbW92ZVVzZXJGcm9tT3JnYW5pemF0aW9uUmVxdWVzdBJDCgRuYW1lGAEgASgJQjXgQQL6QS8KLWFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vT3JnYW5pemF0aW9uTWVtYmVyc2hpcCIkCiJSZW1vdmVVc2VyRnJvbU9yZ2FuaXphdGlvblJlc3BvbnNlIoYBChRMaXN0VXNlclRlYW1zUmVxdWVzdBIzCgZwYXJlbnQYASABKAlCI+BBAvpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Vc2VyEiAKCXBhZ2Vfc2l6ZRgCIAEoBUIN4EEBukgHGgUY6AcoABIXCgpwYWdlX3Rva2VuGAMgASgJQgPgQQEiiAEKFUxpc3RVc2VyVGVhbXNSZXNwb25zZRJCCgttZW1iZXJzaGlwcxgBIAMoCzItLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXNlclRlYW1NZW1iZXJzaGlwEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFInoKElVzZXJUZWFtTWVtYmVyc2hpcBIMCgR0ZWFtGAEgASgJEhkKEXRlYW1fZGlzcGxheV9uYW1lGAIgASgJEgwKBHJvbGUYAyABKAkSLQoJam9pbl90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJQChtHZXRQZXJzb25hbFRva2VuSW5mb1JlcXVlc3QSMQoEbmFtZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1VzZXIivQEKHEdldFBlcnNvbmFsVG9rZW5JbmZvUmVzcG9uc2USEAoIdG9rZW5faWQYASABKAkSMwoPbGFzdF9yb3RhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpleHBpcmVzX2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1yb3RhdGlvbl9kYXlzGAQgASgFEg8KB2VuYWJsZWQYBSABKAgiTwoaUm90YXRlUGVyc29uYWxUb2tlblJlcXVlc3QSMQoEbmFtZRgBIAEoCUIj4EEC+kEdChthaWdhdGV3YXkucmVkcGFuZGEuY29tL1VzZXIiQQobUm90YXRlUGVyc29uYWxUb2tlblJlc3BvbnNlEiIKFXBlcnNvbmFsX2FjY2Vzc190b2tlbhgBIAEoCUID4EEDIm0KGlJldmVhbFBlcnNvbmFsVG9rZW5SZXF1ZXN0EjEKBG5hbWUYASABKAlCI+BBAvpBHQobYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Vc2VyEhwKCHBhc3N3b3JkGAIgASgJQgrgQQK6SARyAhABIkEKG1JldmVhbFBlcnNvbmFsVG9rZW5SZXNwb25zZRIiChVwZXJzb25hbF9hY2Nlc3NfdG9rZW4YASABKAlCA+BBAzKvEgoLVXNlclNlcnZpY2USlgEKCkNyZWF0ZVVzZXISLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkNyZWF0ZVVzZXJSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5DcmVhdGVVc2VyUmVzcG9uc2UiK4LT5JMCJToEdXNlciIdL3YxL3twYXJlbnQ9YWNjb3VudHMvKn0vdXNlcnMShwEKB0dldFVzZXISKS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFVzZXJSZXF1ZXN0GioucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRVc2VyUmVzcG9uc2UiJYLT5JMCHxIdL3YxL3tuYW1lPWFjY291bnRzLyovdXNlcnMvKn0SjQEKCUxpc3RVc2VycxIrLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFVzZXJzUmVxdWVzdBosLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFVzZXJzUmVzcG9uc2UiJYLT5JMCHxIdL3YxL3twYXJlbnQ9YWNjb3VudHMvKn0vdXNlcnMSmwEKClVwZGF0ZVVzZXISLC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlVwZGF0ZVVzZXJSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVVc2VyUmVzcG9uc2UiMILT5JMCKjoEdXNlcjIiL3YxL3t1c2VyLm5hbWU9YWNjb3VudHMvKi91c2Vycy8qfRKQAQoKRGVsZXRlVXNlchIsLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlVXNlclJlcXVlc3QaLS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVVzZXJSZXNwb25zZSIlgtPkkwIfKh0vdjEve25hbWU9YWNjb3VudHMvKi91c2Vycy8qfRLBAQoVTGlzdFVzZXJPcmdhbml6YXRpb25zEjcucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXF1ZXN0GjgucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXNwb25zZSI1gtPkkwIvEi0vdjEve3BhcmVudD1hY2NvdW50cy8qL3VzZXJzLyp9L29yZ2FuaXphdGlvbnMSxAEKFUFkZFVzZXJUb09yZ2FuaXphdGlvbhI3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQWRkVXNlclRvT3JnYW5pemF0aW9uUmVxdWVzdBo4LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQWRkVXNlclRvT3JnYW5pemF0aW9uUmVzcG9uc2UiOILT5JMCMjoBKiItL3YxL3twYXJlbnQ9YWNjb3VudHMvKi91c2Vycy8qfS9vcmdhbml6YXRpb25zEtMBChpVcGRhdGVVc2VyT3JnYW5pemF0aW9uUm9sZRI8LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVXBkYXRlVXNlck9yZ2FuaXphdGlvblJvbGVSZXF1ZXN0Gj0ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVVc2VyT3JnYW5pemF0aW9uUm9sZVJlc3BvbnNlIjiC0+STAjI6ASoyLS92MS97bmFtZT1hY2NvdW50cy8qL3VzZXJzLyovb3JnYW5pemF0aW9ucy8qfRLQAQoaUmVtb3ZlVXNlckZyb21Pcmdhbml6YXRpb24SPC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJlbW92ZVVzZXJGcm9tT3JnYW5pemF0aW9uUmVxdWVzdBo9LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUmVtb3ZlVXNlckZyb21Pcmdhbml6YXRpb25SZXNwb25zZSI1gtPkkwIvKi0vdjEve25hbWU9YWNjb3VudHMvKi91c2Vycy8qL29yZ2FuaXphdGlvbnMvKn0SoQEKDUxpc3RVc2VyVGVhbXMSLy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RVc2VyVGVhbXNSZXF1ZXN0GjAucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5MaXN0VXNlclRlYW1zUmVzcG9uc2UiLYLT5JMCJxIlL3YxL3twYXJlbnQ9YWNjb3VudHMvKi91c2Vycy8qfS90ZWFtcxK9AQoUR2V0UGVyc29uYWxUb2tlbkluZm8SNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkdldFBlcnNvbmFsVG9rZW5JbmZvUmVxdWVzdBo3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0UGVyc29uYWxUb2tlbkluZm9SZXNwb25zZSI0gtPkkwIuEiwvdjEve25hbWU9YWNjb3VudHMvKi91c2Vycy8qfS9wZXJzb25hbC10b2tlbhLBAQoTUm90YXRlUGVyc29uYWxUb2tlbhI1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuUm90YXRlUGVyc29uYWxUb2tlblJlcXVlc3QaNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJvdGF0ZVBlcnNvbmFsVG9rZW5SZXNwb25zZSI7gtPkkwI1IjMvdjEve25hbWU9YWNjb3VudHMvKi91c2Vycy8qfS9wZXJzb25hbC10b2tlbjpyb3RhdGUSxAEKE1JldmVhbFBlcnNvbmFsVG9rZW4SNS5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlJldmVhbFBlcnNvbmFsVG9rZW5SZXF1ZXN0GjYucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5SZXZlYWxQZXJzb25hbFRva2VuUmVzcG9uc2UiPoLT5JMCODoBKiIzL3YxL3tuYW1lPWFjY291bnRzLyovdXNlcnMvKn0vcGVyc29uYWwtdG9rZW46cmV2ZWFsGhnKQRZhaWdhdGV3YXkucmVkcGFuZGEuY29tQv4BCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUIJVXNlclByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * User represents an individual user account within an account. + * Users can be members of multiple organizations within their account. + * + * @generated from message redpanda.api.aigateway.v1.User + */ +export type User = Message<"redpanda.api.aigateway.v1.User"> & { + /** + * Resource name. Format: `accounts/{account}/users/{user}` + * User ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Required: Email address (must be unique within account) + * + * @generated from field: string email = 2; + */ + email: string; + + /** + * Human-readable display name + * + * @generated from field: string display_name = 3; + */ + displayName: string; + + /** + * Optional: OIDC subject claim for auto-provisioning + * When set, this user can be automatically matched to OIDC tokens + * + * @generated from field: string oidc_subject = 4; + */ + oidcSubject: string; + + /** + * Whether this user is active + * + * @generated from field: bool enabled = 5; + */ + enabled: boolean; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 6; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 7; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 8; + */ + updateTime?: Timestamp; + + /** + * Output only. Last login timestamp + * + * @generated from field: google.protobuf.Timestamp last_login_time = 9; + */ + lastLoginTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 10; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 11; + */ + updater: string; + + /** + * Optional: Default organization context for UI + * Format: `accounts/{account}/organizations/{organization}` + * When set, this organization is pre-selected in the UI organization switcher + * + * @generated from field: string default_organization = 12; + */ + defaultOrganization: string; + + /** + * Optional: Default workspace context for UI + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * When set, this workspace is pre-selected when navigating to workspace-scoped pages + * + * @generated from field: string default_workspace = 13; + */ + defaultWorkspace: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.User. + * Use `create(UserSchema)` to create a new message. + */ +export const UserSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 0); + +/** + * OrganizationMembership represents a user's membership in an organization. + * + * @generated from message redpanda.api.aigateway.v1.OrganizationMembership + */ +export type OrganizationMembership = Message<"redpanda.api.aigateway.v1.OrganizationMembership"> & { + /** + * Resource name. Format: `accounts/{account}/users/{user}/organizations/{organization}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Reference to the organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string organization = 2; + */ + organization: string; + + /** + * Organization display name (for convenience) + * + * @generated from field: string organization_display_name = 3; + */ + organizationDisplayName: string; + + /** + * User's role in the organization: admin, member, viewer + * + * @generated from field: string role = 4; + */ + role: string; + + /** + * When the user joined the organization + * + * @generated from field: google.protobuf.Timestamp join_time = 5; + */ + joinTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.OrganizationMembership. + * Use `create(OrganizationMembershipSchema)` to create a new message. + */ +export const OrganizationMembershipSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 1); + +/** + * Request message for CreateUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateUserRequest + */ +export type CreateUserRequest = Message<"redpanda.api.aigateway.v1.CreateUserRequest"> & { + /** + * Required: Parent account. + * Format: `accounts/{account}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The user ID to use. If empty, server generates one. + * + * @generated from field: string user_id = 2; + */ + userId: string; + + /** + * Required: The user resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.User user = 3; + */ + user?: User; + + /** + * Optional: Initial organization membership. + * If provided, the user is added to this organization with the specified role. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string initial_organization = 4; + */ + initialOrganization: string; + + /** + * Role for the initial organization membership (default: "member") + * + * @generated from field: string initial_organization_role = 5; + */ + initialOrganizationRole: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateUserRequest. + * Use `create(CreateUserRequestSchema)` to create a new message. + */ +export const CreateUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 2); + +/** + * Response message for CreateUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateUserResponse + */ +export type CreateUserResponse = Message<"redpanda.api.aigateway.v1.CreateUserResponse"> & { + /** + * The created user. + * + * @generated from field: redpanda.api.aigateway.v1.User user = 1; + */ + user?: User; + + /** + * The personal access token (JWT) for this user. + * This is shown only once at creation time. The user can later reveal it + * via RevealPersonalToken (requires password re-authentication). + * Use as: Authorization: Bearer + * + * @generated from field: string personal_access_token = 2; + */ + personalAccessToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateUserResponse. + * Use `create(CreateUserResponseSchema)` to create a new message. + */ +export const CreateUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 3); + +/** + * Request message for GetUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetUserRequest + */ +export type GetUserRequest = Message<"redpanda.api.aigateway.v1.GetUserRequest"> & { + /** + * Resource name of the user. + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetUserRequest. + * Use `create(GetUserRequestSchema)` to create a new message. + */ +export const GetUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 4); + +/** + * Response message for GetUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetUserResponse + */ +export type GetUserResponse = Message<"redpanda.api.aigateway.v1.GetUserResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.User user = 1; + */ + user?: User; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetUserResponse. + * Use `create(GetUserResponseSchema)` to create a new message. + */ +export const GetUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 5); + +/** + * Request message for ListUsers RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUsersRequest + */ +export type ListUsersRequest = Message<"redpanda.api.aigateway.v1.ListUsersRequest"> & { + /** + * Required: Parent account. + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of users to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListUsers call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * Examples: + * enabled == true + * email.endsWith("@example.com") + * oidc_subject != "" + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUsersRequest. + * Use `create(ListUsersRequestSchema)` to create a new message. + */ +export const ListUsersRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 6); + +/** + * Response message for ListUsers RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUsersResponse + */ +export type ListUsersResponse = Message<"redpanda.api.aigateway.v1.ListUsersResponse"> & { + /** + * The list of users + * + * @generated from field: repeated redpanda.api.aigateway.v1.User users = 1; + */ + users: User[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching users + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUsersResponse. + * Use `create(ListUsersResponseSchema)` to create a new message. + */ +export const ListUsersResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 7); + +/** + * Request message for UpdateUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateUserRequest + */ +export type UpdateUserRequest = Message<"redpanda.api.aigateway.v1.UpdateUserRequest"> & { + /** + * Required: The user resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.User user = 1; + */ + user?: User; + + /** + * The fields to update. + * Allowed fields: email, display_name, oidc_subject, enabled, metadata, default_organization, default_workspace + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateUserRequest. + * Use `create(UpdateUserRequestSchema)` to create a new message. + */ +export const UpdateUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 8); + +/** + * Response message for UpdateUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateUserResponse + */ +export type UpdateUserResponse = Message<"redpanda.api.aigateway.v1.UpdateUserResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.User user = 1; + */ + user?: User; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateUserResponse. + * Use `create(UpdateUserResponseSchema)` to create a new message. + */ +export const UpdateUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 9); + +/** + * Request message for DeleteUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteUserRequest + */ +export type DeleteUserRequest = Message<"redpanda.api.aigateway.v1.DeleteUserRequest"> & { + /** + * Resource name of the user to delete. + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all memberships (organization and team) + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteUserRequest. + * Use `create(DeleteUserRequestSchema)` to create a new message. + */ +export const DeleteUserRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 10); + +/** + * Response message for DeleteUser RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteUserResponse + */ +export type DeleteUserResponse = Message<"redpanda.api.aigateway.v1.DeleteUserResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteUserResponse. + * Use `create(DeleteUserResponseSchema)` to create a new message. + */ +export const DeleteUserResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 11); + +/** + * Request message for ListUserOrganizations RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUserOrganizationsRequest + */ +export type ListUserOrganizationsRequest = Message<"redpanda.api.aigateway.v1.ListUserOrganizationsRequest"> & { + /** + * Required: Parent user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of memberships to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUserOrganizationsRequest. + * Use `create(ListUserOrganizationsRequestSchema)` to create a new message. + */ +export const ListUserOrganizationsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 12); + +/** + * Response message for ListUserOrganizations RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUserOrganizationsResponse + */ +export type ListUserOrganizationsResponse = Message<"redpanda.api.aigateway.v1.ListUserOrganizationsResponse"> & { + /** + * Organization memberships for this user + * + * @generated from field: repeated redpanda.api.aigateway.v1.OrganizationMembership memberships = 1; + */ + memberships: OrganizationMembership[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUserOrganizationsResponse. + * Use `create(ListUserOrganizationsResponseSchema)` to create a new message. + */ +export const ListUserOrganizationsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 13); + +/** + * Request message for AddUserToOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.AddUserToOrganizationRequest + */ +export type AddUserToOrganizationRequest = Message<"redpanda.api.aigateway.v1.AddUserToOrganizationRequest"> & { + /** + * Required: Parent user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Required: The organization to add the user to. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string organization = 2; + */ + organization: string; + + /** + * Role for the membership: admin, member, viewer (default: "member") + * + * @generated from field: string role = 3; + */ + role: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddUserToOrganizationRequest. + * Use `create(AddUserToOrganizationRequestSchema)` to create a new message. + */ +export const AddUserToOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 14); + +/** + * Response message for AddUserToOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.AddUserToOrganizationResponse + */ +export type AddUserToOrganizationResponse = Message<"redpanda.api.aigateway.v1.AddUserToOrganizationResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OrganizationMembership membership = 1; + */ + membership?: OrganizationMembership; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.AddUserToOrganizationResponse. + * Use `create(AddUserToOrganizationResponseSchema)` to create a new message. + */ +export const AddUserToOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 15); + +/** + * Request message for UpdateUserOrganizationRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateUserOrganizationRoleRequest + */ +export type UpdateUserOrganizationRoleRequest = Message<"redpanda.api.aigateway.v1.UpdateUserOrganizationRoleRequest"> & { + /** + * Required: Resource name of the membership. + * Format: `accounts/{account}/users/{user}/organizations/{organization}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Required: New role for the membership: admin, member, viewer + * + * @generated from field: string role = 2; + */ + role: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateUserOrganizationRoleRequest. + * Use `create(UpdateUserOrganizationRoleRequestSchema)` to create a new message. + */ +export const UpdateUserOrganizationRoleRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 16); + +/** + * Response message for UpdateUserOrganizationRole RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse + */ +export type UpdateUserOrganizationRoleResponse = Message<"redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.OrganizationMembership membership = 1; + */ + membership?: OrganizationMembership; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateUserOrganizationRoleResponse. + * Use `create(UpdateUserOrganizationRoleResponseSchema)` to create a new message. + */ +export const UpdateUserOrganizationRoleResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 17); + +/** + * Request message for RemoveUserFromOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.RemoveUserFromOrganizationRequest + */ +export type RemoveUserFromOrganizationRequest = Message<"redpanda.api.aigateway.v1.RemoveUserFromOrganizationRequest"> & { + /** + * Required: Resource name of the membership to remove. + * Format: `accounts/{account}/users/{user}/organizations/{organization}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveUserFromOrganizationRequest. + * Use `create(RemoveUserFromOrganizationRequestSchema)` to create a new message. + */ +export const RemoveUserFromOrganizationRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 18); + +/** + * Response message for RemoveUserFromOrganization RPC. + * + * @generated from message redpanda.api.aigateway.v1.RemoveUserFromOrganizationResponse + */ +export type RemoveUserFromOrganizationResponse = Message<"redpanda.api.aigateway.v1.RemoveUserFromOrganizationResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RemoveUserFromOrganizationResponse. + * Use `create(RemoveUserFromOrganizationResponseSchema)` to create a new message. + */ +export const RemoveUserFromOrganizationResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 19); + +/** + * Request message for ListUserTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUserTeamsRequest + */ +export type ListUserTeamsRequest = Message<"redpanda.api.aigateway.v1.ListUserTeamsRequest"> & { + /** + * Required: Parent user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of teams to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUserTeamsRequest. + * Use `create(ListUserTeamsRequestSchema)` to create a new message. + */ +export const ListUserTeamsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 20); + +/** + * Response message for ListUserTeams RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListUserTeamsResponse + */ +export type ListUserTeamsResponse = Message<"redpanda.api.aigateway.v1.ListUserTeamsResponse"> & { + /** + * Team memberships for this user + * + * @generated from field: repeated redpanda.api.aigateway.v1.UserTeamMembership memberships = 1; + */ + memberships: UserTeamMembership[]; + + /** + * Token for next page + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListUserTeamsResponse. + * Use `create(ListUserTeamsResponseSchema)` to create a new message. + */ +export const ListUserTeamsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 21); + +/** + * UserTeamMembership represents a user's membership from the user's perspective. + * Includes team details for convenience. + * + * @generated from message redpanda.api.aigateway.v1.UserTeamMembership + */ +export type UserTeamMembership = Message<"redpanda.api.aigateway.v1.UserTeamMembership"> & { + /** + * Reference to the team. + * Format: `accounts/{account}/organizations/{organization}/teams/{team}` + * + * @generated from field: string team = 1; + */ + team: string; + + /** + * Team display name (for convenience) + * + * @generated from field: string team_display_name = 2; + */ + teamDisplayName: string; + + /** + * User's role in the team + * + * @generated from field: string role = 3; + */ + role: string; + + /** + * When the user joined the team + * + * @generated from field: google.protobuf.Timestamp join_time = 4; + */ + joinTime?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UserTeamMembership. + * Use `create(UserTeamMembershipSchema)` to create a new message. + */ +export const UserTeamMembershipSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 22); + +/** + * Request message for GetPersonalTokenInfo RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPersonalTokenInfoRequest + */ +export type GetPersonalTokenInfoRequest = Message<"redpanda.api.aigateway.v1.GetPersonalTokenInfoRequest"> & { + /** + * Resource name of the user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPersonalTokenInfoRequest. + * Use `create(GetPersonalTokenInfoRequestSchema)` to create a new message. + */ +export const GetPersonalTokenInfoRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 23); + +/** + * Response message for GetPersonalTokenInfo RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse + */ +export type GetPersonalTokenInfoResponse = Message<"redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse"> & { + /** + * Truncated token ID for display (e.g., "...abc12345") + * This is the last 8 characters of the JWT ID (jti claim). + * + * @generated from field: string token_id = 1; + */ + tokenId: string; + + /** + * When the token was last rotated. + * + * @generated from field: google.protobuf.Timestamp last_rotated_at = 2; + */ + lastRotatedAt?: Timestamp; + + /** + * When the token expires and needs rotation. + * + * @generated from field: google.protobuf.Timestamp expires_at = 3; + */ + expiresAt?: Timestamp; + + /** + * Rotation period in days (admin-configurable). + * + * @generated from field: int32 rotation_days = 4; + */ + rotationDays: number; + + /** + * Whether the token is currently enabled. + * + * @generated from field: bool enabled = 5; + */ + enabled: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetPersonalTokenInfoResponse. + * Use `create(GetPersonalTokenInfoResponseSchema)` to create a new message. + */ +export const GetPersonalTokenInfoResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 24); + +/** + * Request message for RotatePersonalToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RotatePersonalTokenRequest + */ +export type RotatePersonalTokenRequest = Message<"redpanda.api.aigateway.v1.RotatePersonalTokenRequest"> & { + /** + * Resource name of the user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotatePersonalTokenRequest. + * Use `create(RotatePersonalTokenRequestSchema)` to create a new message. + */ +export const RotatePersonalTokenRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 25); + +/** + * Response message for RotatePersonalToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RotatePersonalTokenResponse + */ +export type RotatePersonalTokenResponse = Message<"redpanda.api.aigateway.v1.RotatePersonalTokenResponse"> & { + /** + * The new personal access token (JWT). + * This is shown only once. Store it securely. + * Use as: Authorization: Bearer + * + * @generated from field: string personal_access_token = 1; + */ + personalAccessToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RotatePersonalTokenResponse. + * Use `create(RotatePersonalTokenResponseSchema)` to create a new message. + */ +export const RotatePersonalTokenResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 26); + +/** + * Request message for RevealPersonalToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RevealPersonalTokenRequest + */ +export type RevealPersonalTokenRequest = Message<"redpanda.api.aigateway.v1.RevealPersonalTokenRequest"> & { + /** + * Resource name of the user. + * Format: `accounts/{account}/users/{user}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * User's password for re-authentication. + * Required to reveal the token for security. + * + * @generated from field: string password = 2; + */ + password: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RevealPersonalTokenRequest. + * Use `create(RevealPersonalTokenRequestSchema)` to create a new message. + */ +export const RevealPersonalTokenRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 27); + +/** + * Response message for RevealPersonalToken RPC. + * + * @generated from message redpanda.api.aigateway.v1.RevealPersonalTokenResponse + */ +export type RevealPersonalTokenResponse = Message<"redpanda.api.aigateway.v1.RevealPersonalTokenResponse"> & { + /** + * The full personal access token (JWT). + * Use as: Authorization: Bearer + * + * @generated from field: string personal_access_token = 1; + */ + personalAccessToken: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.RevealPersonalTokenResponse. + * Use `create(RevealPersonalTokenResponseSchema)` to create a new message. + */ +export const RevealPersonalTokenResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_user, 28); + +/** + * UserService manages users within accounts. + * Users represent individual accounts that can authenticate and access resources. + * Users belong to accounts and have memberships in organizations. + * Resource name: accounts/{account_id}/users/{user_id} + * + * @generated from service redpanda.api.aigateway.v1.UserService + */ +export const UserService: GenService<{ + /** + * Creates a new user within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.CreateUser + */ + createUser: { + methodKind: "unary"; + input: typeof CreateUserRequestSchema; + output: typeof CreateUserResponseSchema; + }, + /** + * Gets a user by name. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.GetUser + */ + getUser: { + methodKind: "unary"; + input: typeof GetUserRequestSchema; + output: typeof GetUserResponseSchema; + }, + /** + * Lists users within an account. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUsers + */ + listUsers: { + methodKind: "unary"; + input: typeof ListUsersRequestSchema; + output: typeof ListUsersResponseSchema; + }, + /** + * Updates a user. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.UpdateUser + */ + updateUser: { + methodKind: "unary"; + input: typeof UpdateUserRequestSchema; + output: typeof UpdateUserResponseSchema; + }, + /** + * Deletes a user. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.DeleteUser + */ + deleteUser: { + methodKind: "unary"; + input: typeof DeleteUserRequestSchema; + output: typeof DeleteUserResponseSchema; + }, + /** + * Lists organizations that a user belongs to. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUserOrganizations + */ + listUserOrganizations: { + methodKind: "unary"; + input: typeof ListUserOrganizationsRequestSchema; + output: typeof ListUserOrganizationsResponseSchema; + }, + /** + * Adds a user to an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.AddUserToOrganization + */ + addUserToOrganization: { + methodKind: "unary"; + input: typeof AddUserToOrganizationRequestSchema; + output: typeof AddUserToOrganizationResponseSchema; + }, + /** + * Updates a user's role in an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.UpdateUserOrganizationRole + */ + updateUserOrganizationRole: { + methodKind: "unary"; + input: typeof UpdateUserOrganizationRoleRequestSchema; + output: typeof UpdateUserOrganizationRoleResponseSchema; + }, + /** + * Removes a user from an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RemoveUserFromOrganization + */ + removeUserFromOrganization: { + methodKind: "unary"; + input: typeof RemoveUserFromOrganizationRequestSchema; + output: typeof RemoveUserFromOrganizationResponseSchema; + }, + /** + * Lists teams that a user belongs to. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.ListUserTeams + */ + listUserTeams: { + methodKind: "unary"; + input: typeof ListUserTeamsRequestSchema; + output: typeof ListUserTeamsResponseSchema; + }, + /** + * Gets information about a user's personal access token (non-secret info only). + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.GetPersonalTokenInfo + */ + getPersonalTokenInfo: { + methodKind: "unary"; + input: typeof GetPersonalTokenInfoRequestSchema; + output: typeof GetPersonalTokenInfoResponseSchema; + }, + /** + * Rotates a user's personal access token. + * The old token is invalidated and a new one is generated. + * The new token is returned only once and should be stored securely. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RotatePersonalToken + */ + rotatePersonalToken: { + methodKind: "unary"; + input: typeof RotatePersonalTokenRequestSchema; + output: typeof RotatePersonalTokenResponseSchema; + }, + /** + * Reveals the user's personal access token. + * Requires re-authentication with the user's password for security. + * + * @generated from rpc redpanda.api.aigateway.v1.UserService.RevealPersonalToken + */ + revealPersonalToken: { + methodKind: "unary"; + input: typeof RevealPersonalTokenRequestSchema; + output: typeof RevealPersonalTokenResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_user, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata-VisualMetadataService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata-VisualMetadataService_connectquery.ts new file mode 100644 index 0000000000..7c2c6594fc --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata-VisualMetadataService_connectquery.ts @@ -0,0 +1,27 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/visual_metadata.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { VisualMetadataService } from "./visual_metadata_pb"; + +/** + * Gets visual metadata for a gateway (optionally for a specific user). + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata + */ +export const getVisualMetadata = VisualMetadataService.method.getVisualMetadata; + +/** + * Creates or updates visual metadata for a gateway. + * Uses upsert semantics - creates if not exists, updates if exists. + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata + */ +export const saveVisualMetadata = VisualMetadataService.method.saveVisualMetadata; + +/** + * Deletes visual metadata for a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata + */ +export const deleteVisualMetadata = VisualMetadataService.method.deleteVisualMetadata; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata_pb.ts new file mode 100644 index 0000000000..d6a89f134b --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/visual_metadata_pb.ts @@ -0,0 +1,323 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/visual_metadata.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/visual_metadata.proto. + */ +export const file_redpanda_api_aigateway_v1_visual_metadata: GenFile = /*@__PURE__*/ + fileDesc("Ci9yZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3Zpc3VhbF9tZXRhZGF0YS5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSJGChhHZXRWaXN1YWxNZXRhZGF0YVJlcXVlc3QSGQoMZ2F0ZXdheV9uYW1lGAEgASgJQgPgQQISDwoHdXNlcl9pZBgCIAEoCSJfChlHZXRWaXN1YWxNZXRhZGF0YVJlc3BvbnNlEkIKD3Zpc3VhbF9tZXRhZGF0YRgBIAEoCzIpLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVmlzdWFsTWV0YWRhdGEi5wEKGVNhdmVWaXN1YWxNZXRhZGF0YVJlcXVlc3QSGQoMZ2F0ZXdheV9uYW1lGAEgASgJQgPgQQISDwoHdXNlcl9pZBgCIAEoCRI0Cg5ub2RlX3Bvc2l0aW9ucxgDIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RCA+BBAhI6Cgh2aWV3cG9ydBgEIAEoCzIjLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuVmlld3BvcnRCA+BBAhIsCgt1aV9zZXR0aW5ncxgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QiYAoaU2F2ZVZpc3VhbE1ldGFkYXRhUmVzcG9uc2USQgoPdmlzdWFsX21ldGFkYXRhGAEgASgLMikucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5WaXN1YWxNZXRhZGF0YSJJChtEZWxldGVWaXN1YWxNZXRhZGF0YVJlcXVlc3QSGQoMZ2F0ZXdheV9uYW1lGAEgASgJQgPgQQISDwoHdXNlcl9pZBgCIAEoCSIeChxEZWxldGVWaXN1YWxNZXRhZGF0YVJlc3BvbnNlIq0CCg5WaXN1YWxNZXRhZGF0YRIUCgxnYXRld2F5X25hbWUYASABKAkSDwoHdXNlcl9pZBgCIAEoCRIvCg5ub2RlX3Bvc2l0aW9ucxgDIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSNQoIdmlld3BvcnQYBCABKAsyIy5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLlZpZXdwb3J0EiwKC3VpX3NldHRpbmdzGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIuCgpjcmVhdGVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIuCghWaWV3cG9ydBIJCgF4GAEgASgBEgkKAXkYAiABKAESDAoEem9vbRgDIAEoATLjBAoVVmlzdWFsTWV0YWRhdGFTZXJ2aWNlErMBChFHZXRWaXN1YWxNZXRhZGF0YRIzLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuR2V0VmlzdWFsTWV0YWRhdGFSZXF1ZXN0GjQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRWaXN1YWxNZXRhZGF0YVJlc3BvbnNlIjOC0+STAi0SKy92MS9nYXRld2F5cy97Z2F0ZXdheV9uYW1lfS92aXN1YWwtbWV0YWRhdGESuQEKElNhdmVWaXN1YWxNZXRhZGF0YRI0LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU2F2ZVZpc3VhbE1ldGFkYXRhUmVxdWVzdBo1LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuU2F2ZVZpc3VhbE1ldGFkYXRhUmVzcG9uc2UiNoLT5JMCMDoBKhorL3YxL2dhdGV3YXlzL3tnYXRld2F5X25hbWV9L3Zpc3VhbC1tZXRhZGF0YRK8AQoURGVsZXRlVmlzdWFsTWV0YWRhdGESNi5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkRlbGV0ZVZpc3VhbE1ldGFkYXRhUmVxdWVzdBo3LnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuRGVsZXRlVmlzdWFsTWV0YWRhdGFSZXNwb25zZSIzgtPkkwItKisvdjEvZ2F0ZXdheXMve2dhdGV3YXlfbmFtZX0vdmlzdWFsLW1ldGFkYXRhGhnKQRZhaWdhdGV3YXkucmVkcGFuZGEuY29tQogCCh1jb20ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MUITVmlzdWFsTWV0YWRhdGFQcm90b1ABWktnby5wYW5kYS5kZXYvcmVkcGFuZGEtYWlndy9wcm90b3MvZ2VuL3JlZHBhbmRhL2FwaS9haWdhdGV3YXkvdjE7YWlnYXRld2F5djGiAgNSQUGqAhlSZWRwYW5kYS5BcGkuQWlnYXRld2F5LlYxygIZUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMeICJVJlZHBhbmRhXEFwaVxBaWdhdGV3YXlcVjFcR1BCTWV0YWRhdGHqAhxSZWRwYW5kYTo6QXBpOjpBaWdhdGV3YXk6OlYxYgZwcm90bzM", [file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_protobuf_struct, file_google_protobuf_timestamp]); + +/** + * Request message for GetVisualMetadata RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetVisualMetadataRequest + */ +export type GetVisualMetadataRequest = Message<"redpanda.api.aigateway.v1.GetVisualMetadataRequest"> & { + /** + * Required: Gateway name (e.g., "my-gateway") + * + * @generated from field: string gateway_name = 1; + */ + gatewayName: string; + + /** + * Optional: User ID for user-specific layout. + * If not provided, returns the shared/default layout. + * + * @generated from field: string user_id = 2; + */ + userId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetVisualMetadataRequest. + * Use `create(GetVisualMetadataRequestSchema)` to create a new message. + */ +export const GetVisualMetadataRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 0); + +/** + * Response message for GetVisualMetadata RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetVisualMetadataResponse + */ +export type GetVisualMetadataResponse = Message<"redpanda.api.aigateway.v1.GetVisualMetadataResponse"> & { + /** + * The visual metadata, or null if none exists. + * + * @generated from field: redpanda.api.aigateway.v1.VisualMetadata visual_metadata = 1; + */ + visualMetadata?: VisualMetadata; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetVisualMetadataResponse. + * Use `create(GetVisualMetadataResponseSchema)` to create a new message. + */ +export const GetVisualMetadataResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 1); + +/** + * Request message for SaveVisualMetadata RPC. + * + * @generated from message redpanda.api.aigateway.v1.SaveVisualMetadataRequest + */ +export type SaveVisualMetadataRequest = Message<"redpanda.api.aigateway.v1.SaveVisualMetadataRequest"> & { + /** + * Required: Gateway name (e.g., "my-gateway") + * + * @generated from field: string gateway_name = 1; + */ + gatewayName: string; + + /** + * Optional: User ID for user-specific layout. + * If not provided, saves as shared/default layout. + * + * @generated from field: string user_id = 2; + */ + userId: string; + + /** + * Required: Node positions as JSON object mapping node IDs to {x, y}. + * Example: {"rate-limit-default": {"x": 100, "y": 200}} + * + * @generated from field: google.protobuf.Struct node_positions = 3; + */ + nodePositions?: JsonObject; + + /** + * Required: Viewport state with x, y offset and zoom level. + * + * @generated from field: redpanda.api.aigateway.v1.Viewport viewport = 4; + */ + viewport?: Viewport; + + /** + * Optional: Additional UI settings (minimap visible, etc.) + * + * @generated from field: google.protobuf.Struct ui_settings = 5; + */ + uiSettings?: JsonObject; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SaveVisualMetadataRequest. + * Use `create(SaveVisualMetadataRequestSchema)` to create a new message. + */ +export const SaveVisualMetadataRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 2); + +/** + * Response message for SaveVisualMetadata RPC. + * + * @generated from message redpanda.api.aigateway.v1.SaveVisualMetadataResponse + */ +export type SaveVisualMetadataResponse = Message<"redpanda.api.aigateway.v1.SaveVisualMetadataResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.VisualMetadata visual_metadata = 1; + */ + visualMetadata?: VisualMetadata; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.SaveVisualMetadataResponse. + * Use `create(SaveVisualMetadataResponseSchema)` to create a new message. + */ +export const SaveVisualMetadataResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 3); + +/** + * Request message for DeleteVisualMetadata RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteVisualMetadataRequest + */ +export type DeleteVisualMetadataRequest = Message<"redpanda.api.aigateway.v1.DeleteVisualMetadataRequest"> & { + /** + * Required: Gateway name (e.g., "my-gateway") + * + * @generated from field: string gateway_name = 1; + */ + gatewayName: string; + + /** + * Optional: User ID for user-specific layout. + * If not provided, deletes the shared/default layout. + * + * @generated from field: string user_id = 2; + */ + userId: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteVisualMetadataRequest. + * Use `create(DeleteVisualMetadataRequestSchema)` to create a new message. + */ +export const DeleteVisualMetadataRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 4); + +/** + * Response message for DeleteVisualMetadata RPC. + * + * Empty response on success. + * + * @generated from message redpanda.api.aigateway.v1.DeleteVisualMetadataResponse + */ +export type DeleteVisualMetadataResponse = Message<"redpanda.api.aigateway.v1.DeleteVisualMetadataResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteVisualMetadataResponse. + * Use `create(DeleteVisualMetadataResponseSchema)` to create a new message. + */ +export const DeleteVisualMetadataResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 5); + +/** + * VisualMetadata represents the visual editor state for a gateway. + * + * @generated from message redpanda.api.aigateway.v1.VisualMetadata + */ +export type VisualMetadata = Message<"redpanda.api.aigateway.v1.VisualMetadata"> & { + /** + * Gateway name this metadata belongs to. + * + * @generated from field: string gateway_name = 1; + */ + gatewayName: string; + + /** + * User ID if this is a user-specific layout, empty for shared layout. + * + * @generated from field: string user_id = 2; + */ + userId: string; + + /** + * Node positions as JSON object mapping node IDs to {x, y} coordinates. + * + * @generated from field: google.protobuf.Struct node_positions = 3; + */ + nodePositions?: JsonObject; + + /** + * Viewport state. + * + * @generated from field: redpanda.api.aigateway.v1.Viewport viewport = 4; + */ + viewport?: Viewport; + + /** + * Additional UI settings. + * + * @generated from field: google.protobuf.Struct ui_settings = 5; + */ + uiSettings?: JsonObject; + + /** + * Timestamps. + * + * @generated from field: google.protobuf.Timestamp created_at = 10; + */ + createdAt?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp updated_at = 11; + */ + updatedAt?: Timestamp; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.VisualMetadata. + * Use `create(VisualMetadataSchema)` to create a new message. + */ +export const VisualMetadataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 6); + +/** + * Viewport represents the visual editor viewport state. + * + * @generated from message redpanda.api.aigateway.v1.Viewport + */ +export type Viewport = Message<"redpanda.api.aigateway.v1.Viewport"> & { + /** + * X offset of the viewport. + * + * @generated from field: double x = 1; + */ + x: number; + + /** + * Y offset of the viewport. + * + * @generated from field: double y = 2; + */ + y: number; + + /** + * Zoom level (1.0 = 100%). + * + * @generated from field: double zoom = 3; + */ + zoom: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Viewport. + * Use `create(ViewportSchema)` to create a new message. + */ +export const ViewportSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_visual_metadata, 7); + +/** + * VisualMetadataService manages UI-specific visual editor state. + * This is purely a UI concern and is kept separate from gateway configuration. + * Stores node positions, viewport state, and UI preferences for the visual editor. + * + * @generated from service redpanda.api.aigateway.v1.VisualMetadataService + */ +export const VisualMetadataService: GenService<{ + /** + * Gets visual metadata for a gateway (optionally for a specific user). + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.GetVisualMetadata + */ + getVisualMetadata: { + methodKind: "unary"; + input: typeof GetVisualMetadataRequestSchema; + output: typeof GetVisualMetadataResponseSchema; + }, + /** + * Creates or updates visual metadata for a gateway. + * Uses upsert semantics - creates if not exists, updates if exists. + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.SaveVisualMetadata + */ + saveVisualMetadata: { + methodKind: "unary"; + input: typeof SaveVisualMetadataRequestSchema; + output: typeof SaveVisualMetadataResponseSchema; + }, + /** + * Deletes visual metadata for a gateway. + * + * @generated from rpc redpanda.api.aigateway.v1.VisualMetadataService.DeleteVisualMetadata + */ + deleteVisualMetadata: { + methodKind: "unary"; + input: typeof DeleteVisualMetadataRequestSchema; + output: typeof DeleteVisualMetadataResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_visual_metadata, 0); + diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/workspace-WorkspaceService_connectquery.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/workspace-WorkspaceService_connectquery.ts new file mode 100644 index 0000000000..17560690d0 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/workspace-WorkspaceService_connectquery.ts @@ -0,0 +1,40 @@ +// @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/aigateway/v1/workspace.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import { WorkspaceService } from "./workspace_pb"; + +/** + * Creates a new workspace within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace + */ +export const createWorkspace = WorkspaceService.method.createWorkspace; + +/** + * Gets a workspace by name. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace + */ +export const getWorkspace = WorkspaceService.method.getWorkspace; + +/** + * Lists workspaces within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces + */ +export const listWorkspaces = WorkspaceService.method.listWorkspaces; + +/** + * Updates a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace + */ +export const updateWorkspace = WorkspaceService.method.updateWorkspace; + +/** + * Deletes a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace + */ +export const deleteWorkspace = WorkspaceService.method.deleteWorkspace; diff --git a/frontend/src/protogen/redpanda/api/aigateway/v1/workspace_pb.ts b/frontend/src/protogen/redpanda/api/aigateway/v1/workspace_pb.ts new file mode 100644 index 0000000000..f2e41d6fb1 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/aigateway/v1/workspace_pb.ts @@ -0,0 +1,435 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/aigateway/v1/workspace.proto (package redpanda.api.aigateway.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1"; +import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb"; +import { file_google_api_annotations } from "../../../../google/api/annotations_pb"; +import { file_google_api_client } from "../../../../google/api/client_pb"; +import { file_google_api_field_behavior } from "../../../../google/api/field_behavior_pb"; +import { file_google_api_resource } from "../../../../google/api/resource_pb"; +import type { FieldMask, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/aigateway/v1/workspace.proto. + */ +export const file_redpanda_api_aigateway_v1_workspace: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvYWlnYXRld2F5L3YxL3dvcmtzcGFjZS5wcm90bxIZcmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MSLsAwoJV29ya3NwYWNlEhEKBG5hbWUYASABKAlCA+BBCBIjCgxkaXNwbGF5X25hbWUYAiABKAlCDeBBArpIB3IFEAEY/wESGAoLZGVzY3JpcHRpb24YAyABKAlCA+BBARIPCgdlbmFibGVkGAQgASgIEkQKCG1ldGFkYXRhGAUgAygLMjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Xb3Jrc3BhY2UuTWV0YWRhdGFFbnRyeRI0CgtjcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI0Cgt1cGRhdGVfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIUCgdjcmVhdG9yGAggASgJQgPgQQMSFAoHdXBkYXRlchgJIAEoCUID4EEDGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ATpt6kFqCiBhaWdhdGV3YXkucmVkcGFuZGEuY29tL1dvcmtzcGFjZRJGYWNjb3VudHMve2FjY291bnR9L29yZ2FuaXphdGlvbnMve29yZ2FuaXphdGlvbn0vd29ya3NwYWNlcy97d29ya3NwYWNlfSKuAQoWQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBI7CgZwYXJlbnQYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb24SGQoMd29ya3NwYWNlX2lkGAIgASgJQgPgQQESPAoJd29ya3NwYWNlGAMgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Xb3Jrc3BhY2VCA+BBAiJSChdDcmVhdGVXb3Jrc3BhY2VSZXNwb25zZRI3Cgl3b3Jrc3BhY2UYASABKAsyJC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLldvcmtzcGFjZSJNChNHZXRXb3Jrc3BhY2VSZXF1ZXN0EjYKBG5hbWUYASABKAlCKOBBAvpBIgogYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Xb3Jrc3BhY2UiTwoUR2V0V29ya3NwYWNlUmVzcG9uc2USNwoJd29ya3NwYWNlGAEgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Xb3Jrc3BhY2UiuwEKFUxpc3RXb3Jrc3BhY2VzUmVxdWVzdBI7CgZwYXJlbnQYASABKAlCK+BBAvpBJQojYWlnYXRld2F5LnJlZHBhbmRhLmNvbS9Pcmdhbml6YXRpb24SIAoJcGFnZV9zaXplGAIgASgFQg3gQQG6SAcaBRjoBygAEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBARITCgZmaWx0ZXIYBCABKAlCA+BBARIVCghvcmRlcl9ieRgFIAEoCUID4EEBIn8KFkxpc3RXb3Jrc3BhY2VzUmVzcG9uc2USOAoKd29ya3NwYWNlcxgBIAMoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuV29ya3NwYWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgp0b3RhbF9zaXplGAMgASgFIowBChZVcGRhdGVXb3Jrc3BhY2VSZXF1ZXN0EjwKCXdvcmtzcGFjZRgBIAEoCzIkLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuV29ya3NwYWNlQgPgQQISNAoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgPgQQEiUgoXVXBkYXRlV29ya3NwYWNlUmVzcG9uc2USNwoJd29ya3NwYWNlGAEgASgLMiQucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5Xb3Jrc3BhY2UiZAoWRGVsZXRlV29ya3NwYWNlUmVxdWVzdBI2CgRuYW1lGAEgASgJQijgQQL6QSIKIGFpZ2F0ZXdheS5yZWRwYW5kYS5jb20vV29ya3NwYWNlEhIKBWZvcmNlGAIgASgIQgPgQQEiGQoXRGVsZXRlV29ya3NwYWNlUmVzcG9uc2Uy1AcKEFdvcmtzcGFjZVNlcnZpY2USvwEKD0NyZWF0ZVdvcmtzcGFjZRIxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBoyLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuQ3JlYXRlV29ya3NwYWNlUmVzcG9uc2UiRYLT5JMCPzoJd29ya3NwYWNlIjIvdjEve3BhcmVudD1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKn0vd29ya3NwYWNlcxKrAQoMR2V0V29ya3NwYWNlEi4ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gi8ucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5HZXRXb3Jrc3BhY2VSZXNwb25zZSI6gtPkkwI0EjIvdjEve25hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovd29ya3NwYWNlcy8qfRKxAQoOTGlzdFdvcmtzcGFjZXMSMC5yZWRwYW5kYS5hcGkuYWlnYXRld2F5LnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjEuTGlzdFdvcmtzcGFjZXNSZXNwb25zZSI6gtPkkwI0EjIvdjEve3BhcmVudD1hY2NvdW50cy8qL29yZ2FuaXphdGlvbnMvKn0vd29ya3NwYWNlcxLJAQoPVXBkYXRlV29ya3NwYWNlEjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVXb3Jrc3BhY2VSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5VcGRhdGVXb3Jrc3BhY2VSZXNwb25zZSJPgtPkkwJJOgl3b3Jrc3BhY2UyPC92MS97d29ya3NwYWNlLm5hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovd29ya3NwYWNlcy8qfRK0AQoPRGVsZXRlV29ya3NwYWNlEjEucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVXb3Jrc3BhY2VSZXF1ZXN0GjIucmVkcGFuZGEuYXBpLmFpZ2F0ZXdheS52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSI6gtPkkwI0KjIvdjEve25hbWU9YWNjb3VudHMvKi9vcmdhbml6YXRpb25zLyovd29ya3NwYWNlcy8qfRoZykEWYWlnYXRld2F5LnJlZHBhbmRhLmNvbUKDAgodY29tLnJlZHBhbmRhLmFwaS5haWdhdGV3YXkudjFCDldvcmtzcGFjZVByb3RvUAFaS2dvLnBhbmRhLmRldi9yZWRwYW5kYS1haWd3L3Byb3Rvcy9nZW4vcmVkcGFuZGEvYXBpL2FpZ2F0ZXdheS92MTthaWdhdGV3YXl2MaICA1JBQaoCGVJlZHBhbmRhLkFwaS5BaWdhdGV3YXkuVjHKAhlSZWRwYW5kYVxBcGlcQWlnYXRld2F5XFYx4gIlUmVkcGFuZGFcQXBpXEFpZ2F0ZXdheVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkFpZ2F0ZXdheTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + +/** + * Workspace represents a grouping for gateways within an organization. + * Each gateway belongs to exactly one workspace. + * + * @generated from message redpanda.api.aigateway.v1.Workspace + */ +export type Workspace = Message<"redpanda.api.aigateway.v1.Workspace"> & { + /** + * Resource name. Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * Workspace ID is a globally unique, sortable identifier (XID). + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * Human-readable display name (must be unique within organization) + * + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * Optional description + * + * @generated from field: string description = 3; + */ + description: string; + + /** + * Whether this workspace is active + * + * @generated from field: bool enabled = 4; + */ + enabled: boolean; + + /** + * Metadata for arbitrary key-value pairs + * + * @generated from field: map metadata = 5; + */ + metadata: { [key: string]: string }; + + /** + * Output only. Creation timestamp + * + * @generated from field: google.protobuf.Timestamp create_time = 6; + */ + createTime?: Timestamp; + + /** + * Output only. Last update timestamp + * + * @generated from field: google.protobuf.Timestamp update_time = 7; + */ + updateTime?: Timestamp; + + /** + * Output only. Creator (API key or OIDC subject) + * + * @generated from field: string creator = 8; + */ + creator: string; + + /** + * Output only. Last updater (API key or OIDC subject) + * + * @generated from field: string updater = 9; + */ + updater: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.Workspace. + * Use `create(WorkspaceSchema)` to create a new message. + */ +export const WorkspaceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 0); + +/** + * Request message for CreateWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateWorkspaceRequest + */ +export type CreateWorkspaceRequest = Message<"redpanda.api.aigateway.v1.CreateWorkspaceRequest"> & { + /** + * Required: Parent organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * The workspace ID to use. If empty, server generates one. + * Must be a valid XID if provided. + * + * @generated from field: string workspace_id = 2; + */ + workspaceId: string; + + /** + * Required: The workspace resource to create. + * + * @generated from field: redpanda.api.aigateway.v1.Workspace workspace = 3; + */ + workspace?: Workspace; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateWorkspaceRequest. + * Use `create(CreateWorkspaceRequestSchema)` to create a new message. + */ +export const CreateWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 1); + +/** + * Response message for CreateWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.CreateWorkspaceResponse + */ +export type CreateWorkspaceResponse = Message<"redpanda.api.aigateway.v1.CreateWorkspaceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Workspace workspace = 1; + */ + workspace?: Workspace; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.CreateWorkspaceResponse. + * Use `create(CreateWorkspaceResponseSchema)` to create a new message. + */ +export const CreateWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 2); + +/** + * Request message for GetWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetWorkspaceRequest + */ +export type GetWorkspaceRequest = Message<"redpanda.api.aigateway.v1.GetWorkspaceRequest"> & { + /** + * Resource name of the workspace. + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetWorkspaceRequest. + * Use `create(GetWorkspaceRequestSchema)` to create a new message. + */ +export const GetWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 3); + +/** + * Response message for GetWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.GetWorkspaceResponse + */ +export type GetWorkspaceResponse = Message<"redpanda.api.aigateway.v1.GetWorkspaceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Workspace workspace = 1; + */ + workspace?: Workspace; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.GetWorkspaceResponse. + * Use `create(GetWorkspaceResponseSchema)` to create a new message. + */ +export const GetWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 4); + +/** + * Request message for ListWorkspaces RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListWorkspacesRequest + */ +export type ListWorkspacesRequest = Message<"redpanda.api.aigateway.v1.ListWorkspacesRequest"> & { + /** + * Required: Parent organization. + * Format: `accounts/{account}/organizations/{organization}` + * + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * Maximum number of workspaces to return (max 1000) + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Page token from a previous ListWorkspaces call + * + * @generated from field: string page_token = 3; + */ + pageToken: string; + + /** + * Filter expression (CEL syntax) + * + * @generated from field: string filter = 4; + */ + filter: string; + + /** + * Comma-separated list of fields to order by + * + * @generated from field: string order_by = 5; + */ + orderBy: string; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListWorkspacesRequest. + * Use `create(ListWorkspacesRequestSchema)` to create a new message. + */ +export const ListWorkspacesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 5); + +/** + * Response message for ListWorkspaces RPC. + * + * @generated from message redpanda.api.aigateway.v1.ListWorkspacesResponse + */ +export type ListWorkspacesResponse = Message<"redpanda.api.aigateway.v1.ListWorkspacesResponse"> & { + /** + * The list of workspaces + * + * @generated from field: repeated redpanda.api.aigateway.v1.Workspace workspaces = 1; + */ + workspaces: Workspace[]; + + /** + * Token for next page (empty if no more pages) + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; + + /** + * Total count of matching workspaces + * + * @generated from field: int32 total_size = 3; + */ + totalSize: number; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.ListWorkspacesResponse. + * Use `create(ListWorkspacesResponseSchema)` to create a new message. + */ +export const ListWorkspacesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 6); + +/** + * Request message for UpdateWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateWorkspaceRequest + */ +export type UpdateWorkspaceRequest = Message<"redpanda.api.aigateway.v1.UpdateWorkspaceRequest"> & { + /** + * Required: The workspace resource to update. + * + * @generated from field: redpanda.api.aigateway.v1.Workspace workspace = 1; + */ + workspace?: Workspace; + + /** + * The fields to update. + * Allowed fields: display_name, description, enabled, metadata + * + * @generated from field: google.protobuf.FieldMask update_mask = 2; + */ + updateMask?: FieldMask; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateWorkspaceRequest. + * Use `create(UpdateWorkspaceRequestSchema)` to create a new message. + */ +export const UpdateWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 7); + +/** + * Response message for UpdateWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.UpdateWorkspaceResponse + */ +export type UpdateWorkspaceResponse = Message<"redpanda.api.aigateway.v1.UpdateWorkspaceResponse"> & { + /** + * @generated from field: redpanda.api.aigateway.v1.Workspace workspace = 1; + */ + workspace?: Workspace; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.UpdateWorkspaceResponse. + * Use `create(UpdateWorkspaceResponseSchema)` to create a new message. + */ +export const UpdateWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 8); + +/** + * Request message for DeleteWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteWorkspaceRequest + */ +export type DeleteWorkspaceRequest = Message<"redpanda.api.aigateway.v1.DeleteWorkspaceRequest"> & { + /** + * Resource name of the workspace to delete. + * Format: `accounts/{account}/organizations/{organization}/workspaces/{workspace}` + * + * @generated from field: string name = 1; + */ + name: string; + + /** + * If true, cascade delete all child resources (gateways, etc.) + * + * @generated from field: bool force = 2; + */ + force: boolean; +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteWorkspaceRequest. + * Use `create(DeleteWorkspaceRequestSchema)` to create a new message. + */ +export const DeleteWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 9); + +/** + * Response message for DeleteWorkspace RPC. + * + * @generated from message redpanda.api.aigateway.v1.DeleteWorkspaceResponse + */ +export type DeleteWorkspaceResponse = Message<"redpanda.api.aigateway.v1.DeleteWorkspaceResponse"> & { +}; + +/** + * Describes the message redpanda.api.aigateway.v1.DeleteWorkspaceResponse. + * Use `create(DeleteWorkspaceResponseSchema)` to create a new message. + */ +export const DeleteWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_aigateway_v1_workspace, 10); + +/** + * WorkspaceService manages workspaces within organizations. + * A workspace is a grouping for gateways within an organization. + * Resource name: accounts/{account_id}/organizations/{organization_id}/workspaces/{workspace_id} + * + * @generated from service redpanda.api.aigateway.v1.WorkspaceService + */ +export const WorkspaceService: GenService<{ + /** + * Creates a new workspace within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.CreateWorkspace + */ + createWorkspace: { + methodKind: "unary"; + input: typeof CreateWorkspaceRequestSchema; + output: typeof CreateWorkspaceResponseSchema; + }, + /** + * Gets a workspace by name. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.GetWorkspace + */ + getWorkspace: { + methodKind: "unary"; + input: typeof GetWorkspaceRequestSchema; + output: typeof GetWorkspaceResponseSchema; + }, + /** + * Lists workspaces within an organization. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.ListWorkspaces + */ + listWorkspaces: { + methodKind: "unary"; + input: typeof ListWorkspacesRequestSchema; + output: typeof ListWorkspacesResponseSchema; + }, + /** + * Updates a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.UpdateWorkspace + */ + updateWorkspace: { + methodKind: "unary"; + input: typeof UpdateWorkspaceRequestSchema; + output: typeof UpdateWorkspaceResponseSchema; + }, + /** + * Deletes a workspace. + * + * @generated from rpc redpanda.api.aigateway.v1.WorkspaceService.DeleteWorkspace + */ + deleteWorkspace: { + methodKind: "unary"; + input: typeof DeleteWorkspaceRequestSchema; + output: typeof DeleteWorkspaceResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_redpanda_api_aigateway_v1_workspace, 0); + diff --git a/frontend/src/react-query/api/ai-gateway.tsx b/frontend/src/react-query/api/ai-gateway.tsx new file mode 100644 index 0000000000..6cb651fabd --- /dev/null +++ b/frontend/src/react-query/api/ai-gateway.tsx @@ -0,0 +1,114 @@ +import { create } from '@bufbuild/protobuf'; +import type { GenMessage } from '@bufbuild/protobuf/codegenv1'; +import type { ConnectError } from '@connectrpc/connect'; +import { useQuery } from '@connectrpc/connect-query'; +import type { UseQueryResult } from '@tanstack/react-query'; +import { useAIGatewayTransport } from 'hooks/use-ai-gateway-transport'; +import { + type ListGatewaysRequest, + ListGatewaysRequestSchema, + type ListGatewaysResponse, +} from 'protogen/redpanda/api/aigateway/v1/gateway_pb'; +import { + type ListModelProvidersRequest, + ListModelProvidersRequestSchema, + type ListModelProvidersResponse, +} from 'protogen/redpanda/api/aigateway/v1/model_providers_pb'; +import { + type ListModelsRequest, + ListModelsRequestSchema, + type ListModelsResponse, +} from 'protogen/redpanda/api/aigateway/v1/models_pb'; +import { listGateways } from 'protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery'; +import { listModelProviders } from 'protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery'; +import { listModels } from 'protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery'; +import type { MessageInit, QueryOptions } from 'react-query/react-query.utils'; + +const AI_GATEWAY_DEFAULT_PAGE_SIZE = 50; + +/** + * Hook to list AI Gateways using the AI Gateway v1 API + * Creates its own AI Gateway transport pointing to: /.redpanda/api/ + * Dev server proxies /.redpanda/api/redpanda.aigateway.v1 to AI Gateway service + */ +export const useListGatewaysQuery = ( + input?: MessageInit, + options?: QueryOptions, ListGatewaysResponse> +): UseQueryResult => { + const transport = useAIGatewayTransport(); + + const listGatewaysRequest = create(ListGatewaysRequestSchema, { + parent: input?.parent ?? '', + pageToken: input?.pageToken ?? '', + pageSize: input?.pageSize ?? AI_GATEWAY_DEFAULT_PAGE_SIZE, + }); + + return useQuery(listGateways, listGatewaysRequest, { + enabled: options?.enabled, + transport, + staleTime: 60000, // 1 minute - prevent excessive refetching + gcTime: 300000, // 5 minutes cache + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + }); +}; + +/** + * Hook to list Model Providers using the AI Gateway v1 API + * Lists available LLM providers (OpenAI, Anthropic, Google, etc.) + */ +export const useListModelProvidersQuery = ( + input?: MessageInit, + options?: QueryOptions, ListModelProvidersResponse> +): UseQueryResult => { + const transport = useAIGatewayTransport(); + + const listModelProvidersRequest = create(ListModelProvidersRequestSchema, { + pageToken: input?.pageToken ?? '', + pageSize: input?.pageSize ?? AI_GATEWAY_DEFAULT_PAGE_SIZE, + filter: input?.filter ?? '', + }); + + return useQuery(listModelProviders, listModelProvidersRequest, { + enabled: options?.enabled, + transport, + staleTime: 60000, // 1 minute - prevent excessive refetching + gcTime: 300000, // 5 minutes cache + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + }); +}; + +/** + * Hook to list Models using the AI Gateway v1 API + * Lists available models, optionally filtered by provider + * + * @example + * // Filter by provider + * useListModelsQuery({ filter: 'provider = "openai"' }) + */ +export const useListModelsQuery = ( + input?: MessageInit, + options?: QueryOptions, ListModelsResponse> +): UseQueryResult => { + const transport = useAIGatewayTransport(); + + const listModelsRequest = create(ListModelsRequestSchema, { + pageToken: input?.pageToken ?? '', + pageSize: input?.pageSize ?? AI_GATEWAY_DEFAULT_PAGE_SIZE, + filter: input?.filter ?? '', + orderBy: input?.orderBy ?? '', + }); + + return useQuery(listModels, listModelsRequest, { + enabled: options?.enabled, + transport, + staleTime: 60000, // 1 minute - prevent excessive refetching + gcTime: 300000, // 5 minutes cache + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + }); +}; diff --git a/frontend/start-cloud.sh b/frontend/start-cloud.sh index dca06a25e4..f230d2c2e9 100755 --- a/frontend/start-cloud.sh +++ b/frontend/start-cloud.sh @@ -26,7 +26,13 @@ if [ -z "$BACKEND_URL" ]; then exit 1 fi +# Extract cluster ID from backend URL +# Example: https://console-2fd2fedf.d5mst2vnnfekmiescdb0.fmc.ign.cloud.redpanda.com +# Extracts: d5mst2vnnfekmiescdb0 +CLUSTER_ID=$(echo "$BACKEND_URL" | sed -E 's/.*\.([a-z0-9]+)\.(fmc\.ign|rpd)\.cloud\.redpanda\.com.*/\1/') + export PROXY_TARGET="$BACKEND_URL" +export AI_GATEWAY_URL="https://ai-gateway.${CLUSTER_ID}.clusters.ign.rdpa.co" export REACT_APP_ENABLED_FEATURES=SINGLE_SIGN_ON,REASSIGN_PARTITIONS echo "Starting frontend dev server..." diff --git a/proto/gen/openapi/openapi.v1alpha2.json b/proto/gen/openapi/openapi.v1alpha2.json index 5f2227ffcd..8920d4b7ac 100644 --- a/proto/gen/openapi/openapi.v1alpha2.json +++ b/proto/gen/openapi/openapi.v1alpha2.json @@ -1 +1 @@ -{"components":{"schemas":{"ACL.Operation":{"description":"The operation that is allowed or denied (e.g. READ).","enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"},"Action":{"enum":["ACTION_PREPARE","ACTION_EXECUTE","ACTION_FINISH","ACTION_CANCEL"],"type":"string"},"BadRequest":{"description":"Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.","properties":{"field_violations":{"description":"Describes all violations in a client request.","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"title":"BadRequest","type":"object"},"Config":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConfigAlterOperation":{"enum":["CONFIG_ALTER_OPERATION_SET","CONFIG_ALTER_OPERATION_DELETE","CONFIG_ALTER_OPERATION_APPEND","CONFIG_ALTER_OPERATION_SUBTRACT"],"type":"string"},"ConfigSource":{"enum":["CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG","CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG","CONFIG_SOURCE_STATIC_BROKER_CONFIG","CONFIG_SOURCE_DEFAULT_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG"],"type":"string"},"ConfigSynonym":{"properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConfigType":{"enum":["CONFIG_TYPE_BOOLEAN","CONFIG_TYPE_STRING","CONFIG_TYPE_INT","CONFIG_TYPE_SHORT","CONFIG_TYPE_LONG","CONFIG_TYPE_DOUBLE","CONFIG_TYPE_LIST","CONFIG_TYPE_CLASS","CONFIG_TYPE_PASSWORD"],"type":"string"},"Configuration":{"properties":{"config_synonyms":{"description":"If no config value is set at the topic level, it will inherit the value\nset at the broker or cluster level. `name` is the corresponding config\nkey whose value is inherited. `source` indicates whether the inherited\nconfig is default, broker, etc.","items":{"$ref":"#/components/schemas/ConfigSynonym"},"type":"array"},"documentation":{"description":"Config documentation.","nullable":true,"type":"string"},"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"read_only":{"description":"Whether the config is read-only, or is dynamic and can be altered.","type":"boolean"},"sensitive":{"description":"Whether this is a sensitive config key and value.","type":"boolean"},"source":{"$ref":"#/components/schemas/ConfigSource"},"type":{"$ref":"#/components/schemas/ConfigType"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConnectCluster":{"properties":{"address":{"description":"The host address of the Kafka Connect cluster.","type":"string"},"info":{"$ref":"#/components/schemas/ConnectCluster.Info"},"name":{"description":"Unique name of connect cluster. For Redpanda Cloud, the value is `redpanda`.","type":"string"},"plugins":{"items":{"$ref":"#/components/schemas/ConnectorPlugin"},"type":"array"}},"type":"object"},"ConnectCluster.Info":{"properties":{"commit":{"description":"The git commit ID of the connect worker source code.","type":"string"},"kafka_cluster_id":{"description":"Cluster ID.","type":"string"},"version":{"description":"Connect worker version.","type":"string"}},"type":"object"},"Connector":{"properties":{"state":{"description":"State of the connector instance.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the connector is assigned to.","type":"string"}},"type":"object"},"ConnectorError":{"properties":{"content":{"description":"Detailed description of the error.","type":"string"},"title":{"description":"Short description of the error.","type":"string"},"type":{"$ref":"#/components/schemas/ConnectorError.Type"}},"title":"ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task","type":"object"},"ConnectorError.Type":{"description":"Error level.","enum":["TYPE_ERROR","TYPE_WARNING"],"type":"string"},"ConnectorHolisticState":{"description":"State of a connector or one of its tasks, as described in the [Kafka Connect documentation](https://kafka.apache.org/documentation.html#connect_administration). Takes into account not just the state of the connector instance itself, but also the tasks within the connector.\n\n - CONNECTOR_HOLISTIC_STATE_PAUSED: The connector or task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: The connector or task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: The connector is destroyed, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: The connector or task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: - The connector or task has not yet been assigned to a worker,\n- THe connector is running, but there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: The connector is running, \u003e 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: - The connector has failed,\n- The connector is running, but has no tasks,\n- Connector is running and has tasks, but all tasks have failed.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: The connector is running and has tasks, and at least one task, but not all, have failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: The connector or task state could not be determined.","enum":["CONNECTOR_HOLISTIC_STATE_PAUSED","CONNECTOR_HOLISTIC_STATE_RESTARTING","CONNECTOR_HOLISTIC_STATE_DESTROYED","CONNECTOR_HOLISTIC_STATE_STOPPED","CONNECTOR_HOLISTIC_STATE_UNASSIGNED","CONNECTOR_HOLISTIC_STATE_HEALTHY","CONNECTOR_HOLISTIC_STATE_UNHEALTHY","CONNECTOR_HOLISTIC_STATE_DEGRADED","CONNECTOR_HOLISTIC_STATE_UNKNOWN"],"type":"string"},"ConnectorInfoStatus":{"properties":{"info":{"$ref":"#/components/schemas/ConnectorSpec"},"name":{"description":"Name of connector.","type":"string"},"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"ConnectorPlugin":{"properties":{"class":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ConnectorSpec":{"description":"Connector specifications as defined in the Kafka Connect\nAPI. You may include this in the request body when creating a new connector.","properties":{"config":{"additionalProperties":{"type":"string"},"description":"Connector configuration properties.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskInfo"},"readOnly":true,"type":"array"},"type":{"readOnly":true,"type":"string"}},"required":["name","config"],"type":"object"},"ConnectorStatus":{"properties":{"connector":{"$ref":"#/components/schemas/Connector"},"errors":{"description":"List of parsed connectors' and tasks' errors.","items":{"$ref":"#/components/schemas/ConnectorError"},"type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"description":"Status of connector tasks. For more information, see the [https://docs.redpanda.com/current/deploy/deployment-option/cloud/managed-connectors/monitor-connectors/#connector-tasks](Monitor Connectors) documentation.","items":{"$ref":"#/components/schemas/TaskStatus"},"type":"array"},"type":{"description":"Type of connector (sink or source).","type":"string"}},"type":"object"},"CreateACLRequest":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.\nFor requests with resource_type CLUSTER, this will default to \"kafka-cluster\".","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","principal","host","operation","permission_type"],"type":"object"},"CreateACLResponse":{"type":"object"},"CreateConnectSecretBody":{"description":"CreateConnectSecretRequest is the request of CreateConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["name","secret_data"],"type":"object"},"CreateConnectSecretResponse":{"description":"CreateConnectSecretResponse is the response of CreateConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreateConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"CreatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"CreateSecretRequest":{"description":"CreateSecretRequest is the request of CreateSecret.","properties":{"id":{"description":"Secret identifier.","type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"CreateSecretResponse":{"description":"CreateSecretResponse is the response of CreateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreateTopicRequest.Topic":{"properties":{"configs":{"description":"An array of key-value config pairs for a topic.\nThese correspond to Kafka topic-level configs.","items":{"$ref":"#/components/schemas/Config"},"type":"array"},"name":{"description":"Name of topic.","type":"string"},"partition_count":{"description":"The number of partitions to give the topic. If specifying\npartitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default partition count, set to null.","format":"int32","nullable":true,"type":"integer"},"replica_assignments":{"description":"Manually specify broker ID assignments for partition replicas. If manually assigning replicas, both `replication_factor` and\n`partition_count` must be -1.","items":{"$ref":"#/components/schemas/ReplicaAssignment"},"type":"array"},"replication_factor":{"description":"The number of replicas every partition must have.\nIf specifying partitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default replication factor, set to null.","format":"int32","nullable":true,"type":"integer"}},"type":"object"},"CreateTopicResponse":{"properties":{"name":{"description":"Name of topic.","type":"string"},"partition_count":{"description":"The number of partitions created for the topic.\nThis field has a default value of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"},"replication_factor":{"description":"The number of replicas per topic partition.\nThis field has a default of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"}},"type":"object"},"CreateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"CreateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/CreateUserResponse.User"}},"type":"object"},"CreateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"title":"Name of newly-created user","type":"string"}},"type":"object"},"DeleteACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","operation","permission_type"],"type":"object"},"DeleteACLsResponse":{"properties":{"matching_acls":{"items":{"$ref":"#/components/schemas/MatchingACL"},"type":"array"}},"type":"object"},"DeleteConnectSecretResponse":{"description":"DeleteConnectSecretResponse is the response of DeleteConnectSecret.","type":"object"},"DeleteMountTaskResponse":{"type":"object"},"DeletePipelineResponse":{"type":"object"},"DeleteSecretResponse":{"description":"DeleteSecretResponse is the response of DeleteSecret.","type":"object"},"DeleteTopicResponse":{"type":"object"},"DeleteTransformResponse":{"type":"object"},"DeleteUserResponse":{"type":"object"},"DeployTransformRequest":{"description":"Metadata required to deploy a new Wasm\ntransform in a Redpanda cluster.","properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"The input topic to apply the transform to.","example":"orders","type":"string"},"name":{"description":"Name of the transform.","example":"redact-payment-details-in-orders","type":"string"},"output_topic_names":{"description":"Output topic to write the transform results to.","example":"orders-redacted","items":{"type":"string"},"type":"array"}},"required":["name","input_topic_name","output_topic_names"],"type":"object"},"EnvironmentVariable":{"properties":{"key":{"description":"The key of your environment variable.","example":"LOG_LEVEL","type":"string"},"value":{"description":"The value of your environment variable.","example":"DEBUG","type":"string"}},"required":["key","value"],"type":"object"},"ErrorInfo":{"description":"Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }","properties":{"domain":{"description":"The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".","type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Additional structured details about this error.\n\nKeys must match a regular expression of `[a-z][a-zA-Z0-9-_]+` but should\nideally be lowerCamelCase. Also, they must be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n`{\"instanceLimit\": \"100/request\"}`, should be returned as,\n`{\"instanceLimitPerRequest\": \"100\"}`, if the client exceeds the number of\ninstances that can be created in a single (batch) request.","type":"object"},"reason":{"description":"The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.","type":"string"}},"title":"ErrorInfo","type":"object"},"FieldViolation":{"description":"A message type used to describe a single bad request field.","properties":{"description":{"description":"A description of why the request element is bad.","type":"string"},"field":{"description":"A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.","type":"string"},"localized_message":{"$ref":"#/components/schemas/LocalizedMessage"},"reason":{"description":"The reason of the field-level error. This is a constant value that\nidentifies the proximate cause of the field-level error. It should\nuniquely identify the type of the FieldViolation within the scope of the\ngoogle.rpc.ErrorInfo.domain. This should be at most 63\ncharacters and match a regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`,\nwhich represents UPPER_SNAKE_CASE.","type":"string"}},"type":"object"},"GetConnectClusterResponse":{"properties":{"cluster":{"$ref":"#/components/schemas/ConnectCluster"}},"type":"object"},"GetConnectSecretResponse":{"description":"GetConnectSecretResponse is the response of GetConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetConnectorConfigResponse":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"GetConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"GetConnectorStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"GetMountTaskResponse":{"properties":{"task":{"$ref":"#/components/schemas/MountTask"}},"type":"object"},"GetPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"GetPipelineServiceConfigSchemaResponse":{"properties":{"config_schema":{"description":"JSON schema of the configuration components that are allowed for Connect pipelines.","type":"string"}},"type":"object"},"GetPipelinesBySecretsResponse":{"properties":{"pipelines_for_secret":{"items":{"$ref":"#/components/schemas/PipelinesForSecret"},"type":"array"}},"type":"object"},"GetPipelinesForSecretResponse":{"properties":{"pipelines_for_secret":{"$ref":"#/components/schemas/PipelinesForSecret"}},"type":"object"},"GetSecretResponse":{"description":"GetSecretResponse is the response of GetSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetTopicConfigurationsResponse":{"properties":{"configurations":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"GetTransformResponse":{"properties":{"transform":{"$ref":"#/components/schemas/TransformMetadata"}},"type":"object"},"Help":{"description":"Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.","properties":{"links":{"description":"URL(s) pointing to additional information on handling the current error.","items":{"$ref":"#/components/schemas/Link"},"type":"array"}},"title":"Help","type":"object"},"Link":{"description":"Describes a URL link.","properties":{"description":{"description":"Describes what the link offers.","type":"string"},"url":{"description":"The URL of the link.","type":"string"}},"type":"object"},"ListACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ListACLsResponse":{"properties":{"resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array"}},"type":"object"},"ListConnectClustersResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ConnectCluster"},"type":"array"}},"type":"object"},"ListConnectSecretsResponse":{"description":"ListConnectSecretsResponse is the response of ListConnectSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListConnectorTopicsResponse":{"properties":{"topics":{"description":"Topic names.","items":{"type":"string"},"type":"array"}},"type":"object"},"ListConnectorsResponse":{"properties":{"connectors":{"description":"List of connectors, where the parent key is the connector name.","items":{"$ref":"#/components/schemas/ConnectorInfoStatus"},"type":"array"},"next_page_token":{"description":"Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.","type":"string"}},"type":"object"},"ListMountTasksResponse":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/MountTask"},"type":"array"}},"type":"object"},"ListMountableTopicsResponse":{"properties":{"topics":{"items":{"$ref":"#/components/schemas/TopicLocation"},"type":"array"}},"type":"object"},"ListPipelinesRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on pipeline name. Case-sensitive.","type":"string"}},"type":"object"},"ListPipelinesResponse":{"properties":{"next_page_token":{"type":"string"},"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"}},"type":"object"},"ListSecretScopesResponse":{"description":"ListSecretScopesResponse is the response of ListSecretScopes.","properties":{"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"type":"object"},"ListSecretsFilter":{"description":"ListSecretsFilter are the filter options for listing secrets.","properties":{"labels[string][string]":{"additionalProperties":{"type":"string"},"description":"The secret labels to search for.","type":"object"},"name_contains":{"description":"Substring match on secret name. Case-sensitive.","type":"string"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes to search for","type":"array"}},"type":"object"},"ListSecretsResponse":{"description":"ListSecretsResponse is the response of ListSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListTopicsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on topic name. Case-sensitive.","type":"string"}},"type":"object"},"ListTopicsResponse":{"properties":{"next_page_token":{"type":"string"},"topics":{"items":{"$ref":"#/components/schemas/ListTopicsResponse.Topic"},"type":"array"}},"type":"object"},"ListTopicsResponse.Topic":{"properties":{"internal":{"description":"Whether topic is internal only.","type":"boolean"},"name":{"description":"Topic name.","type":"string"},"partition_count":{"description":"Topic partition count.","format":"int32","type":"integer"},"replication_factor":{"description":"Topic replication factor.","format":"int32","type":"integer"}},"type":"object"},"ListTransformsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on transform name. Case-sensitive.","type":"string"}},"type":"object"},"ListTransformsResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"transforms":{"items":{"$ref":"#/components/schemas/TransformMetadata"},"type":"array"}},"type":"object"},"ListUsersRequest.Filter":{"properties":{"name":{"description":"Username.","type":"string"},"name_contains":{"description":"Substring match on username. Case-sensitive.","type":"string"}},"type":"object"},"ListUsersResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"users":{"items":{"$ref":"#/components/schemas/ListUsersResponse.User"},"type":"array"}},"type":"object"},"ListUsersResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"}},"type":"object"},"LocalizedMessage":{"description":"Provides a localized error message that is safe to return to the user\nwhich can be attached to an RPC error.","properties":{"locale":{"title":"The locale used following the specification defined at\nhttps://www.rfc-editor.org/rfc/bcp/bcp47.txt.\nExamples are: \"en-US\", \"fr-CH\", \"es-MX\"","type":"string"},"message":{"description":"The localized error message in the above locale.","type":"string"}},"type":"object"},"MatchingACL":{"properties":{"error":{"$ref":"#/components/schemas/rpc.Status"},"host":{"description":"The host address to use for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"MountTask":{"properties":{"id":{"description":"Unique identifier for this mount task.","format":"int32","type":"integer"},"state":{"$ref":"#/components/schemas/MountTask.State"},"topics":{"description":"List of topics that are being mounted or unmounted.","items":{"$ref":"#/components/schemas/MountTask.Topic"},"type":"array"},"type":{"$ref":"#/components/schemas/MountTask.Type"}},"type":"object"},"MountTask.State":{"description":" - STATE_PLANNED: Planned: The mount task has been created and is awaiting further actions.\n - STATE_PREPARING: Preparing: The mount task is gathering resources and preparing for execution.\n - STATE_PREPARED: Prepared: All preparations are complete, and the mount task is ready to be executed.\n - STATE_EXECUTING: Executing: The mount task is actively transferring or transforming data.\n - STATE_EXECUTED: Executed: The core mount task actions are complete, but the mount task has not yet cut over or finalized.\n - STATE_CUT_OVER: Cut Over: The mount task has reached a critical point where ownership is transferred or final adjustments are made.\n - STATE_FINISHED: Finished: The mount task has been successfully completed, and no further actions are required.\n - STATE_CANCELING: Canceling: The mount task is in the process of being canceled, and rollback or cleanup actions may be in progress.\n - STATE_CANCELLED: Cancelled: The mount task has been fully canceled, and no further actions will be taken.","enum":["STATE_PLANNED","STATE_PREPARING","STATE_PREPARED","STATE_EXECUTING","STATE_EXECUTED","STATE_CUT_OVER","STATE_FINISHED","STATE_CANCELING","STATE_CANCELLED"],"type":"string"},"MountTask.Topic":{"properties":{"source_topic_reference":{"description":"The topic reference in the object storage bucket.\nThis field is only set for tasks of type MOUNT.","type":"string"},"topic_reference":{"description":"The topic reference within the current cluster, which may be either a simple topic name or a full reference\nin the form: cluster-uuid/topic-name/revision.","type":"string"}},"type":"object"},"MountTask.Type":{"description":" - TYPE_MOUNT: Mount represents the process of making topics available in a cluster by loading them from object storage.\n - TYPE_UNMOUNT: Unmount represents the process of offloading topics back to object storage.","enum":["TYPE_MOUNT","TYPE_UNMOUNT"],"type":"string"},"MountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of mount","type":"integer"}},"type":"object"},"Options":{"properties":{"include_tasks":{"description":"Restart connector's tasks.","type":"boolean"},"only_failed":{"description":"Restart only connectors that have failed.","type":"boolean"}},"type":"object"},"PartitionStatus":{"enum":["PARTITION_STATUS_RUNNING","PARTITION_STATUS_INACTIVE","PARTITION_STATUS_ERRORED","PARTITION_STATUS_UNKNOWN"],"type":"string"},"PartitionTransformStatus":{"properties":{"broker_id":{"format":"int32","type":"integer"},"lag":{"format":"int32","type":"integer"},"partition_id":{"format":"int32","type":"integer"},"status":{"$ref":"#/components/schemas/PartitionStatus"}},"type":"object"},"PermissionType":{"description":"Whether the operation should be allowed or denied.","enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"},"Pipeline":{"description":"Defines the pipeline resource.","properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","title":"The pipeline configuration in YAML.\nSee https://docs.redpanda.com/redpanda-connect/configuration/about/","type":"string"},"description":{"description":"Optional pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"id":{"description":"Pipeline ID.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"},"state":{"$ref":"#/components/schemas/Pipeline.State"},"status":{"$ref":"#/components/schemas/Pipeline.Status"}},"required":["id","display_name","config_yaml"],"type":"object"},"Pipeline.State":{"description":"State of the pipeline.\n\n - STATE_STARTING: The pipeline is starting.\n - STATE_RUNNING: The pipeline is running.\n - STATE_STOPPING: The pipeline is in the process of stopping.\n - STATE_STOPPED: The pipeline is stopped and in paused state.\n - STATE_ERROR: The pipeline encountered an error. See [Error Handling](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/error_handling/) for further guidance.\n - STATE_COMPLETED: The pipeline has completed the job successfully.","enum":["STATE_STARTING","STATE_RUNNING","STATE_STOPPING","STATE_STOPPED","STATE_ERROR","STATE_COMPLETED"],"type":"string"},"Pipeline.Status":{"description":"Pipeline status may contain an error message.","properties":{"error":{"type":"string"}},"type":"object"},"PipelineCreate":{"description":"PipelineCreate contains the details for the pipeline creation request.","properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"}},"required":["display_name","config_yaml"],"type":"object"},"PipelineUpdate":{"properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"}},"required":["display_name","config_yaml"],"type":"object"},"PipelinesForSecret":{"properties":{"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"},"secret_id":{"type":"string"}},"type":"object"},"Policy":{"properties":{"host":{"description":"The host address for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"}},"type":"object"},"QuotaFailure":{"description":"Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.","properties":{"violations":{"description":"Describes all quota violations.","items":{"$ref":"#/components/schemas/QuotaFailure.Violation"},"type":"array"}},"title":"QuotaFailure","type":"object"},"QuotaFailure.Violation":{"description":"A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.","properties":{"api_service":{"description":"The API Service from which the `QuotaFailure.Violation` orginates. In\nsome cases, Quota issues originate from an API Service other than the one\nthat was called. In other words, a dependency of the called API Service\ncould be the cause of the `QuotaFailure`, and this field would have the\ndependency API service name.\n\nFor example, if the called API is Kubernetes Engine API\n(container.googleapis.com), and a quota violation occurs in the\nKubernetes Engine API itself, this field would be\n\"container.googleapis.com\". On the other hand, if the quota violation\noccurs when the Kubernetes Engine API creates VMs in the Compute Engine\nAPI (compute.googleapis.com), this field would be\n\"compute.googleapis.com\".","type":"string"},"description":{"description":"A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".","type":"string"},"future_quota_value":{"description":"The new quota value being rolled out at the time of the violation. At the\ncompletion of the rollout, this value will be enforced in place of\nquota_value. If no rollout is in progress at the time of the violation,\nthis field is not set.\n\nFor example, if at the time of the violation a rollout is in progress\nchanging the number of CPUs quota from 10 to 20, 20 would be the value of\nthis field.","format":"int64","nullable":true,"type":"string"},"quota_dimensions":{"additionalProperties":{"type":"string"},"description":"The dimensions of the violated quota. Every non-global quota is enforced\non a set of dimensions. While quota metric defines what to count, the\ndimensions specify for what aspects the counter should be increased.\n\nFor example, the quota \"CPUs per region per VM family\" enforces a limit\non the metric \"compute.googleapis.com/cpus_per_vm_family\" on dimensions\n\"region\" and \"vm_family\". And if the violation occurred in region\n\"us-central1\" and for VM family \"n1\", the quota_dimensions would be,\n\n{\n \"region\": \"us-central1\",\n \"vm_family\": \"n1\",\n}\n\nWhen a quota is enforced globally, the quota_dimensions would always be\nempty.","type":"object"},"quota_id":{"description":"The id of the violated quota. Also know as \"limit name\", this is the\nunique identifier of a quota in the context of an API service.\n\nFor example, \"CPUS-PER-VM-FAMILY-per-project-region\".","type":"string"},"quota_metric":{"description":"The metric of the violated quota. A quota metric is a named counter to\nmeasure usage, such as API requests or CPUs. When an activity occurs in a\nservice, such as Virtual Machine allocation, one or more quota metrics\nmay be affected.\n\nFor example, \"compute.googleapis.com/cpus_per_vm_family\",\n\"storage.googleapis.com/internet_egress_bandwidth\".","type":"string"},"quota_value":{"description":"The enforced quota value at the time of the `QuotaFailure`.\n\nFor example, if the enforced quota value at the time of the\n`QuotaFailure` on the number of CPUs is \"10\", then the value of this\nfield would reflect this quantity.","format":"int64","type":"string"},"subject":{"description":"The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".","type":"string"}},"type":"object"},"ReplicaAssignment":{"properties":{"partition_id":{"description":"A partition to create.","format":"int32","type":"integer"},"replica_ids":{"description":"The broker IDs the partition replicas are assigned to.","items":{"format":"int32","type":"integer"},"type":"array"}},"type":"object"},"Resource":{"properties":{"acls":{"items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ResourcePatternType":{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"},"ResourceType":{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"},"Resources":{"properties":{"cpu_shares":{"description":"`cpu_shares` is a string specifying the amount of CPU to allocate for the\npipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable\nunits include:\n- Decimal SI units: \"m\" (e.g., \"500m\" for 500 millicores, \"2\" for 2 cores)\nCPU shares can be specified in millicores (1 core = 1000 millicores).\nIf you don't specify a unit, the value is interpreted as the number of cores.","type":"string"},"memory_shares":{"description":"`memory_shares` is a string specifying the amount of memory to allocate for\nthe pipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable units\ninclude:\n- Decimal SI units: \"K\", \"M\", \"G\", \"T\", \"P\", \"E\" (e.g., \"128M\" for 128\n megabytes)\n- Binary SI units: \"Ki\", \"Mi\", \"Gi\", \"Ti\", \"Pi\", \"Ei\" (e.g., \"512Mi\" for\n512 mebibytes) If you don't specify a unit, the value is interpreted as\nbytes.","type":"string"}},"required":["memory_shares","cpu_shares"],"type":"object"},"SASLMechanism":{"description":"SASL mechanism to use for authentication.","enum":["SASL_MECHANISM_SCRAM_SHA_256","SASL_MECHANISM_SCRAM_SHA_512"],"type":"string"},"Scope":{"description":"Defines the scope of a secret.","enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"Secret":{"description":"Defines the secret resource.","properties":{"id":{"description":"Secret identifier.","readOnly":true,"type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"}},"type":"object"},"ServiceAccount":{"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"}},"type":"object"},"SetConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"SetTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after this update.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"StartPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"StopPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"TaskInfo":{"properties":{"connector":{"description":"Name of connector.","type":"string"},"task":{"description":"The connector task ID.","format":"int32","type":"integer"}},"type":"object"},"TaskStatus":{"properties":{"id":{"description":"The connector task ID.","format":"int32","type":"integer"},"state":{"description":"State of connector task.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the task is assigned to.","type":"string"}},"type":"object"},"TopicLocation":{"properties":{"name":{"description":"Topic name.","type":"string"},"topic_location":{"description":"Full reference for the unmounted topic in this format: `topic-name/cluster-uuid/revision`.\nUse this as unique identifier for mounting a topic if there are multiple topics available\nwith the same name.","type":"string"}},"type":"object"},"TopicMount":{"description":"TopicMount defines the migration of a topic from the cloud storage into this cluster,\nso that it becomes available via the Kafka API.","properties":{"alias":{"description":"Alias may be provided to mount the topic under a different name. Leave\nblank to re-use the source topic name. The alias does not persist if you\nunmount the topic again.","type":"string"},"source_topic_reference":{"description":"The topic name or full reference of the topic to mount. The full reference\nmust be used in case the same topic exists more than once. This may be the case if\nthe same topic has been unmounted multiple times. List all mountable topics to\nfind the full reference (contains topic name, cluster uuid and revision).","type":"string"}},"required":["source_topic_reference"],"type":"object"},"TransformMetadata":{"properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"Input topic to apply the transform to.","type":"string"},"name":{"description":"Name of transform.","type":"string"},"output_topic_names":{"description":"Output topics to write the transform results to.","items":{"type":"string"},"type":"array"},"statuses":{"items":{"$ref":"#/components/schemas/PartitionTransformStatus"},"type":"array"}},"type":"object"},"UnmountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of unmount","type":"integer"}},"type":"object"},"UpdateConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"operation":{"$ref":"#/components/schemas/ConfigAlterOperation"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"UpdateConnectSecretBody":{"description":"UpdateConnectSecretRequest is the request of UpdateConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateConnectSecretResponse":{"description":"UpdateConnectSecretResponse is the response of UpdateConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateMountTaskBody":{"properties":{"action":{"$ref":"#/components/schemas/Action"}},"required":["action"],"type":"object"},"UpdateMountTaskResponse":{"type":"object"},"UpdatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"UpdateSecretBody":{"description":"UpdateSecretRequest is the request of UpdateSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateSecretResponse":{"description":"UpdateSecretResponse is the response of UpdateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after applying this partial patch.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"UpdateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"UpdateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UpdateUserResponse.User"}},"type":"object"},"UpdateUserResponse.User":{"description":"Updated user's name and SASL mechanism.","properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"UpsertConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"rpc.Status":{"description":"The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).","properties":{"code":{"description":"RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).","enum":["OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","UNAUTHENTICATED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","INTERNAL","UNAVAILABLE","DATA_LOSS"],"format":"int32","type":"string"},"details":{"items":{"description":"Details of the error.","oneOf":[{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.BadRequest"],"type":"string"}}},{"$ref":"#/components/schemas/BadRequest"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.ErrorInfo"],"type":"string"}}},{"$ref":"#/components/schemas/ErrorInfo"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.QuotaFailure"],"type":"string"}}},{"$ref":"#/components/schemas/QuotaFailure"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.Help"],"type":"string"}}},{"$ref":"#/components/schemas/Help"}]}]},"type":"array"},"message":{"description":"Detailed error message. No compatibility guarantees are given for the text contained in this message.","type":"string"}},"type":"object"}},"securitySchemes":{"auth0":{"description":"RedpandaCloud","flows":{"implicit":{"authorizationUrl":"https://auth.prd.cloud.redpanda.com/oauth/authorize","scopes":{},"x-client-id":"dQjapNIAHhF7EQqQToRla3yEII9sUSap"}},"type":"oauth2"}}},"info":{"title":"Redpanda Cloud Data Plane API","version":"v1alpha2"},"openapi":"3.0.3","paths":{"/v1alpha2/acls":{"delete":{"description":"Delete all ACLs that match the filter criteria. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_DeleteACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","required":true,"schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","required":true,"schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","required":true,"schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","required":true,"schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete ACLs","tags":["Redpanda ACLs (v1alpha2)"]},"get":{"description":"List all ACLs. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_ListACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List ACLs","tags":["Redpanda ACLs (v1alpha2)"]},"post":{"description":"Create a new ACL.","operationId":"ACLService_CreateACL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLResponse"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create ACL","tags":["Redpanda ACLs (v1alpha2)"]}},"/v1alpha2/cloud-storage/mount-tasks":{"get":{"description":"This operation retrieves the status of a task responsible for mounting or unmounting topics. It provides details on the task’s type (mount or unmount), its current state, and the topics involved.","operationId":"CloudStorageService_ListMountTasks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountTasksResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the mount task status","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/mount-tasks/{id}":{"delete":{"description":"Delete a mount or unmount by ID.","operationId":"CloudStorageService_DeleteMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to delete.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a mount or unmount","tags":["Cloud Storage (v1alpha2)"]},"get":{"description":"Retrieves the status of a mount or unmount by ID. The response provides details on the operation type (mount or unmount), its current state, and the topics involved. Use the ID returned when you start the mount or unmount, or use the ListMountTasks endpoint to retrieve a list of IDs.","operationId":"CloudStorageService_GetMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to retrieve.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get the status of a mount or unmount by ID","tags":["Cloud Storage (v1alpha2)"]},"post":{"description":"This operation allows performing an action on an ongoing mount task.","operationId":"CloudStorageService_UpdateMountTask","parameters":[{"description":"ID is the unique identifier of the mount or unmount to update.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a mount or unmount","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/mount":{"post":{"description":"Attach mountable topics from object storage to a cluster, making them available for consumption and production again. Mounting a topic reloads its data and state to the local brokers, allowing active use of the topic.","operationId":"CloudStorageService_MountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TopicMount"},"required":["topics"],"type":"array"}}},"required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Mount topics from object storage","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/mountable":{"get":{"description":"Retrieve all topics that are currently unmounted and available to be mounted to the cluster. These topics reside in object storage and can be mounted for consumption or production within the cluster.","operationId":"CloudStorageService_ListMountableTopics","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountableTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List mountable topics","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/unmount":{"post":{"description":"Unmount topics to object storage, freeing up all local cluster resources. Once you unmount a topic, it can no longer be consumed or produced to. It detaches from the active cluster while its data remains safely stored in the external object storage.","operationId":"CloudStorageService_UnmountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"required":["topics"],"type":"array"}}},"description":"List of topics to unmount.","required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Unmount topics to object storage","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters":{"get":{"description":"List connect clusters available for being consumed by the console's kafka-connect service.","operationId":"KafkaConnectService_ListConnectClusters","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectClustersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connect clusters","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}":{"get":{"description":"Get information about an available Kafka Connect cluster.","operationId":"KafkaConnectService_GetConnectCluster","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectCluster"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Connect cluster not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connect cluster","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors":{"get":{"description":"List connectors managed by the Kafka Connect service.","operationId":"KafkaConnectService_ListConnectors","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connectors","tags":["Kafka Connect (v1alpha2)"]},"post":{"description":"Create a connector with the specified configuration.","operationId":"KafkaConnectService_CreateConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"required":true,"x-originalParamName":"connector"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}":{"delete":{"description":"Delete a connector. This operation force stops all tasks and also deletes the connector configuration.","operationId":"KafkaConnectService_DeleteConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete connector","tags":["Kafka Connect (v1alpha2)"]},"get":{"description":"Get information about a connector in a specific cluster.","operationId":"KafkaConnectService_GetConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/config":{"get":{"description":"Get the configuration for the connector.","operationId":"KafkaConnectService_GetConnectorConfig","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector configuration","tags":["Kafka Connect (v1alpha2)"]},"put":{"description":"Update the configuration for an existing connector with the specified name, or create a new connector using the given configuration. Returns information about the connector after the change has been made.","operationId":"KafkaConnectService_UpsertConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector. If a connector with this name does not already exist, a new connector is created.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"required":["config"],"type":"object"}}},"description":"Connector configuration property.","required":true,"x-originalParamName":"config"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Updated"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Upsert connector configuration","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/pause":{"put":{"description":"Pause the connector and its tasks, which stops messages from processing until the connector is resumed. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_PauseConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Pause request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Pause connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/restart":{"post":{"description":"Triggers a connector restart. You must specify whether or not tasks are also restarted, and whether only failed connectors are restarted.","operationId":"KafkaConnectService_RestartConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}},"required":true,"x-originalParamName":"options"},"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Restart connector request success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Restart connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/resume":{"put":{"description":"Resume a paused connector and its tasks, and resumes message processing. This call is asynchronous and may take some time to process. If the connector was not paused, this operation does not do anything.","operationId":"KafkaConnectService_ResumeConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Resume request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Resume connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/status":{"get":{"description":"Gets the current status of the connector, including the state for each of its tasks, error information, etc.","operationId":"KafkaConnectService_GetConnectorStatus","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorStatus"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector status","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/stop":{"put":{"description":"Stops a connector, but does not delete it. All tasks for the connector are shut down completely. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_StopConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stop connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics":{"get":{"description":"Returns a list of connector topic names. If the connector is inactive, this call returns an empty list.","operationId":"KafkaConnectService_ListConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connector topics","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics/reset":{"put":{"description":"Resets the set of topic names that the connector is using.","operationId":"KafkaConnectService_ResetConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector using the topics to be reset.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Reset connector topics","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/secrets":{"get":{"description":"List Kafka Connect cluster secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListConnectSecrets","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string][string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Connect Cluster Secrets","tags":["Secrets (v1alpha2)"]},"post":{"description":"Create a Kafka Connect cluster secret.","operationId":"SecretService_CreateConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Connect Cluster Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/secrets/{id}":{"delete":{"description":"Delete a Kafka Connect cluster secret.","operationId":"SecretService_DeleteConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Connect Cluster Secret","tags":["Secrets (v1alpha2)"]},"get":{"description":"Get a specific Kafka Connect cluster secret.","operationId":"SecretService_GetConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"The ID of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Connect Cluster Secret","tags":["Secrets (v1alpha2)"]},"put":{"description":"Update a Kafka Connect cluster secret.","operationId":"SecretService_UpdateConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to update.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Connect Cluster Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/redpanda-connect/config-schema":{"get":{"description":"The configuration schema includes available [components and processors](https://docs.redpanda.com/redpanda-cloud/develop/connect/components/about) in this Redpanda Connect instance.","operationId":"PipelineService_GetPipelineServiceConfigSchema","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelineServiceConfigSchemaResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the schema for Redpanda Connect pipeline configurations.","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines":{"get":{"description":"List Redpanda Connect pipelines. Optional: filter based on pipeline name.","operationId":"PipelineService_ListPipelines","parameters":[{"description":"Substring match on pipeline name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPipelinesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Redpanda Connect pipelines","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"post":{"description":"Create a new Redpanda Connect pipeline.","operationId":"PipelineService_CreatePipeline","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineCreate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines-by-secrets":{"get":{"description":"Get Redpanda Connect pipelines by secrets.","operationId":"PipelineService_GetPipelinesBySecrets","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesBySecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines by secrets","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines-for-secret":{"get":{"description":"Get Redpanda Connect pipelines for a given secret.","operationId":"PipelineService_GetPipelinesForSecret","parameters":[{"description":"Secret ID.","in":"query","name":"secret_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesForSecretResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines for secret","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}":{"delete":{"description":"Delete a Redpanda Connect pipeline.","operationId":"PipelineService_DeletePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"get":{"description":"Get a specific Redpanda Connect pipeline.","operationId":"PipelineService_GetPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"put":{"description":"Update the [configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) of a Redpanda Connect pipeline.","operationId":"PipelineService_UpdatePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineUpdate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}/start":{"put":{"description":"Start a stopped Redpanda Connect pipeline.","operationId":"PipelineService_StartPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Started"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Start a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}/stop":{"put":{"description":"Stop a running Redpanda Connect pipeline.","operationId":"PipelineService_StopPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Stopped"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stops a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/secret-scopes":{"get":{"description":"List supported secret scopes.","operationId":"SecretService_ListSecretScopes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretScopesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secret Scopes","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/secrets":{"get":{"description":"List secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListSecrets","parameters":[{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secrets","tags":["Secrets (v1alpha2)"]},"post":{"description":"Create a secret.","operationId":"SecretService_CreateSecret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"description":"CreateSecretRequest is the request of CreateSecret.","required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/secrets/{id}":{"delete":{"description":"Delete a secret.","operationId":"SecretService_DeleteSecret","parameters":[{"description":"The id of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Secret","tags":["Secrets (v1alpha2)"]},"get":{"description":"Get a secret.","operationId":"SecretService_GetSecret","parameters":[{"description":"The id of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Secret","tags":["Secrets (v1alpha2)"]},"put":{"description":"Update a secret.","operationId":"SecretService_UpdateSecret","parameters":[{"description":"Secret identifier.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/topics":{"get":{"description":"List topics, with partition count and replication factor. Optional: filter based on topic name.","operationId":"TopicService_ListTopics","parameters":[{"description":"Substring match on topic name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Topics","tags":["Topics (v1alpha2)"]},"post":{"description":"Create a [topic](https://docs.redpanda.com/current/deploy/deployment-option/cloud/create-topic/).","operationId":"TopicService_CreateTopic","parameters":[{"description":"If true, makes this request a dry run; everything is validated but\nno topics are actually created.","in":"query","name":"validate_only","schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequest.Topic"}}},"description":"The topic to create.","required":true,"x-originalParamName":"topic"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicResponse"}}},"description":"Topic created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Topic","tags":["Topics (v1alpha2)"]}},"/v1alpha2/topics/{name}":{"delete":{"description":"Delete the Kafka topic with the requested name.","operationId":"TopicService_DeleteTopic","parameters":[{"description":"Topic name.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Topic deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Requested topic does not exist"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Topic","tags":["Topics (v1alpha2)"]}},"/v1alpha2/topics/{topic_name}/configurations":{"get":{"description":"Get key-value configs for a topic.","operationId":"TopicService_GetTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Topic Configurations","tags":["Topics (v1alpha2)"]},"patch":{"description":"Update a subset of the topic configurations.","operationId":"TopicService_UpdateTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpdateConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Topic Configuration","tags":["Topics (v1alpha2)"]},"put":{"description":"Update the entire set of key-value configurations for a topic. Config entries that are not provided in the request are removed and will fall back to their default values.","operationId":"TopicService_SetTopicConfigurations","parameters":[{"description":"Name of topic.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SetConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Configurations","tags":["Topics (v1alpha2)"]}},"/v1alpha2/transforms":{"get":{"description":"Retrieve a list of Wasm transforms. Optional: filter based on transform name.","operationId":"TransformService_ListTransforms","parameters":[{"description":"Substring match on transform name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","transforms":[{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic11","output-topic12"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]},{"environment_variables":[],"input_topic_name":"topic2","name":"transform2","output_topic_names":["output-topic21","output-topic22"],"statuses":[{"broker_id":2,"lag":2,"partition_id":2,"status":"PARTITION_STATUS_RUNNING"}]}]},"schema":{"$ref":"#/components/schemas/ListTransformsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Transforms","tags":["WASM Transforms (v1alpha2)"]},"put":{"description":"Initiate deployment of a new Wasm transform. This endpoint uses multipart/form-data encoding. Following deployment, a brief period is required before the Wasm transform becomes operational. Monitor the partition statuses to check whether the transform is active. This usually takes around 3s, but no longer than 10s.","operationId":"TransformService_DeployTransform","requestBody":{"content":{"multipart/form-data":{"schema":{"example":"{\"name\":\"redact-orders\",\"input_topic_name\":\"orders\",\"output_topic_names\":[\"orders-redacted\"],\"environment_variables\":[{\"key\":\"LOGGER_LEVEL\",\"value\":\"DEBUG\"}]}","properties":{"metadata":{"$ref":"#/components/schemas/DeployTransformRequest"},"wasm_binary":{"description":"Binary file containing the compiled WASM transform. The maximum size for this file is 10MiB.","format":"binary","type":"string"}},"type":"object"}}},"description":"Transform metadata as well as the WASM binary","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformMetadata"}}},"description":"Created"}},"summary":"Deploy Transform","tags":["WASM Transforms (v1alpha2)"]}},"/v1alpha2/transforms/{name}":{"delete":{"description":"Delete a Wasm transform with the requested name.","operationId":"TransformService_DeleteTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"Transform deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Transform","tags":["WASM Transforms (v1alpha2)"]},"get":{"description":"Get a specific Wasm transform.","operationId":"TransformService_GetTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"transform":{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic1","output-topic2"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]}},"schema":{"$ref":"#/components/schemas/GetTransformResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Transform","tags":["WASM Transforms (v1alpha2)"]}},"/v1alpha2/users":{"get":{"description":"List users. Optional: filter based on username.","operationId":"UserService_ListUsers","parameters":[{"description":"Username.","in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"Substring match on username. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","users":[{"name":"payment-service"},{"name":"jane"}]},"schema":{"$ref":"#/components/schemas/ListUsersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Users","tags":["Redpanda Users (v1alpha2)"]},"post":{"description":"Create a new user.","operationId":"UserService_CreateUser","requestBody":{"content":{"application/json":{"example":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service","password":"secure-password"},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"required":true,"x-originalParamName":"user"},"responses":{"201":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"description":"User created"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password","localized_message":null,"reason":""},{"description":"value is required","field":"user.mechanism","localized_message":null,"reason":""}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create User","tags":["Redpanda Users (v1alpha2)"]}},"/v1alpha2/users/{name}":{"delete":{"description":"Delete the specified user","operationId":"UserService_DeleteUser","parameters":[{"description":"Username","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"User deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"example":{"code":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_RESOURCE_NOT_FOUND"}],"message":"user not found"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete User","tags":["Redpanda Users (v1alpha2)"]}},"/v1alpha2/users/{user.name}":{"put":{"description":"Update a user's credentials.","operationId":"UserService_UpdateUser","parameters":[{"description":"Username.","in":"path","name":"user.name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","password":"new-password"}},"schema":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"password":{"description":"Password.","type":"string"}},"type":"object"}}},"required":true,"x-originalParamName":"user"},"responses":{"200":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/UpdateUserResponse.User"}}},"description":"OK"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password","localized_message":null,"reason":""},{"description":"value is required","field":"user.mechanism","localized_message":null,"reason":""}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update User","tags":["Redpanda Users (v1alpha2)"]}}},"security":[{"auth0":[]}],"servers":[{"description":"Data Plane API","url":"{dataplane_api_url}","variables":{"dataplane_api_url":{"default":"https://{dataplane_api_url}","description":"Find the Data Plane API base URL of a cluster by calling the Get Cluster endpoint of the Control Plane API. The dataplane_api.url field is returned in the response body.\u003cbr\u003e\u003cbr\u003e\n\t\t\t\t\tExample (Dedicated): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\"\u003cbr\u003e\n\t\t\t\t\tExample (BYOC): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com\""}}}],"tags":[{"description":"Manage Redpanda access control lists (ACLs). See [Redpanda Cloud Authorization](https://docs.redpanda.com/redpanda-cloud/security/authorization/cloud-authorization/) for more information.","name":"Redpanda ACLs (v1alpha2)"},{"description":"Manage Redpanda topics stored in object storage. See: [Mountable Topics](https://docs.redpanda.com/redpanda-cloud/manage/mountable-topics/)","name":"Cloud Storage (v1alpha2)"},{"description":"Manage Wasm transforms in Redpanda.","name":"WASM Transforms (v1alpha2)"},{"description":"Manage [connectors](https://docs.redpanda.com/redpanda-cloud/develop/managed-connectors/) and interact with the Kafka Connect API.","name":"Kafka Connect (v1alpha2)"},{"description":"Create and manage [Redpanda Connect](https://docs.redpanda.com/redpanda-cloud/develop/connect/about) pipelines and their configurations.","name":"Redpanda Connect Pipeline (v1alpha2)"},{"description":"Manage [secrets](https://docs.redpanda.com/redpanda-cloud/security/secrets) for Redpanda Cloud.","name":"Secrets (v1alpha2)"},{"description":"Manage Redpanda topics.","name":"Topics (v1alpha2)"},{"description":"Manage Redpanda users. To manage access, see the Data Plane [ACL endpoints](https://docs.redpanda.com/api/cloud-dataplane-api/#get-/v1alpha2/acls).","name":"Redpanda Users (v1alpha2)"}]} \ No newline at end of file +{"components":{"schemas":{"ACL.Operation":{"description":"The operation that is allowed or denied (e.g. READ).","enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"},"Action":{"enum":["ACTION_PREPARE","ACTION_EXECUTE","ACTION_FINISH","ACTION_CANCEL"],"type":"string"},"BadRequest":{"description":"Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.","properties":{"field_violations":{"description":"Describes all violations in a client request.","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"title":"BadRequest","type":"object"},"Config":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConfigAlterOperation":{"enum":["CONFIG_ALTER_OPERATION_SET","CONFIG_ALTER_OPERATION_DELETE","CONFIG_ALTER_OPERATION_APPEND","CONFIG_ALTER_OPERATION_SUBTRACT"],"type":"string"},"ConfigSource":{"enum":["CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG","CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG","CONFIG_SOURCE_STATIC_BROKER_CONFIG","CONFIG_SOURCE_DEFAULT_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG"],"type":"string"},"ConfigSynonym":{"properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConfigType":{"enum":["CONFIG_TYPE_BOOLEAN","CONFIG_TYPE_STRING","CONFIG_TYPE_INT","CONFIG_TYPE_SHORT","CONFIG_TYPE_LONG","CONFIG_TYPE_DOUBLE","CONFIG_TYPE_LIST","CONFIG_TYPE_CLASS","CONFIG_TYPE_PASSWORD"],"type":"string"},"Configuration":{"properties":{"config_synonyms":{"description":"If no config value is set at the topic level, it will inherit the value\nset at the broker or cluster level. `name` is the corresponding config\nkey whose value is inherited. `source` indicates whether the inherited\nconfig is default, broker, etc.","items":{"$ref":"#/components/schemas/ConfigSynonym"},"type":"array"},"documentation":{"description":"Config documentation.","nullable":true,"type":"string"},"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"read_only":{"description":"Whether the config is read-only, or is dynamic and can be altered.","type":"boolean"},"sensitive":{"description":"Whether this is a sensitive config key and value.","type":"boolean"},"source":{"$ref":"#/components/schemas/ConfigSource"},"type":{"$ref":"#/components/schemas/ConfigType"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConnectCluster":{"properties":{"address":{"description":"The host address of the Kafka Connect cluster.","type":"string"},"info":{"$ref":"#/components/schemas/ConnectCluster.Info"},"name":{"description":"Unique name of connect cluster. For Redpanda Cloud, the value is `redpanda`.","type":"string"},"plugins":{"items":{"$ref":"#/components/schemas/ConnectorPlugin"},"type":"array"}},"type":"object"},"ConnectCluster.Info":{"properties":{"commit":{"description":"The git commit ID of the connect worker source code.","type":"string"},"kafka_cluster_id":{"description":"Cluster ID.","type":"string"},"version":{"description":"Connect worker version.","type":"string"}},"type":"object"},"Connector":{"properties":{"state":{"description":"State of the connector instance.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the connector is assigned to.","type":"string"}},"type":"object"},"ConnectorError":{"properties":{"content":{"description":"Detailed description of the error.","type":"string"},"title":{"description":"Short description of the error.","type":"string"},"type":{"$ref":"#/components/schemas/ConnectorError.Type"}},"title":"ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task","type":"object"},"ConnectorError.Type":{"description":"Error level.","enum":["TYPE_ERROR","TYPE_WARNING"],"type":"string"},"ConnectorHolisticState":{"description":"State of a connector or one of its tasks, as described in the [Kafka Connect documentation](https://kafka.apache.org/documentation.html#connect_administration). Takes into account not just the state of the connector instance itself, but also the tasks within the connector.\n\n - CONNECTOR_HOLISTIC_STATE_PAUSED: The connector or task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: The connector or task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: The connector is destroyed, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: The connector or task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: - The connector or task has not yet been assigned to a worker,\n- THe connector is running, but there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: The connector is running, \u003e 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: - The connector has failed,\n- The connector is running, but has no tasks,\n- Connector is running and has tasks, but all tasks have failed.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: The connector is running and has tasks, and at least one task, but not all, have failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: The connector or task state could not be determined.","enum":["CONNECTOR_HOLISTIC_STATE_PAUSED","CONNECTOR_HOLISTIC_STATE_RESTARTING","CONNECTOR_HOLISTIC_STATE_DESTROYED","CONNECTOR_HOLISTIC_STATE_STOPPED","CONNECTOR_HOLISTIC_STATE_UNASSIGNED","CONNECTOR_HOLISTIC_STATE_HEALTHY","CONNECTOR_HOLISTIC_STATE_UNHEALTHY","CONNECTOR_HOLISTIC_STATE_DEGRADED","CONNECTOR_HOLISTIC_STATE_UNKNOWN"],"type":"string"},"ConnectorInfoStatus":{"properties":{"info":{"$ref":"#/components/schemas/ConnectorSpec"},"name":{"description":"Name of connector.","type":"string"},"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"ConnectorPlugin":{"properties":{"class":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ConnectorSpec":{"description":"Connector specifications as defined in the Kafka Connect\nAPI. You may include this in the request body when creating a new connector.","properties":{"config":{"additionalProperties":{"type":"string"},"description":"Connector configuration properties.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskInfo"},"readOnly":true,"type":"array"},"type":{"readOnly":true,"type":"string"}},"required":["name","config"],"type":"object"},"ConnectorStatus":{"properties":{"connector":{"$ref":"#/components/schemas/Connector"},"errors":{"description":"List of parsed connectors' and tasks' errors.","items":{"$ref":"#/components/schemas/ConnectorError"},"type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"description":"Status of connector tasks. For more information, see the [https://docs.redpanda.com/current/deploy/deployment-option/cloud/managed-connectors/monitor-connectors/#connector-tasks](Monitor Connectors) documentation.","items":{"$ref":"#/components/schemas/TaskStatus"},"type":"array"},"type":{"description":"Type of connector (sink or source).","type":"string"}},"type":"object"},"CreateACLRequest":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.\nFor requests with resource_type CLUSTER, this will default to \"kafka-cluster\".","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","principal","host","operation","permission_type"],"type":"object"},"CreateACLResponse":{"type":"object"},"CreateConnectSecretBody":{"description":"CreateConnectSecretRequest is the request of CreateConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["name","secret_data"],"type":"object"},"CreateConnectSecretResponse":{"description":"CreateConnectSecretResponse is the response of CreateConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreateConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"CreatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"CreateSecretRequest":{"description":"CreateSecretRequest is the request of CreateSecret.","properties":{"id":{"description":"Secret identifier.","type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"CreateSecretResponse":{"description":"CreateSecretResponse is the response of CreateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreateTopicRequest.Topic":{"properties":{"configs":{"description":"An array of key-value config pairs for a topic.\nThese correspond to Kafka topic-level configs.","items":{"$ref":"#/components/schemas/Config"},"type":"array"},"name":{"description":"Name of topic.","type":"string"},"partition_count":{"description":"The number of partitions to give the topic. If specifying\npartitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default partition count, set to null.","format":"int32","nullable":true,"type":"integer"},"replica_assignments":{"description":"Manually specify broker ID assignments for partition replicas. If manually assigning replicas, both `replication_factor` and\n`partition_count` must be -1.","items":{"$ref":"#/components/schemas/ReplicaAssignment"},"type":"array"},"replication_factor":{"description":"The number of replicas every partition must have.\nIf specifying partitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default replication factor, set to null.","format":"int32","nullable":true,"type":"integer"}},"type":"object"},"CreateTopicResponse":{"properties":{"name":{"description":"Name of topic.","type":"string"},"partition_count":{"description":"The number of partitions created for the topic.\nThis field has a default value of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"},"replication_factor":{"description":"The number of replicas per topic partition.\nThis field has a default of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"}},"type":"object"},"CreateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"CreateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/CreateUserResponse.User"}},"type":"object"},"CreateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"title":"Name of newly-created user","type":"string"}},"type":"object"},"DeleteACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","operation","permission_type"],"type":"object"},"DeleteACLsResponse":{"properties":{"matching_acls":{"items":{"$ref":"#/components/schemas/MatchingACL"},"type":"array"}},"type":"object"},"DeleteConnectSecretResponse":{"description":"DeleteConnectSecretResponse is the response of DeleteConnectSecret.","type":"object"},"DeleteMountTaskResponse":{"type":"object"},"DeletePipelineResponse":{"type":"object"},"DeleteSecretResponse":{"description":"DeleteSecretResponse is the response of DeleteSecret.","type":"object"},"DeleteTopicResponse":{"type":"object"},"DeleteTransformResponse":{"type":"object"},"DeleteUserResponse":{"type":"object"},"DeployTransformRequest":{"description":"Metadata required to deploy a new Wasm\ntransform in a Redpanda cluster.","properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"The input topic to apply the transform to.","example":"orders","type":"string"},"name":{"description":"Name of the transform.","example":"redact-payment-details-in-orders","type":"string"},"output_topic_names":{"description":"Output topic to write the transform results to.","example":"orders-redacted","items":{"type":"string"},"type":"array"}},"required":["name","input_topic_name","output_topic_names"],"type":"object"},"EnvironmentVariable":{"properties":{"key":{"description":"The key of your environment variable.","example":"LOG_LEVEL","type":"string"},"value":{"description":"The value of your environment variable.","example":"DEBUG","type":"string"}},"required":["key","value"],"type":"object"},"ErrorInfo":{"description":"Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }","properties":{"domain":{"description":"The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".","type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Additional structured details about this error.\n\nKeys must match a regular expression of `[a-z][a-zA-Z0-9-_]+` but should\nideally be lowerCamelCase. Also, they must be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n`{\"instanceLimit\": \"100/request\"}`, should be returned as,\n`{\"instanceLimitPerRequest\": \"100\"}`, if the client exceeds the number of\ninstances that can be created in a single (batch) request.","type":"object"},"reason":{"description":"The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.","type":"string"}},"title":"ErrorInfo","type":"object"},"FieldViolation":{"description":"A message type used to describe a single bad request field.","properties":{"description":{"description":"A description of why the request element is bad.","type":"string"},"field":{"description":"A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.","type":"string"},"localized_message":{"$ref":"#/components/schemas/LocalizedMessage"},"reason":{"description":"The reason of the field-level error. This is a constant value that\nidentifies the proximate cause of the field-level error. It should\nuniquely identify the type of the FieldViolation within the scope of the\ngoogle.rpc.ErrorInfo.domain. This should be at most 63\ncharacters and match a regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`,\nwhich represents UPPER_SNAKE_CASE.","type":"string"}},"type":"object"},"GetConnectClusterResponse":{"properties":{"cluster":{"$ref":"#/components/schemas/ConnectCluster"}},"type":"object"},"GetConnectSecretResponse":{"description":"GetConnectSecretResponse is the response of GetConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetConnectorConfigResponse":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"GetConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"GetConnectorStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"GetMountTaskResponse":{"properties":{"task":{"$ref":"#/components/schemas/MountTask"}},"type":"object"},"GetPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"GetPipelineServiceConfigSchemaResponse":{"properties":{"config_schema":{"description":"JSON schema of the configuration components that are allowed for Connect pipelines.","type":"string"}},"type":"object"},"GetPipelinesBySecretsResponse":{"properties":{"pipelines_for_secret":{"items":{"$ref":"#/components/schemas/PipelinesForSecret"},"type":"array"}},"type":"object"},"GetPipelinesForSecretResponse":{"properties":{"pipelines_for_secret":{"$ref":"#/components/schemas/PipelinesForSecret"}},"type":"object"},"GetSecretResponse":{"description":"GetSecretResponse is the response of GetSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetTopicConfigurationsResponse":{"properties":{"configurations":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"GetTransformResponse":{"properties":{"transform":{"$ref":"#/components/schemas/TransformMetadata"}},"type":"object"},"Help":{"description":"Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.","properties":{"links":{"description":"URL(s) pointing to additional information on handling the current error.","items":{"$ref":"#/components/schemas/Link"},"type":"array"}},"title":"Help","type":"object"},"Link":{"description":"Describes a URL link.","properties":{"description":{"description":"Describes what the link offers.","type":"string"},"url":{"description":"The URL of the link.","type":"string"}},"type":"object"},"ListACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ListACLsResponse":{"properties":{"resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array"}},"type":"object"},"ListConnectClustersResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ConnectCluster"},"type":"array"}},"type":"object"},"ListConnectSecretsResponse":{"description":"ListConnectSecretsResponse is the response of ListConnectSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListConnectorTopicsResponse":{"properties":{"topics":{"description":"Topic names.","items":{"type":"string"},"type":"array"}},"type":"object"},"ListConnectorsResponse":{"properties":{"connectors":{"description":"List of connectors, where the parent key is the connector name.","items":{"$ref":"#/components/schemas/ConnectorInfoStatus"},"type":"array"},"next_page_token":{"description":"Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.","type":"string"}},"type":"object"},"ListMountTasksResponse":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/MountTask"},"type":"array"}},"type":"object"},"ListMountableTopicsResponse":{"properties":{"topics":{"items":{"$ref":"#/components/schemas/TopicLocation"},"type":"array"}},"type":"object"},"ListPipelinesRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on pipeline name. Case-sensitive.","type":"string"}},"type":"object"},"ListPipelinesResponse":{"properties":{"next_page_token":{"type":"string"},"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"}},"type":"object"},"ListSecretScopesResponse":{"description":"ListSecretScopesResponse is the response of ListSecretScopes.","properties":{"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"type":"object"},"ListSecretsFilter":{"description":"ListSecretsFilter are the filter options for listing secrets.","properties":{"labels[string][string]":{"additionalProperties":{"type":"string"},"description":"The secret labels to search for.","type":"object"},"name_contains":{"description":"Substring match on secret name. Case-sensitive.","type":"string"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes to search for","type":"array"}},"type":"object"},"ListSecretsResponse":{"description":"ListSecretsResponse is the response of ListSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListTopicsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on topic name. Case-sensitive.","type":"string"}},"type":"object"},"ListTopicsResponse":{"properties":{"next_page_token":{"type":"string"},"topics":{"items":{"$ref":"#/components/schemas/ListTopicsResponse.Topic"},"type":"array"}},"type":"object"},"ListTopicsResponse.Topic":{"properties":{"internal":{"description":"Whether topic is internal only.","type":"boolean"},"name":{"description":"Topic name.","type":"string"},"partition_count":{"description":"Topic partition count.","format":"int32","type":"integer"},"replication_factor":{"description":"Topic replication factor.","format":"int32","type":"integer"}},"type":"object"},"ListTransformsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on transform name. Case-sensitive.","type":"string"}},"type":"object"},"ListTransformsResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"transforms":{"items":{"$ref":"#/components/schemas/TransformMetadata"},"type":"array"}},"type":"object"},"ListUsersRequest.Filter":{"properties":{"name":{"description":"Username.","type":"string"},"name_contains":{"description":"Substring match on username. Case-sensitive.","type":"string"}},"type":"object"},"ListUsersResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"users":{"items":{"$ref":"#/components/schemas/ListUsersResponse.User"},"type":"array"}},"type":"object"},"ListUsersResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"}},"type":"object"},"LocalizedMessage":{"description":"Provides a localized error message that is safe to return to the user\nwhich can be attached to an RPC error.","properties":{"locale":{"title":"The locale used following the specification defined at\nhttps://www.rfc-editor.org/rfc/bcp/bcp47.txt.\nExamples are: \"en-US\", \"fr-CH\", \"es-MX\"","type":"string"},"message":{"description":"The localized error message in the above locale.","type":"string"}},"type":"object"},"MatchingACL":{"properties":{"error":{"$ref":"#/components/schemas/rpc.Status"},"host":{"description":"The host address to use for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"MountTask":{"properties":{"id":{"description":"Unique identifier for this mount task.","format":"int32","type":"integer"},"state":{"$ref":"#/components/schemas/MountTask.State"},"topics":{"description":"List of topics that are being mounted or unmounted.","items":{"$ref":"#/components/schemas/MountTask.Topic"},"type":"array"},"type":{"$ref":"#/components/schemas/MountTask.Type"}},"type":"object"},"MountTask.State":{"description":" - STATE_PLANNED: Planned: The mount task has been created and is awaiting further actions.\n - STATE_PREPARING: Preparing: The mount task is gathering resources and preparing for execution.\n - STATE_PREPARED: Prepared: All preparations are complete, and the mount task is ready to be executed.\n - STATE_EXECUTING: Executing: The mount task is actively transferring or transforming data.\n - STATE_EXECUTED: Executed: The core mount task actions are complete, but the mount task has not yet cut over or finalized.\n - STATE_CUT_OVER: Cut Over: The mount task has reached a critical point where ownership is transferred or final adjustments are made.\n - STATE_FINISHED: Finished: The mount task has been successfully completed, and no further actions are required.\n - STATE_CANCELING: Canceling: The mount task is in the process of being canceled, and rollback or cleanup actions may be in progress.\n - STATE_CANCELLED: Cancelled: The mount task has been fully canceled, and no further actions will be taken.","enum":["STATE_PLANNED","STATE_PREPARING","STATE_PREPARED","STATE_EXECUTING","STATE_EXECUTED","STATE_CUT_OVER","STATE_FINISHED","STATE_CANCELING","STATE_CANCELLED"],"type":"string"},"MountTask.Topic":{"properties":{"source_topic_reference":{"description":"The topic reference in the object storage bucket.\nThis field is only set for tasks of type MOUNT.","type":"string"},"topic_reference":{"description":"The topic reference within the current cluster, which may be either a simple topic name or a full reference\nin the form: cluster-uuid/topic-name/revision.","type":"string"}},"type":"object"},"MountTask.Type":{"description":" - TYPE_MOUNT: Mount represents the process of making topics available in a cluster by loading them from object storage.\n - TYPE_UNMOUNT: Unmount represents the process of offloading topics back to object storage.","enum":["TYPE_MOUNT","TYPE_UNMOUNT"],"type":"string"},"MountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of mount","type":"integer"}},"type":"object"},"Options":{"properties":{"include_tasks":{"description":"Restart connector's tasks.","type":"boolean"},"only_failed":{"description":"Restart only connectors that have failed.","type":"boolean"}},"type":"object"},"PartitionStatus":{"enum":["PARTITION_STATUS_RUNNING","PARTITION_STATUS_INACTIVE","PARTITION_STATUS_ERRORED","PARTITION_STATUS_UNKNOWN"],"type":"string"},"PartitionTransformStatus":{"properties":{"broker_id":{"format":"int32","type":"integer"},"lag":{"format":"int32","type":"integer"},"partition_id":{"format":"int32","type":"integer"},"status":{"$ref":"#/components/schemas/PartitionStatus"}},"type":"object"},"PermissionType":{"description":"Whether the operation should be allowed or denied.","enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"},"Pipeline":{"description":"Defines the pipeline resource.","properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","title":"The pipeline configuration in YAML.\nSee https://docs.redpanda.com/redpanda-connect/configuration/about/","type":"string"},"description":{"description":"Optional pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"id":{"description":"Pipeline ID.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"},"state":{"$ref":"#/components/schemas/Pipeline.State"},"status":{"$ref":"#/components/schemas/Pipeline.Status"}},"required":["id","display_name","config_yaml"],"type":"object"},"Pipeline.State":{"description":"State of the pipeline.\n\n - STATE_STARTING: The pipeline is starting.\n - STATE_RUNNING: The pipeline is running.\n - STATE_STOPPING: The pipeline is in the process of stopping.\n - STATE_STOPPED: The pipeline is stopped and in paused state.\n - STATE_ERROR: The pipeline encountered an error. See [Error Handling](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/error_handling/) for further guidance.\n - STATE_COMPLETED: The pipeline has completed the job successfully.","enum":["STATE_STARTING","STATE_RUNNING","STATE_STOPPING","STATE_STOPPED","STATE_ERROR","STATE_COMPLETED"],"type":"string"},"Pipeline.Status":{"description":"Pipeline status may contain an error message.","properties":{"error":{"type":"string"}},"type":"object"},"PipelineCreate":{"description":"PipelineCreate contains the details for the pipeline creation request.","properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"}},"required":["display_name","config_yaml"],"type":"object"},"PipelineUpdate":{"properties":{"config_yaml":{"description":"The Redpanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"service_account":{"$ref":"#/components/schemas/ServiceAccount"}},"required":["display_name","config_yaml"],"type":"object"},"PipelinesForSecret":{"properties":{"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"},"secret_id":{"type":"string"}},"type":"object"},"Policy":{"properties":{"host":{"description":"The host address for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"}},"type":"object"},"QuotaFailure":{"description":"Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.","properties":{"violations":{"description":"Describes all quota violations.","items":{"$ref":"#/components/schemas/QuotaFailure.Violation"},"type":"array"}},"title":"QuotaFailure","type":"object"},"QuotaFailure.Violation":{"description":"A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.","properties":{"api_service":{"description":"The API Service from which the `QuotaFailure.Violation` orginates. In\nsome cases, Quota issues originate from an API Service other than the one\nthat was called. In other words, a dependency of the called API Service\ncould be the cause of the `QuotaFailure`, and this field would have the\ndependency API service name.\n\nFor example, if the called API is Kubernetes Engine API\n(container.googleapis.com), and a quota violation occurs in the\nKubernetes Engine API itself, this field would be\n\"container.googleapis.com\". On the other hand, if the quota violation\noccurs when the Kubernetes Engine API creates VMs in the Compute Engine\nAPI (compute.googleapis.com), this field would be\n\"compute.googleapis.com\".","type":"string"},"description":{"description":"A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".","type":"string"},"future_quota_value":{"description":"The new quota value being rolled out at the time of the violation. At the\ncompletion of the rollout, this value will be enforced in place of\nquota_value. If no rollout is in progress at the time of the violation,\nthis field is not set.\n\nFor example, if at the time of the violation a rollout is in progress\nchanging the number of CPUs quota from 10 to 20, 20 would be the value of\nthis field.","format":"int64","nullable":true,"type":"string"},"quota_dimensions":{"additionalProperties":{"type":"string"},"description":"The dimensions of the violated quota. Every non-global quota is enforced\non a set of dimensions. While quota metric defines what to count, the\ndimensions specify for what aspects the counter should be increased.\n\nFor example, the quota \"CPUs per region per VM family\" enforces a limit\non the metric \"compute.googleapis.com/cpus_per_vm_family\" on dimensions\n\"region\" and \"vm_family\". And if the violation occurred in region\n\"us-central1\" and for VM family \"n1\", the quota_dimensions would be,\n\n{\n \"region\": \"us-central1\",\n \"vm_family\": \"n1\",\n}\n\nWhen a quota is enforced globally, the quota_dimensions would always be\nempty.","type":"object"},"quota_id":{"description":"The id of the violated quota. Also know as \"limit name\", this is the\nunique identifier of a quota in the context of an API service.\n\nFor example, \"CPUS-PER-VM-FAMILY-per-project-region\".","type":"string"},"quota_metric":{"description":"The metric of the violated quota. A quota metric is a named counter to\nmeasure usage, such as API requests or CPUs. When an activity occurs in a\nservice, such as Virtual Machine allocation, one or more quota metrics\nmay be affected.\n\nFor example, \"compute.googleapis.com/cpus_per_vm_family\",\n\"storage.googleapis.com/internet_egress_bandwidth\".","type":"string"},"quota_value":{"description":"The enforced quota value at the time of the `QuotaFailure`.\n\nFor example, if the enforced quota value at the time of the\n`QuotaFailure` on the number of CPUs is \"10\", then the value of this\nfield would reflect this quantity.","format":"int64","type":"string"},"subject":{"description":"The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".","type":"string"}},"type":"object"},"ReplicaAssignment":{"properties":{"partition_id":{"description":"A partition to create.","format":"int32","type":"integer"},"replica_ids":{"description":"The broker IDs the partition replicas are assigned to.","items":{"format":"int32","type":"integer"},"type":"array"}},"type":"object"},"Resource":{"properties":{"acls":{"items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ResourcePatternType":{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"},"ResourceType":{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"},"Resources":{"properties":{"cpu_shares":{"description":"`cpu_shares` is a string specifying the amount of CPU to allocate for the\npipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable\nunits include:\n- Decimal SI units: \"m\" (e.g., \"500m\" for 500 millicores, \"2\" for 2 cores)\nCPU shares can be specified in millicores (1 core = 1000 millicores).\nIf you don't specify a unit, the value is interpreted as the number of cores.","type":"string"},"memory_shares":{"description":"`memory_shares` is a string specifying the amount of memory to allocate for\nthe pipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable units\ninclude:\n- Decimal SI units: \"K\", \"M\", \"G\", \"T\", \"P\", \"E\" (e.g., \"128M\" for 128\n megabytes)\n- Binary SI units: \"Ki\", \"Mi\", \"Gi\", \"Ti\", \"Pi\", \"Ei\" (e.g., \"512Mi\" for\n512 mebibytes) If you don't specify a unit, the value is interpreted as\nbytes.","type":"string"}},"required":["memory_shares","cpu_shares"],"type":"object"},"SASLMechanism":{"description":"SASL mechanism to use for authentication.","enum":["SASL_MECHANISM_SCRAM_SHA_256","SASL_MECHANISM_SCRAM_SHA_512"],"type":"string"},"Scope":{"description":"Defines the scope of a secret.","enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"Secret":{"description":"Defines the secret resource.","properties":{"id":{"description":"Secret identifier.","readOnly":true,"type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"}},"type":"object"},"ServiceAccount":{"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"}},"type":"object"},"SetConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"SetTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after this update.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"StartPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"StopPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"TaskInfo":{"properties":{"connector":{"description":"Name of connector.","type":"string"},"task":{"description":"The connector task ID.","format":"int32","type":"integer"}},"type":"object"},"TaskStatus":{"properties":{"id":{"description":"The connector task ID.","format":"int32","type":"integer"},"state":{"description":"State of connector task.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the task is assigned to.","type":"string"}},"type":"object"},"TopicLocation":{"properties":{"name":{"description":"Topic name.","type":"string"},"topic_location":{"description":"Full reference for the unmounted topic in this format: `topic-name/cluster-uuid/revision`.\nUse this as unique identifier for mounting a topic if there are multiple topics available\nwith the same name.","type":"string"}},"type":"object"},"TopicMount":{"description":"TopicMount defines the migration of a topic from the cloud storage into this cluster,\nso that it becomes available via the Kafka API.","properties":{"alias":{"description":"Alias may be provided to mount the topic under a different name. Leave\nblank to re-use the source topic name. The alias does not persist if you\nunmount the topic again.","type":"string"},"source_topic_reference":{"description":"The topic name or full reference of the topic to mount. The full reference\nmust be used in case the same topic exists more than once. This may be the case if\nthe same topic has been unmounted multiple times. List all mountable topics to\nfind the full reference (contains topic name, cluster uuid and revision).","type":"string"}},"required":["source_topic_reference"],"type":"object"},"TransformMetadata":{"properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"Input topic to apply the transform to.","type":"string"},"name":{"description":"Name of transform.","type":"string"},"output_topic_names":{"description":"Output topics to write the transform results to.","items":{"type":"string"},"type":"array"},"statuses":{"items":{"$ref":"#/components/schemas/PartitionTransformStatus"},"type":"array"}},"type":"object"},"UnmountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of unmount","type":"integer"}},"type":"object"},"UpdateConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"operation":{"$ref":"#/components/schemas/ConfigAlterOperation"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"UpdateConnectSecretBody":{"description":"UpdateConnectSecretRequest is the request of UpdateConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateConnectSecretResponse":{"description":"UpdateConnectSecretResponse is the response of UpdateConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateMountTaskBody":{"properties":{"action":{"$ref":"#/components/schemas/Action"}},"required":["action"],"type":"object"},"UpdateMountTaskResponse":{"type":"object"},"UpdatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"UpdateSecretBody":{"description":"UpdateSecretRequest is the request of UpdateSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateSecretResponse":{"description":"UpdateSecretResponse is the response of UpdateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after applying this partial patch.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"UpdateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"UpdateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UpdateUserResponse.User"}},"type":"object"},"UpdateUserResponse.User":{"description":"Updated user's name and SASL mechanism.","properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"UpsertConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"rpc.Status":{"description":"The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).","properties":{"code":{"description":"RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).","enum":["OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","UNAUTHENTICATED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","INTERNAL","UNAVAILABLE","DATA_LOSS"],"format":"int32","type":"string"},"details":{"items":{"description":"Details of the error.","oneOf":[{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.BadRequest"],"type":"string"}}},{"$ref":"#/components/schemas/BadRequest"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.ErrorInfo"],"type":"string"}}},{"$ref":"#/components/schemas/ErrorInfo"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.QuotaFailure"],"type":"string"}}},{"$ref":"#/components/schemas/QuotaFailure"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.Help"],"type":"string"}}},{"$ref":"#/components/schemas/Help"}]}]},"type":"array"},"message":{"description":"Detailed error message. No compatibility guarantees are given for the text contained in this message.","type":"string"}},"type":"object"}},"securitySchemes":{"auth0":{"description":"RedpandaCloud","flows":{"implicit":{"authorizationUrl":"https://auth.prd.cloud.redpanda.com/oauth/authorize","scopes":{},"x-client-id":"dQjapNIAHhF7EQqQToRla3yEII9sUSap"}},"type":"oauth2"}}},"info":{"title":"Redpanda Cloud Data Plane API","version":"v1alpha2"},"openapi":"3.0.3","paths":{"/v1alpha2/acls":{"delete":{"description":"Delete all ACLs that match the filter criteria. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_DeleteACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","required":true,"schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","required":true,"schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","required":true,"schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","required":true,"schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete ACLs","tags":["Redpanda ACLs (v1alpha2)"]},"get":{"description":"List all ACLs. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_ListACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List ACLs","tags":["Redpanda ACLs (v1alpha2)"]},"post":{"description":"Create a new ACL.","operationId":"ACLService_CreateACL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLResponse"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create ACL","tags":["Redpanda ACLs (v1alpha2)"]}},"/v1alpha2/cloud-storage/mount-tasks":{"get":{"description":"This operation retrieves the status of a task responsible for mounting or unmounting topics. It provides details on the task’s type (mount or unmount), its current state, and the topics involved.","operationId":"CloudStorageService_ListMountTasks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountTasksResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the mount task status","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/mount-tasks/{id}":{"delete":{"description":"Delete a mount or unmount by ID.","operationId":"CloudStorageService_DeleteMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to delete.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a mount or unmount","tags":["Cloud Storage (v1alpha2)"]},"get":{"description":"Retrieves the status of a mount or unmount by ID. The response provides details on the operation type (mount or unmount), its current state, and the topics involved. Use the ID returned when you start the mount or unmount, or use the ListMountTasks endpoint to retrieve a list of IDs.","operationId":"CloudStorageService_GetMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to retrieve.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get the status of a mount or unmount by ID","tags":["Cloud Storage (v1alpha2)"]},"post":{"description":"This operation allows performing an action on an ongoing mount task.","operationId":"CloudStorageService_UpdateMountTask","parameters":[{"description":"ID is the unique identifier of the mount or unmount to update.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a mount or unmount","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/mount":{"post":{"description":"Attach mountable topics from object storage to a cluster, making them available for consumption and production again. Mounting a topic reloads its data and state to the local brokers, allowing active use of the topic.","operationId":"CloudStorageService_MountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TopicMount"},"required":["topics"],"type":"array"}}},"required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Mount topics from object storage","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/mountable":{"get":{"description":"Retrieve all topics that are currently unmounted and available to be mounted to the cluster. These topics reside in object storage and can be mounted for consumption or production within the cluster.","operationId":"CloudStorageService_ListMountableTopics","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountableTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List mountable topics","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/cloud-storage/topics/unmount":{"post":{"description":"Unmount topics to object storage, freeing up all local cluster resources. Once you unmount a topic, it can no longer be consumed or produced to. It detaches from the active cluster while its data remains safely stored in the external object storage.","operationId":"CloudStorageService_UnmountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"required":["topics"],"type":"array"}}},"description":"List of topics to unmount.","required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Unmount topics to object storage","tags":["Cloud Storage (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters":{"get":{"description":"List connect clusters available for being consumed by the console's kafka-connect service.","operationId":"KafkaConnectService_ListConnectClusters","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectClustersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connect clusters","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}":{"get":{"description":"Get information about an available Kafka Connect cluster.","operationId":"KafkaConnectService_GetConnectCluster","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectCluster"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Connect cluster not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connect cluster","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors":{"get":{"description":"List connectors managed by the Kafka Connect service.","operationId":"KafkaConnectService_ListConnectors","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connectors","tags":["Kafka Connect (v1alpha2)"]},"post":{"description":"Create a connector with the specified configuration.","operationId":"KafkaConnectService_CreateConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"required":true,"x-originalParamName":"connector"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}":{"delete":{"description":"Delete a connector. This operation force stops all tasks and also deletes the connector configuration.","operationId":"KafkaConnectService_DeleteConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete connector","tags":["Kafka Connect (v1alpha2)"]},"get":{"description":"Get information about a connector in a specific cluster.","operationId":"KafkaConnectService_GetConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/config":{"get":{"description":"Get the configuration for the connector.","operationId":"KafkaConnectService_GetConnectorConfig","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector configuration","tags":["Kafka Connect (v1alpha2)"]},"put":{"description":"Update the configuration for an existing connector with the specified name, or create a new connector using the given configuration. Returns information about the connector after the change has been made.","operationId":"KafkaConnectService_UpsertConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector. If a connector with this name does not already exist, a new connector is created.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"required":["config"],"type":"object"}}},"description":"Connector configuration property.","required":true,"x-originalParamName":"config"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Updated"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Upsert connector configuration","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/pause":{"put":{"description":"Pause the connector and its tasks, which stops messages from processing until the connector is resumed. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_PauseConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Pause request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Pause connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/restart":{"post":{"description":"Triggers a connector restart. You must specify whether or not tasks are also restarted, and whether only failed connectors are restarted.","operationId":"KafkaConnectService_RestartConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}},"required":true,"x-originalParamName":"options"},"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Restart connector request success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Restart connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/resume":{"put":{"description":"Resume a paused connector and its tasks, and resumes message processing. This call is asynchronous and may take some time to process. If the connector was not paused, this operation does not do anything.","operationId":"KafkaConnectService_ResumeConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Resume request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Resume connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/status":{"get":{"description":"Gets the current status of the connector, including the state for each of its tasks, error information, etc.","operationId":"KafkaConnectService_GetConnectorStatus","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorStatus"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector status","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/stop":{"put":{"description":"Stops a connector, but does not delete it. All tasks for the connector are shut down completely. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_StopConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stop connector","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics":{"get":{"description":"Returns a list of connector topic names. If the connector is inactive, this call returns an empty list.","operationId":"KafkaConnectService_ListConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connector topics","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics/reset":{"put":{"description":"Resets the set of topic names that the connector is using.","operationId":"KafkaConnectService_ResetConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector using the topics to be reset.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Reset connector topics","tags":["Kafka Connect (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/secrets":{"get":{"description":"List Kafka Connect cluster secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListConnectSecrets","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string][string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Connect Cluster Secrets","tags":["Secrets (v1alpha2)"]},"post":{"description":"Create a Kafka Connect cluster secret.","operationId":"SecretService_CreateConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Connect Cluster Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/kafka-connect/clusters/{cluster_name}/secrets/{id}":{"delete":{"description":"Delete a Kafka Connect cluster secret.","operationId":"SecretService_DeleteConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Connect Cluster Secret","tags":["Secrets (v1alpha2)"]},"get":{"description":"Get a specific Kafka Connect cluster secret.","operationId":"SecretService_GetConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"The ID of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Connect Cluster Secret","tags":["Secrets (v1alpha2)"]},"put":{"description":"Update a Kafka Connect cluster secret.","operationId":"SecretService_UpdateConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to update.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Connect Cluster Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/redpanda-connect/config-schema":{"get":{"description":"The configuration schema includes available [components and processors](https://docs.redpanda.com/redpanda-cloud/develop/connect/components/about) in this Redpanda Connect instance.","operationId":"PipelineService_GetPipelineServiceConfigSchema","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelineServiceConfigSchemaResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the schema for Redpanda Connect pipeline configurations.","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines":{"get":{"description":"List Redpanda Connect pipelines. Optional: filter based on pipeline name.","operationId":"PipelineService_ListPipelines","parameters":[{"description":"Substring match on pipeline name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPipelinesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Redpanda Connect pipelines","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"post":{"description":"Create a new Redpanda Connect pipeline.","operationId":"PipelineService_CreatePipeline","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineCreate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines-by-secrets":{"get":{"description":"Get Redpanda Connect pipelines by secrets.","operationId":"PipelineService_GetPipelinesBySecrets","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesBySecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines by secrets","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines-for-secret":{"get":{"description":"Get Redpanda Connect pipelines for a given secret.","operationId":"PipelineService_GetPipelinesForSecret","parameters":[{"description":"Secret ID.","in":"query","name":"secret_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesForSecretResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines for secret","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}":{"delete":{"description":"Delete a Redpanda Connect pipeline.","operationId":"PipelineService_DeletePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"get":{"description":"Get a specific Redpanda Connect pipeline.","operationId":"PipelineService_GetPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]},"put":{"description":"Update the [configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) of a Redpanda Connect pipeline.","operationId":"PipelineService_UpdatePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineUpdate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}/start":{"put":{"description":"Start a stopped Redpanda Connect pipeline.","operationId":"PipelineService_StartPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Started"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Start a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/redpanda-connect/pipelines/{id}/stop":{"put":{"description":"Stop a running Redpanda Connect pipeline.","operationId":"PipelineService_StopPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Stopped"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stops a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline (v1alpha2)"]}},"/v1alpha2/secret-scopes":{"get":{"description":"List supported secret scopes.","operationId":"SecretService_ListSecretScopes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretScopesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secret Scopes","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/secrets":{"get":{"description":"List secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListSecrets","parameters":[{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secrets","tags":["Secrets (v1alpha2)"]},"post":{"description":"Create a secret.","operationId":"SecretService_CreateSecret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"description":"CreateSecretRequest is the request of CreateSecret.","required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/secrets/{id}":{"delete":{"description":"Delete a secret.","operationId":"SecretService_DeleteSecret","parameters":[{"description":"The id of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Secret","tags":["Secrets (v1alpha2)"]},"get":{"description":"Get a secret.","operationId":"SecretService_GetSecret","parameters":[{"description":"The id of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Secret","tags":["Secrets (v1alpha2)"]},"put":{"description":"Update a secret.","operationId":"SecretService_UpdateSecret","parameters":[{"description":"Secret identifier.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Secret","tags":["Secrets (v1alpha2)"]}},"/v1alpha2/topics":{"get":{"description":"List topics, with partition count and replication factor. Optional: filter based on topic name.","operationId":"TopicService_ListTopics","parameters":[{"description":"Substring match on topic name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Topics","tags":["Topics (v1alpha2)"]},"post":{"description":"Create a [topic](https://docs.redpanda.com/current/deploy/deployment-option/cloud/create-topic/).","operationId":"TopicService_CreateTopic","parameters":[{"description":"If true, makes this request a dry run; everything is validated but\nno topics are actually created.","in":"query","name":"validate_only","schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequest.Topic"}}},"description":"The topic to create.","required":true,"x-originalParamName":"topic"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicResponse"}}},"description":"Topic created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Topic","tags":["Topics (v1alpha2)"]}},"/v1alpha2/topics/{name}":{"delete":{"description":"Delete the Kafka topic with the requested name.","operationId":"TopicService_DeleteTopic","parameters":[{"description":"Topic name.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Topic deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Requested topic does not exist"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Topic","tags":["Topics (v1alpha2)"]}},"/v1alpha2/topics/{topic_name}/configurations":{"get":{"description":"Get key-value configs for a topic.","operationId":"TopicService_GetTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Topic Configurations","tags":["Topics (v1alpha2)"]},"patch":{"description":"Update a subset of the topic configurations.","operationId":"TopicService_UpdateTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpdateConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Topic Configuration","tags":["Topics (v1alpha2)"]},"put":{"description":"Update the entire set of key-value configurations for a topic. Config entries that are not provided in the request are removed and will fall back to their default values.","operationId":"TopicService_SetTopicConfigurations","parameters":[{"description":"Name of topic.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SetConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Configurations","tags":["Topics (v1alpha2)"]}},"/v1alpha2/transforms":{"get":{"description":"Retrieve a list of Wasm transforms. Optional: filter based on transform name.","operationId":"TransformService_ListTransforms","parameters":[{"description":"Substring match on transform name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","transforms":[{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic11","output-topic12"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]},{"environment_variables":[],"input_topic_name":"topic2","name":"transform2","output_topic_names":["output-topic21","output-topic22"],"statuses":[{"broker_id":2,"lag":2,"partition_id":2,"status":"PARTITION_STATUS_RUNNING"}]}]},"schema":{"$ref":"#/components/schemas/ListTransformsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Transforms","tags":["WASM Transforms (v1alpha2)"]},"put":{"description":"Initiate deployment of a new Wasm transform. This endpoint uses multipart/form-data encoding. Following deployment, a brief period is required before the Wasm transform becomes operational. Monitor the partition statuses to check whether the transform is active. This usually takes around 3s, but no longer than 10s.","operationId":"TransformService_DeployTransform","requestBody":{"content":{"multipart/form-data":{"schema":{"example":"{\"name\":\"redact-orders\", \"input_topic_name\":\"orders\", \"output_topic_names\":[\"orders-redacted\"], \"environment_variables\":[{\"key\":\"LOGGER_LEVEL\", \"value\":\"DEBUG\"}]}","properties":{"metadata":{"$ref":"#/components/schemas/DeployTransformRequest"},"wasm_binary":{"description":"Binary file containing the compiled WASM transform. The maximum size for this file is 10MiB.","format":"binary","type":"string"}},"type":"object"}}},"description":"Transform metadata as well as the WASM binary","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformMetadata"}}},"description":"Created"}},"summary":"Deploy Transform","tags":["WASM Transforms (v1alpha2)"]}},"/v1alpha2/transforms/{name}":{"delete":{"description":"Delete a Wasm transform with the requested name.","operationId":"TransformService_DeleteTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"Transform deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Transform","tags":["WASM Transforms (v1alpha2)"]},"get":{"description":"Get a specific Wasm transform.","operationId":"TransformService_GetTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"transform":{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic1","output-topic2"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]}},"schema":{"$ref":"#/components/schemas/GetTransformResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Transform","tags":["WASM Transforms (v1alpha2)"]}},"/v1alpha2/users":{"get":{"description":"List users. Optional: filter based on username.","operationId":"UserService_ListUsers","parameters":[{"description":"Username.","in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"Substring match on username. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","users":[{"name":"payment-service"},{"name":"jane"}]},"schema":{"$ref":"#/components/schemas/ListUsersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Users","tags":["Redpanda Users (v1alpha2)"]},"post":{"description":"Create a new user.","operationId":"UserService_CreateUser","requestBody":{"content":{"application/json":{"example":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service","password":"secure-password"},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"required":true,"x-originalParamName":"user"},"responses":{"201":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"description":"User created"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password","localized_message":null,"reason":""},{"description":"value is required","field":"user.mechanism","localized_message":null,"reason":""}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create User","tags":["Redpanda Users (v1alpha2)"]}},"/v1alpha2/users/{name}":{"delete":{"description":"Delete the specified user","operationId":"UserService_DeleteUser","parameters":[{"description":"Username","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"User deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"example":{"code":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_RESOURCE_NOT_FOUND"}],"message":"user not found"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete User","tags":["Redpanda Users (v1alpha2)"]}},"/v1alpha2/users/{user.name}":{"put":{"description":"Update a user's credentials.","operationId":"UserService_UpdateUser","parameters":[{"description":"Username.","in":"path","name":"user.name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","password":"new-password"}},"schema":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"password":{"description":"Password.","type":"string"}},"type":"object"}}},"required":true,"x-originalParamName":"user"},"responses":{"200":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/UpdateUserResponse.User"}}},"description":"OK"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password","localized_message":null,"reason":""},{"description":"value is required","field":"user.mechanism","localized_message":null,"reason":""}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update User","tags":["Redpanda Users (v1alpha2)"]}}},"security":[{"auth0":[]}],"servers":[{"description":"Data Plane API","url":"{dataplane_api_url}","variables":{"dataplane_api_url":{"default":"https://{dataplane_api_url}","description":"Find the Data Plane API base URL of a cluster by calling the Get Cluster endpoint of the Control Plane API. The dataplane_api.url field is returned in the response body.\u003cbr\u003e\u003cbr\u003e\n\t\t\t\t\tExample (Dedicated): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\"\u003cbr\u003e\n\t\t\t\t\tExample (BYOC): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com\""}}}],"tags":[{"description":"Manage Redpanda access control lists (ACLs). See [Redpanda Cloud Authorization](https://docs.redpanda.com/redpanda-cloud/security/authorization/cloud-authorization/) for more information.","name":"Redpanda ACLs (v1alpha2)"},{"description":"Manage Redpanda topics stored in object storage. See: [Mountable Topics](https://docs.redpanda.com/redpanda-cloud/manage/mountable-topics/)","name":"Cloud Storage (v1alpha2)"},{"description":"Manage Wasm transforms in Redpanda.","name":"WASM Transforms (v1alpha2)"},{"description":"Manage [connectors](https://docs.redpanda.com/redpanda-cloud/develop/managed-connectors/) and interact with the Kafka Connect API.","name":"Kafka Connect (v1alpha2)"},{"description":"Create and manage [Redpanda Connect](https://docs.redpanda.com/redpanda-cloud/develop/connect/about) pipelines and their configurations.","name":"Redpanda Connect Pipeline (v1alpha2)"},{"description":"Manage [secrets](https://docs.redpanda.com/redpanda-cloud/security/secrets) for Redpanda Cloud.","name":"Secrets (v1alpha2)"},{"description":"Manage Redpanda topics.","name":"Topics (v1alpha2)"},{"description":"Manage Redpanda users. To manage access, see the Data Plane [ACL endpoints](https://docs.redpanda.com/api/cloud-dataplane-api/#get-/v1alpha2/acls).","name":"Redpanda Users (v1alpha2)"}]} \ No newline at end of file diff --git a/proto/gen/openapi/openapi.v1alpha2.yaml b/proto/gen/openapi/openapi.v1alpha2.yaml index 9098ca21d7..6d606c892d 100644 --- a/proto/gen/openapi/openapi.v1alpha2.yaml +++ b/proto/gen/openapi/openapi.v1alpha2.yaml @@ -4375,7 +4375,7 @@ paths: content: multipart/form-data: schema: - example: '{"name":"redact-orders","input_topic_name":"orders","output_topic_names":["orders-redacted"],"environment_variables":[{"key":"LOGGER_LEVEL","value":"DEBUG"}]}' + example: '{"name":"redact-orders", "input_topic_name":"orders", "output_topic_names":["orders-redacted"], "environment_variables":[{"key":"LOGGER_LEVEL", "value":"DEBUG"}]}' properties: metadata: $ref: '#/components/schemas/DeployTransformRequest' diff --git a/taskfiles/proto.yaml b/taskfiles/proto.yaml index 39639312d2..9872e8162f 100644 --- a/taskfiles/proto.yaml +++ b/taskfiles/proto.yaml @@ -59,6 +59,7 @@ tasks: - for: { var: BUF_INPUTS } cmd: "{{ .PATH_PREFIX }} buf generate --template=buf.gen.yaml {{ .ITEM }}" - "{{ .PATH_PREFIX }} buf generate --template=buf.gen.yaml buf.build/redpandadata/common" + - "{{ .PATH_PREFIX }} buf generate --template=buf.gen.yaml buf.build/redpandadata/ai-gateway" - task: :backend:fmt - task: generate-openapi3 - if [[ $CI == "true" ]]; then git diff -w --exit-code; fi From 7d3291275d3121e1b86c60f1147cd98d8532c4fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Fri, 23 Jan 2026 12:52:35 +0100 Subject: [PATCH 02/12] fix: add missing isLoadingGateways prop and remove duplicate gatewayId in initialValues - Add isLoadingGateways to LLMConfigSectionProps interface - Remove duplicate gatewayId property from initialValues object Fixes TypeScript compilation errors. --- frontend/src/components/pages/agents/create/schemas.ts | 1 - frontend/src/components/ui/ai-agent/llm-config-section.tsx | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/agents/create/schemas.ts b/frontend/src/components/pages/agents/create/schemas.ts index b881723542..3ff54408e6 100644 --- a/frontend/src/components/pages/agents/create/schemas.ts +++ b/frontend/src/components/pages/agents/create/schemas.ts @@ -160,5 +160,4 @@ export const initialValues: FormValues = { systemPrompt: '', serviceAccountName: '', subagents: [], - gatewayId: '', }; diff --git a/frontend/src/components/ui/ai-agent/llm-config-section.tsx b/frontend/src/components/ui/ai-agent/llm-config-section.tsx index c7e79813e0..f3975fdaed 100644 --- a/frontend/src/components/ui/ai-agent/llm-config-section.tsx +++ b/frontend/src/components/ui/ai-agent/llm-config-section.tsx @@ -55,6 +55,7 @@ export interface LLMConfigSectionProps { showBaseUrl?: boolean; showMaxIterations?: boolean; hasGatewayDeployed?: boolean; + isLoadingGateways?: boolean; availableGateways?: Array<{ id: string; displayName: string; description?: string }>; } From c9246f84eb3e3263d602e607f1f91f1598fb4da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Fri, 23 Jan 2026 16:58:53 +0100 Subject: [PATCH 03/12] fix: address code review comments - Run Biome formatter to fix import ordering and code style - Change pageSize from 1000 to 100 for gateway queries - Rename useLegacyApiKeyMode to isLegacyApiKeyMode (non-hook variable) - Clarify proxy configuration supports both Console backend and AI Gateway - Update useEffect dependencies for exhaustive deps check --- .../agents/create/ai-agent-create-page.tsx | 18 +++++++++--------- frontend/src/react-query/api/ai-gateway.tsx | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx index dc783bd2a1..3111fa6363 100644 --- a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx +++ b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx @@ -75,24 +75,24 @@ export const AIAgentCreatePage = () => { }); // Feature flag: when true, use legacy API key mode (hardcoded providers) - const useLegacyApiKeyMode = isFeatureFlagEnabled('enableApiKeyConfigurationAgent'); + const isLegacyApiKeyMode = isFeatureFlagEnabled('enableApiKeyConfigurationAgent'); // Gateway detection and list query (using v1 API from ai-gateway module) // Only fetch when NOT in legacy mode const { data: gatewaysData, isLoading: isLoadingGateways } = useListGatewaysQuery( - { pageSize: 1000 }, // Get all gateways (max 1000) - { enabled: !useLegacyApiKeyMode } + { pageSize: 100 }, + { enabled: !isLegacyApiKeyMode } ); const hasGatewayDeployed = useMemo(() => { - if (useLegacyApiKeyMode || isLoadingGateways) { + if (isLegacyApiKeyMode || isLoadingGateways) { return false; } return Boolean(gatewaysData?.gateways && gatewaysData.gateways.length > 0); - }, [useLegacyApiKeyMode, gatewaysData, isLoadingGateways]); + }, [isLegacyApiKeyMode, gatewaysData, isLoadingGateways]); const availableGateways = useMemo(() => { - if (useLegacyApiKeyMode || !gatewaysData?.gateways) { + if (isLegacyApiKeyMode || !gatewaysData?.gateways) { return []; } return gatewaysData.gateways.map((gw) => { @@ -104,7 +104,7 @@ export const AIAgentCreatePage = () => { description: gw.description, }; }); - }, [useLegacyApiKeyMode, gatewaysData]); + }, [isLegacyApiKeyMode, gatewaysData]); // Ref to ServiceAccountSelector to call createServiceAccount const serviceAccountSelectorRef = useRef(null); @@ -143,10 +143,10 @@ export const AIAgentCreatePage = () => { // Auto-select first gateway when gateways are available (only if not in legacy mode) useEffect(() => { - if (!useLegacyApiKeyMode && availableGateways.length > 0 && !form.getValues('gatewayId')) { + if (!isLegacyApiKeyMode && availableGateways.length > 0 && !form.getValues('gatewayId')) { form.setValue('gatewayId', availableGateways[0].id); } - }, [useLegacyApiKeyMode, availableGateways.length, form]); + }, [isLegacyApiKeyMode, availableGateways.length, form]); const { fields: tagFields, diff --git a/frontend/src/react-query/api/ai-gateway.tsx b/frontend/src/react-query/api/ai-gateway.tsx index 6cb651fabd..c10b533de5 100644 --- a/frontend/src/react-query/api/ai-gateway.tsx +++ b/frontend/src/react-query/api/ai-gateway.tsx @@ -9,18 +9,18 @@ import { ListGatewaysRequestSchema, type ListGatewaysResponse, } from 'protogen/redpanda/api/aigateway/v1/gateway_pb'; +import { listGateways } from 'protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery'; import { type ListModelProvidersRequest, ListModelProvidersRequestSchema, type ListModelProvidersResponse, } from 'protogen/redpanda/api/aigateway/v1/model_providers_pb'; +import { listModelProviders } from 'protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery'; import { type ListModelsRequest, ListModelsRequestSchema, type ListModelsResponse, } from 'protogen/redpanda/api/aigateway/v1/models_pb'; -import { listGateways } from 'protogen/redpanda/api/aigateway/v1/gateway-GatewayService_connectquery'; -import { listModelProviders } from 'protogen/redpanda/api/aigateway/v1/model_providers-ModelProvidersService_connectquery'; import { listModels } from 'protogen/redpanda/api/aigateway/v1/models-ModelsService_connectquery'; import type { MessageInit, QueryOptions } from 'react-query/react-query.utils'; @@ -46,8 +46,8 @@ export const useListGatewaysQuery = ( return useQuery(listGateways, listGatewaysRequest, { enabled: options?.enabled, transport, - staleTime: 60000, // 1 minute - prevent excessive refetching - gcTime: 300000, // 5 minutes cache + staleTime: 60_000, // 1 minute - prevent excessive refetching + gcTime: 300_000, // 5 minutes cache refetchOnWindowFocus: false, refetchOnMount: false, refetchOnReconnect: false, @@ -73,8 +73,8 @@ export const useListModelProvidersQuery = ( return useQuery(listModelProviders, listModelProvidersRequest, { enabled: options?.enabled, transport, - staleTime: 60000, // 1 minute - prevent excessive refetching - gcTime: 300000, // 5 minutes cache + staleTime: 60_000, // 1 minute - prevent excessive refetching + gcTime: 300_000, // 5 minutes cache refetchOnWindowFocus: false, refetchOnMount: false, refetchOnReconnect: false, @@ -105,8 +105,8 @@ export const useListModelsQuery = ( return useQuery(listModels, listModelsRequest, { enabled: options?.enabled, transport, - staleTime: 60000, // 1 minute - prevent excessive refetching - gcTime: 300000, // 5 minutes cache + staleTime: 60_000, // 1 minute - prevent excessive refetching + gcTime: 300_000, // 5 minutes cache refetchOnWindowFocus: false, refetchOnMount: false, refetchOnReconnect: false, From 1a9c9b875e6c1de9ee45af690890ed6f7fe7f39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Mon, 26 Jan 2026 12:32:12 +0100 Subject: [PATCH 04/12] feat(frontend): enhance AI Gateway integration with edit support and gateway display Add comprehensive AI Gateway support across agent lifecycle: - Display gateway info on agent details page (read-only field) - Load providers and models from AI Gateway API on edit screen - Hide API token field when agent uses gateway (create and edit) - Strip API-specific prefixes from provider and model names - Auto-select first enabled provider and model in create mode - Configure console dev server on port 3004 for module federation Co-Authored-By: Claude Sonnet 4.5 --- frontend/rsbuild.config.ts | 1 + .../agents/create/ai-agent-create-page.tsx | 2 +- .../details/ai-agent-configuration-tab.tsx | 386 +++++++++++------- .../ui/ai-agent/llm-config-section.tsx | 206 +++++++--- .../src/hooks/use-ai-gateway-transport.ts | 7 +- 5 files changed, 399 insertions(+), 203 deletions(-) diff --git a/frontend/rsbuild.config.ts b/frontend/rsbuild.config.ts index d6cee293d1..caa634ad48 100644 --- a/frontend/rsbuild.config.ts +++ b/frontend/rsbuild.config.ts @@ -48,6 +48,7 @@ export default defineConfig({ }, }, server: { + port: 3004, htmlFallback: 'index', cors: { origin: ['http://localhost:3000', 'http://localhost:9090'], diff --git a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx index 3111fa6363..d751049611 100644 --- a/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx +++ b/frontend/src/components/pages/agents/create/ai-agent-create-page.tsx @@ -146,7 +146,7 @@ export const AIAgentCreatePage = () => { if (!isLegacyApiKeyMode && availableGateways.length > 0 && !form.getValues('gatewayId')) { form.setValue('gatewayId', availableGateways[0].id); } - }, [isLegacyApiKeyMode, availableGateways.length, form]); + }, [isLegacyApiKeyMode, availableGateways, form]); const { fields: tagFields, diff --git a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx index 9a6e4f5a17..c240fc344a 100644 --- a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx +++ b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx @@ -65,6 +65,7 @@ import { } from 'protogen/redpanda/api/dataplane/v1alpha3/ai_agent_pb'; import { useCallback, useMemo, useState } from 'react'; import { useGetAIAgentQuery, useUpdateAIAgentMutation } from 'react-query/api/ai-agent'; +import { useListGatewaysQuery, useListModelProvidersQuery, useListModelsQuery } from 'react-query/api/ai-gateway'; import { type MCPServer, useListMCPServersQuery } from 'react-query/api/remote-mcp'; import { useListSecretsQuery } from 'react-query/api/secret'; import { toast } from 'sonner'; @@ -312,31 +313,14 @@ export const AIAgentConfigurationTab = () => { const { mutateAsync: updateAIAgent, isPending: isUpdateAIAgentPending } = useUpdateAIAgentMutation(); const { data: mcpServersData } = useListMCPServersQuery(); const { data: secretsData } = useListSecretsQuery(); + const { data: gatewaysData } = useListGatewaysQuery(); const [isEditing, setIsEditing] = useState(false); const [editedAgentData, setEditedAgentData] = useState(null); const [expandedSubagent, setExpandedSubagent] = useState(undefined); - // Get available MCP servers - const availableMcpServers = useMemo(() => { - if (!mcpServersData?.mcpServers || mcpServersData.mcpServers.length === 0) { - return []; - } - return mcpServersData.mcpServers; - }, [mcpServersData]); - - // Get available secrets for API key dropdown - const availableSecrets = useMemo(() => { - if (!secretsData?.secrets) { - return []; - } - return secretsData.secrets - .filter((secret): secret is NonNullable & { id: string } => !!secret?.id) - .map((secret) => ({ - id: secret.id, - name: secret.id, - })); - }, [secretsData]); + // Check if agent is using gateway + const isUsingGateway = !!aiAgentData?.aiAgent?.gateway?.virtualGatewayId; const getResourceTierFromAgent = useCallback((resources?: { cpuShares?: string; memoryShares?: string }) => { if (!resources) { @@ -352,12 +336,11 @@ export const AIAgentConfigurationTab = () => { return matchingTier?.id || 'Small'; }, []); - // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: not sure how this slipped through CI - const getCurrentData = useCallback((): LocalAIAgent | null => { + // Get current provider for filtering models + const displayData = useMemo(() => { if (editedAgentData) { return editedAgentData; } - if (aiAgentData?.aiAgent?.provider) { const provider = aiAgentData.aiAgent.provider; const { apiKeyTemplate, baseUrl } = extractProviderInfo(provider); @@ -405,84 +388,171 @@ export const AIAgentConfigurationTab = () => { : undefined, }; } - return null; }, [editedAgentData, aiAgentData, getResourceTierFromAgent]); + const selectedProvider = displayData?.provider?.provider.case; + + // Fetch providers and models from AI Gateway when using gateway + const { data: providersData, isLoading: isLoadingProviders } = useListModelProvidersQuery( + { filter: 'enabled = "true"' }, + { enabled: isUsingGateway } + ); + + const { data: modelsData, isLoading: isLoadingModels } = useListModelsQuery( + { + filter: selectedProvider + ? `provider = "${selectedProvider}" AND enabled = "true"` + : 'enabled = "true"', + }, + { enabled: isUsingGateway && !!selectedProvider } + ); + + // Get available providers - from gateway API or hardcoded + const availableProviders = useMemo(() => { + if (isUsingGateway && providersData?.modelProviders) { + // Map gateway providers to our format (already filtered for enabled at API level) + return providersData.modelProviders.map((provider) => { + // Strip "model_providers/" prefix from provider name + const providerName = provider.name.replace(/^model_providers\//, ''); + const providerId = providerName.toLowerCase().replace(/\s+/g, ''); + + return { + id: providerId, + label: provider.displayName || providerName, + icon: MODEL_OPTIONS_BY_PROVIDER[providerId as keyof typeof MODEL_OPTIONS_BY_PROVIDER]?.icon || '', + }; + }); + } + // Fallback to hardcoded providers + return Object.entries(MODEL_OPTIONS_BY_PROVIDER).map(([id, provider]) => ({ + id, + label: provider.label, + icon: provider.icon, + })); + }, [isUsingGateway, providersData]); + + // Get available models - from gateway API or hardcoded + const filteredModels = useMemo(() => { + if (isUsingGateway && modelsData?.models) { + // Map gateway models to our format (already filtered for enabled at API level) + return modelsData.models.map((model) => { + // Strip "models/provider/" prefix from model name + const modelName = model.name.split('/').pop() || model.name; + + return { + value: modelName, + name: model.displayName || modelName, + description: model.description || '', + }; + }); + } + // Fallback to hardcoded models + if (!selectedProvider) return []; + const providerData = MODEL_OPTIONS_BY_PROVIDER[selectedProvider as keyof typeof MODEL_OPTIONS_BY_PROVIDER]; + return providerData?.models || []; + }, [isUsingGateway, modelsData, selectedProvider]); + + // Get available MCP servers + const availableMcpServers = useMemo(() => { + if (!mcpServersData?.mcpServers || mcpServersData.mcpServers.length === 0) { + return []; + } + return mcpServersData.mcpServers; + }, [mcpServersData]); + + // Get available secrets for API key dropdown + const availableSecrets = useMemo(() => { + if (!secretsData?.secrets) { + return []; + } + return secretsData.secrets + .filter((secret): secret is NonNullable & { id: string } => !!secret?.id) + .map((secret) => ({ + id: secret.id, + name: secret.id, + })); + }, [secretsData]); + + // Get gateway display name + const gatewayDisplayName = useMemo(() => { + if (!aiAgentData?.aiAgent?.gateway?.virtualGatewayId || !gatewaysData?.gateways) { + return null; + } + const gateway = gatewaysData.gateways.find( + (gw) => gw.name.split('/').pop() === aiAgentData.aiAgent.gateway?.virtualGatewayId + ); + return gateway?.displayName || aiAgentData.aiAgent.gateway.virtualGatewayId; + }, [aiAgentData, gatewaysData]); + const updateField = useCallback( (updates: Partial) => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - setEditedAgentData({ ...currentData, ...updates }); + setEditedAgentData({ ...displayData, ...updates }); }, - [getCurrentData] + [displayData] ); const handleAddTag = () => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } setEditedAgentData({ - ...currentData, - tags: [...currentData.tags, { key: '', value: '' }], + ...displayData, + tags: [...displayData.tags, { key: '', value: '' }], }); }; const handleRemoveTag = (index: number) => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - const updatedTags = currentData.tags.filter((_, i) => i !== index); + const updatedTags = displayData.tags.filter((_, i) => i !== index); setEditedAgentData({ - ...currentData, + ...displayData, tags: updatedTags, }); }; const handleUpdateTag = (index: number, field: 'key' | 'value', value: string) => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - const updatedTags = [...currentData.tags]; + const updatedTags = [...displayData.tags]; updatedTags[index] = { ...updatedTags[index], [field]: value }; setEditedAgentData({ - ...currentData, + ...displayData, tags: updatedTags, }); }; const handleAddSubagent = () => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - const newIndex = currentData.subagents.length; + const newIndex = displayData.subagents.length; setEditedAgentData({ - ...currentData, - subagents: [...currentData.subagents, { name: '', description: '', systemPrompt: '', selectedMcpServers: [] }], + ...displayData, + subagents: [...displayData.subagents, { name: '', description: '', systemPrompt: '', selectedMcpServers: [] }], }); // Auto-expand the newly added subagent setExpandedSubagent(`subagent-${newIndex}`); }; const handleRemoveSubagent = (index: number) => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - const updatedSubagents = currentData.subagents.filter((_, i) => i !== index); + const updatedSubagents = displayData.subagents.filter((_, i) => i !== index); setEditedAgentData({ - ...currentData, + ...displayData, subagents: updatedSubagents, }); }; @@ -492,15 +562,14 @@ export const AIAgentConfigurationTab = () => { field: 'name' | 'description' | 'systemPrompt' | 'selectedMcpServers', value: string | string[] ) => { - const currentData = getCurrentData(); - if (!currentData) { + if (!displayData) { return; } - const updatedSubagents = [...currentData.subagents]; + const updatedSubagents = [...displayData.subagents]; updatedSubagents[index] = { ...updatedSubagents[index], [field]: value }; setEditedAgentData({ - ...currentData, + ...displayData, subagents: updatedSubagents, }); }; @@ -572,17 +641,12 @@ export const AIAgentConfigurationTab = () => { // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex form with many conditionals - already refactored with helper functions const handleSave = async () => { - if (!(aiAgentData?.aiAgent && id)) { - return; - } - - const currentData = getCurrentData(); - if (!currentData) { + if (!(aiAgentData?.aiAgent && id && displayData)) { return; } // Validate that user tags don't use reserved keys - for (const tag of currentData.tags) { + for (const tag of displayData.tags) { if (isCloudManagedTagKey(tag.key.trim())) { toast.error(`Tag key "${tag.key.trim()}" is reserved for system use`); return; @@ -591,7 +655,7 @@ export const AIAgentConfigurationTab = () => { // Validate subagents const subagentNames = new Set(); - for (const [index, subagent] of currentData.subagents.entries()) { + for (const [index, subagent] of displayData.subagents.entries()) { const trimmedName = subagent.name.trim(); // Validate name is not empty @@ -633,17 +697,17 @@ export const AIAgentConfigurationTab = () => { } try { - const selectedTier = RESOURCE_TIERS.find((tier) => tier.id === currentData.resources.tier); + const selectedTier = RESOURCE_TIERS.find((tier) => tier.id === displayData.resources.tier); // Build MCP servers map const mcpServersMap: Record = {}; - for (const serverId of currentData.selectedMcpServers) { + for (const serverId of displayData.selectedMcpServers) { mcpServersMap[serverId] = create(AIAgent_MCPServerSchema, { id: serverId }); } // Build subagents map const subagentsMap: Record>> = {}; - for (const subagent of currentData.subagents) { + for (const subagent of displayData.subagents) { const trimmedName = subagent.name.trim(); if (trimmedName) { const subagentMcpMap: Record = {}; @@ -659,14 +723,17 @@ export const AIAgentConfigurationTab = () => { } } - const tagsMap = buildTagsMap(aiAgentData.aiAgent.tags, currentData.tags); - const apiKeyRef = `\${secrets.${currentData.apiKeySecret}}`; - const updatedProvider = createUpdatedProvider(currentData.provider.provider.case, apiKeyRef, currentData.baseUrl); + const tagsMap = buildTagsMap(aiAgentData.aiAgent.tags, displayData.tags); + // When using gateway, keep the existing API key reference; otherwise use the selected secret + const apiKeyRef = isUsingGateway + ? extractProviderInfo(aiAgentData.aiAgent.provider).apiKeyTemplate + : `\${secrets.${displayData.apiKeySecret}}`; + const updatedProvider = createUpdatedProvider(displayData.provider.provider.case, apiKeyRef, displayData.baseUrl); const gatewayConfig = - currentData.gatewayId && currentData.gatewayId.trim() !== '' + displayData.gatewayId && displayData.gatewayId.trim() !== '' ? create(AIAgent_GatewayConfigSchema, { - virtualGatewayId: currentData.gatewayId, + virtualGatewayId: displayData.gatewayId, }) : undefined; @@ -687,18 +754,18 @@ export const AIAgentConfigurationTab = () => { !!(provider?.organization || provider?.url); const agentCard = - currentData.agentCard && hasAgentCardData(currentData.agentCard) + displayData.agentCard && hasAgentCardData(displayData.agentCard) ? create(AIAgent_AgentCardSchema, { - iconUrl: currentData.agentCard.iconUrl || undefined, - documentationUrl: currentData.agentCard.documentationUrl || undefined, + iconUrl: displayData.agentCard.iconUrl || undefined, + documentationUrl: displayData.agentCard.documentationUrl || undefined, provider: - currentData.agentCard.provider && hasProviderData(currentData.agentCard.provider) + displayData.agentCard.provider && hasProviderData(displayData.agentCard.provider) ? create(AIAgent_AgentCard_ProviderSchema, { - organization: currentData.agentCard.provider.organization || undefined, - url: currentData.agentCard.provider.url || undefined, + organization: displayData.agentCard.provider.organization || undefined, + url: displayData.agentCard.provider.url || undefined, }) : undefined, - skills: currentData.agentCard.skills.map(sanitizeSkill), + skills: displayData.agentCard.skills.map(sanitizeSkill), }) : undefined; @@ -706,12 +773,12 @@ export const AIAgentConfigurationTab = () => { create(UpdateAIAgentRequestSchema, { id, aiAgent: create(AIAgentUpdateSchema, { - displayName: currentData.displayName, - description: currentData.description, - model: currentData.model, - maxIterations: currentData.maxIterations, + displayName: displayData.displayName, + description: displayData.description, + model: displayData.model, + maxIterations: displayData.maxIterations, provider: updatedProvider, - systemPrompt: currentData.systemPrompt, + systemPrompt: displayData.systemPrompt, serviceAccount: aiAgentData.aiAgent.serviceAccount, resources: { cpuShares: selectedTier?.cpu || '100m', @@ -770,16 +837,11 @@ export const AIAgentConfigurationTab = () => { return mcpServersData.mcpServers.filter((server) => connectedServerIds.includes(server.id)); }, [aiAgentData, mcpServersData]); - if (!aiAgentData?.aiAgent) { + if (!aiAgentData?.aiAgent || !displayData) { return null; } const agent = aiAgentData.aiAgent; - const displayData = getCurrentData(); - - if (!displayData) { - return null; - } return (
@@ -1108,15 +1170,29 @@ export const AIAgentConfigurationTab = () => { {isEditing ? (
+ {/* AI Gateway - show if configured (read-only in edit mode) */} + {gatewayDisplayName && ( +
+ +
+ {gatewayDisplayName} +
+ + Gateway configuration cannot be changed after creation + +
+ )} {/* Provider - now editable */}
updateField({ model: e.target.value })} placeholder="Enter model name (e.g., llama-3.1-70b)" value={displayData.model} /> ) : ( - updateField({ model: value })} + value={displayData.model} + > - + {Boolean(displayData.model) && detectProvider(displayData.model) ? (
{ - {(() => { - const providerCase = displayData.provider?.provider.case; - - const providerData = providerCase - ? MODEL_OPTIONS_BY_PROVIDER[providerCase as keyof typeof MODEL_OPTIONS_BY_PROVIDER] - : null; - - if (!providerData) { - return ( -
- No models available for this provider -
- ); - } - - return ( - + {isLoadingModels ? ( +
+ Loading models... +
+ ) : filteredModels.length > 0 ? ( + + {!isUsingGateway && displayData.provider?.provider.case && (
- {providerData.label} - {providerData.label} + {MODEL_OPTIONS_BY_PROVIDER[displayData.provider.provider.case + {MODEL_OPTIONS_BY_PROVIDER[displayData.provider.provider.case as keyof typeof MODEL_OPTIONS_BY_PROVIDER]?.label}
- {providerData.models.map( - (model: { value: string; name: string; description: string }) => ( - -
- {model.name} - - {model.description} - -
-
- ) - )} -
- ); - })()} + )} + {filteredModels.map( + (model: { value: string; name: string; description: string }) => ( + + {model.name} + + ) + )} +
+ ) : ( +
+ No models available +
+ )}
)}
- {/* API Token */} -
- -
- updateField({ apiKeySecret: value })} - placeholder="Select from secrets store or create new" - scopes={[Scope.MCP_SERVER, Scope.AI_AGENT]} - value={displayData.apiKeySecret} - /> + {/* API Token - hide when using gateway */} + {!isUsingGateway && ( +
+ +
+ updateField({ apiKeySecret: value })} + placeholder="Select from secrets store or create new" + scopes={[Scope.MCP_SERVER, Scope.AI_AGENT]} + value={displayData.apiKeySecret} + /> +
-
+ )} {/* Base URL - only show for openaiCompatible */} {displayData.provider?.provider.case === 'openaiCompatible' && ( @@ -1282,6 +1357,15 @@ export const AIAgentConfigurationTab = () => {
) : (
+ {/* AI Gateway - show if configured */} + {gatewayDisplayName && ( +
+ +
+ {gatewayDisplayName} +
+
+ )}
@@ -1299,13 +1383,15 @@ export const AIAgentConfigurationTab = () => {
- {/* API Token */} -
- -
- {displayData.apiKeySecret || 'No secret configured'} + {/* API Token - hide when using gateway */} + {!isUsingGateway && ( +
+ +
+ {displayData.apiKeySecret || 'No secret configured'} +
-
+ )} {agent.provider?.provider.case === 'openaiCompatible' && displayData.baseUrl && (
diff --git a/frontend/src/components/ui/ai-agent/llm-config-section.tsx b/frontend/src/components/ui/ai-agent/llm-config-section.tsx index f3975fdaed..8026010064 100644 --- a/frontend/src/components/ui/ai-agent/llm-config-section.tsx +++ b/frontend/src/components/ui/ai-agent/llm-config-section.tsx @@ -33,6 +33,10 @@ import { import type { Scope } from "protogen/redpanda/api/dataplane/v1/secret_pb"; import { useEffect, useMemo } from "react"; import { Controller, type UseFormReturn } from "react-hook-form"; +import { + useListModelProvidersQuery, + useListModelsQuery, +} from "react-query/api/ai-gateway"; import { detectProvider, @@ -70,54 +74,136 @@ export const LLMConfigSection: React.FC = ({ hasGatewayDeployed = false, availableGateways = [], }) => { - const GATEWAY_HARDCODED_PROVIDER = 'openai'; - const GATEWAY_HARDCODED_MODEL = 'gpt-4o'; - const selectedProvider = form.watch(fieldNames.provider) as keyof typeof MODEL_OPTIONS_BY_PROVIDER; const selectedGatewayId = fieldNames.gatewayId ? form.watch(fieldNames.gatewayId) : undefined; const isUsingGateway = hasGatewayDeployed && !!selectedGatewayId; + // Fetch providers and models from AI Gateway when using gateway + // Filter for enabled providers at the API level + const { data: providersData, isLoading: isLoadingProviders } = useListModelProvidersQuery( + { filter: 'enabled = "true"' }, + { enabled: isUsingGateway } + ); + + // Filter models by provider and enabled status + const { data: modelsData, isLoading: isLoadingModels } = useListModelsQuery( + { + filter: selectedProvider + ? `provider = "${selectedProvider}" AND enabled = "true"` + : 'enabled = "true"', + }, + { enabled: isUsingGateway && !!selectedProvider } + ); + + // Get available providers - from gateway API or hardcoded + const availableProviders = useMemo(() => { + if (isUsingGateway && providersData?.modelProviders) { + // Map gateway providers to our format (already filtered for enabled at API level) + return providersData.modelProviders.map((provider) => { + // Strip "model_providers/" prefix from provider name + const providerName = provider.name.replace(/^model_providers\//, ''); + const providerId = providerName.toLowerCase().replace(/\s+/g, ''); + + return { + id: providerId, + label: provider.displayName || providerName, + icon: MODEL_OPTIONS_BY_PROVIDER[providerId as keyof typeof MODEL_OPTIONS_BY_PROVIDER]?.icon || '', + }; + }); + } + // Fallback to hardcoded providers + return Object.entries(MODEL_OPTIONS_BY_PROVIDER).map(([id, provider]) => ({ + id, + label: provider.label, + icon: provider.icon, + })); + }, [isUsingGateway, providersData]); + + // Get available models - from gateway API or hardcoded const filteredModels = useMemo(() => { + if (isUsingGateway && modelsData?.models) { + // Map gateway models to our format (already filtered for enabled at API level) + return modelsData.models.map((model) => { + // Strip "models/provider/" prefix from model name + // e.g., "models/openai/gpt-4o-mini" -> "gpt-4o-mini" + const modelName = model.name.split('/').pop() || model.name; + + return { + value: modelName, + name: model.displayName || modelName, + description: model.description || '', + }; + }); + } + // Fallback to hardcoded models if (!selectedProvider) return []; const providerData = MODEL_OPTIONS_BY_PROVIDER[selectedProvider]; return providerData?.models || []; - }, [selectedProvider]); + }, [isUsingGateway, modelsData, selectedProvider]); + // Auto-select first provider when available (create mode) useEffect(() => { - if (isUsingGateway) { - form.setValue(fieldNames.provider, GATEWAY_HARDCODED_PROVIDER); - form.setValue(fieldNames.model, GATEWAY_HARDCODED_MODEL); - form.setValue(fieldNames.apiKeySecret, ''); + if (mode === 'create' && isUsingGateway && availableProviders.length > 0 && !isLoadingProviders) { + const currentProvider = form.getValues(fieldNames.provider); + // Check if current provider is in the available list + const isValidProvider = availableProviders.some((p) => p.id === currentProvider); + + if (!currentProvider || !isValidProvider) { + // Auto-select first available provider + form.setValue(fieldNames.provider, availableProviders[0].id, { shouldValidate: true }); + } } - }, [isUsingGateway, form, fieldNames]); + }, [mode, isUsingGateway, availableProviders, isLoadingProviders, form, fieldNames]); + // Auto-select first model when available (create mode) useEffect(() => { - if (mode === 'create' && filteredModels.length > 0 && filteredModels[0] && !isUsingGateway) { + if (mode === 'create' && isUsingGateway && filteredModels.length > 0 && filteredModels[0] && !isLoadingModels && selectedProvider) { const currentModel = form.getValues(fieldNames.model); - const isValid = filteredModels.some((m: { value: string }) => m.value === currentModel); + const isValid = currentModel && filteredModels.some((m: { value: string }) => m.value === currentModel); if (!isValid) { - form.setValue(fieldNames.model, filteredModels[0].value); + // Auto-select first available model + form.setValue(fieldNames.model, filteredModels[0].value, { shouldValidate: true }); } } - }, [selectedProvider, mode, filteredModels, form, fieldNames, isUsingGateway]); + }, [mode, isUsingGateway, selectedProvider, filteredModels, isLoadingModels, form, fieldNames]); + + // Clear API key when using gateway + useEffect(() => { + if (isUsingGateway) { + form.setValue(fieldNames.apiKeySecret, ''); + } + }, [isUsingGateway, form, fieldNames]); return (
- {hasGatewayDeployed && availableGateways.length > 0 && fieldNames.gatewayId && ( + {fieldNames.gatewayId && ( - AI Gateway - Route requests through an AI Gateway + AI Gateway + + {hasGatewayDeployed && availableGateways.length > 0 + ? 'Route requests through an AI Gateway' + : 'Gateway not available. Please enable AI Gateway for your cluster.'} + ( - - + 0 + ? 'Select a gateway' + : 'No gateways available' + } + /> - No gateway {availableGateways.map((gw) => ( {gw.displayName} @@ -138,19 +224,32 @@ export const LLMConfigSection: React.FC = ({ Provider + {isUsingGateway && availableProviders.length === 0 && !isLoadingProviders && ( + No enabled providers available. Please enable providers in AI Gateway. + )} ( - - + - {Object.entries(MODEL_OPTIONS_BY_PROVIDER).map(([providerId, provider]) => ( - + {availableProviders.map((provider) => ( +
- {provider.label} + {provider.icon && {provider.label}} {provider.label}
@@ -182,6 +281,9 @@ export const LLMConfigSection: React.FC = ({ Model + {isUsingGateway && filteredModels.length === 0 && !isLoadingModels && selectedProvider && ( + No enabled models available. Please enable models in AI Gateway. + )} = ({ : null; const isFreeTextMode = providerData && providerData.models.length === 0; + const hasNoProviders = isUsingGateway && availableProviders.length === 0 && !isLoadingProviders; + const hasNoModels = isUsingGateway && filteredModels.length === 0 && !isLoadingModels && selectedProvider; if (isFreeTextMode) { return ( <> = ({ } return ( - - - {field.value && detectedProvider ? ( -
- {detectedProvider.label} - {field.value} -
- ) : ( - 'Select AI model' - )} -
+
- {providerData ? ( + {isLoadingModels ? ( +
+ Loading models... +
+ ) : hasNoModels ? ( +
+ No enabled models available +
+ ) : filteredModels.length > 0 ? ( - -
- {providerData.label} - {providerData.label} -
-
+ {providerData && !isUsingGateway && ( + +
+ {providerData.label} + {providerData.label} +
+
+ )} {filteredModels.map((model: { value: string; name: string; description: string }) => ( -
- {model.name} - - {model.description} - -
+ {model.name}
))}
diff --git a/frontend/src/hooks/use-ai-gateway-transport.ts b/frontend/src/hooks/use-ai-gateway-transport.ts index 00b837bc48..66e46d53fd 100644 --- a/frontend/src/hooks/use-ai-gateway-transport.ts +++ b/frontend/src/hooks/use-ai-gateway-transport.ts @@ -8,10 +8,10 @@ import { useMemo } from 'react'; * Custom hook to create and memoize a Connect transport for AI Gateway API calls * * Uses base path: /.redpanda/api/ - * Connect Query will append the service path: redpanda.aigateway.v1.GatewayService/ListGateways - * Full path becomes: /.redpanda/api/redpanda.aigateway.v1.GatewayService/ListGateways + * Connect Query will append the service path: redpanda.api.aigateway.v1.GatewayService/ListGateways + * Full path becomes: /.redpanda/api/redpanda.api.aigateway.v1.GatewayService/ListGateways * - * Dev server proxies /.redpanda/api/redpanda.aigateway.v1 to: + * Dev server proxies /.redpanda/api/redpanda.api.aigateway.v1 to: * https://ai-gateway.${CLUSTER_ID}.clusters.ign.rdpa.co * * @returns Transport instance configured for AI Gateway communication @@ -19,6 +19,7 @@ import { useMemo } from 'react'; export const useAIGatewayTransport = (): Transport => { const aiGatewayTransport = useMemo(() => { // Use /.redpanda/api/ base path (AI Gateway's Connect RPC endpoint prefix) + // Dev server will proxy to the correct AI Gateway based on cluster ID const baseUrl = '/.redpanda/api'; return createConnectTransport({ From 336095f1cbe1a191645406fed2cad9f981e33f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Mon, 26 Jan 2026 12:39:49 +0100 Subject: [PATCH 05/12] fix: remove query options handled by global query client Remove staleTime, gcTime, refetchOnWindowFocus, refetchOnMount, and refetchOnReconnect options from AI Gateway query hooks as these should be configured at the global query client level per code review feedback. --- frontend/src/react-query/api/ai-gateway.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/frontend/src/react-query/api/ai-gateway.tsx b/frontend/src/react-query/api/ai-gateway.tsx index c10b533de5..3b652d7cd3 100644 --- a/frontend/src/react-query/api/ai-gateway.tsx +++ b/frontend/src/react-query/api/ai-gateway.tsx @@ -46,11 +46,6 @@ export const useListGatewaysQuery = ( return useQuery(listGateways, listGatewaysRequest, { enabled: options?.enabled, transport, - staleTime: 60_000, // 1 minute - prevent excessive refetching - gcTime: 300_000, // 5 minutes cache - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, }); }; @@ -73,11 +68,6 @@ export const useListModelProvidersQuery = ( return useQuery(listModelProviders, listModelProvidersRequest, { enabled: options?.enabled, transport, - staleTime: 60_000, // 1 minute - prevent excessive refetching - gcTime: 300_000, // 5 minutes cache - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, }); }; @@ -105,10 +95,5 @@ export const useListModelsQuery = ( return useQuery(listModels, listModelsRequest, { enabled: options?.enabled, transport, - staleTime: 60_000, // 1 minute - prevent excessive refetching - gcTime: 300_000, // 5 minutes cache - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, }); }; From 76d8f5b709952fc101e603d77a7f715a15c760de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Mon, 26 Jan 2026 14:55:38 +0100 Subject: [PATCH 06/12] feat: add feature flag check to edit screen for legacy API key mode When enableApiKeyConfigurationAgent feature flag is enabled, the edit screen will now use legacy behavior (hardcoded providers/models, no AI Gateway API calls) even if the agent was originally created with a gateway. This ensures consistent behavior across create and edit screens when the feature flag is enabled. --- .../pages/agents/details/ai-agent-configuration-tab.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx index c240fc344a..014a24f0e4 100644 --- a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx +++ b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx @@ -16,6 +16,7 @@ import { getRouteApi } from '@tanstack/react-router'; const routeApi = getRouteApi('/agents/$id'); import { CLOUD_MANAGED_TAG_KEYS, isCloudManagedTagKey } from 'components/constants'; +import { isFeatureFlagEnabled } from 'config'; import { Accordion, AccordionContent, @@ -319,8 +320,11 @@ export const AIAgentConfigurationTab = () => { const [editedAgentData, setEditedAgentData] = useState(null); const [expandedSubagent, setExpandedSubagent] = useState(undefined); - // Check if agent is using gateway - const isUsingGateway = !!aiAgentData?.aiAgent?.gateway?.virtualGatewayId; + // Feature flag: when true, use legacy API key mode (hardcoded providers, no gateway API calls) + const isLegacyApiKeyMode = isFeatureFlagEnabled('enableApiKeyConfigurationAgent'); + + // Check if agent is using gateway AND feature flag allows it + const isUsingGateway = !isLegacyApiKeyMode && !!aiAgentData?.aiAgent?.gateway?.virtualGatewayId; const getResourceTierFromAgent = useCallback((resources?: { cpuShares?: string; memoryShares?: string }) => { if (!resources) { From b8d7745ce78147a453cb0c26f05d1ff29a737b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alena=20Varko=C4=8Dkov=C3=A1?= Date: Mon, 26 Jan 2026 15:34:03 +0100 Subject: [PATCH 07/12] fix: resolve TypeScript compilation errors - Add isLoadingGateways to gateway Select disabled state and placeholder - Remove unused detectProvider import - Add non-null assertions for aiAgent in useMemo and handleSave - Fix provider type checking with explicit null check - Convert selectedProvider to boolean with !! in hasNoModels Co-Authored-By: Claude Sonnet 4.5 --- .../details/ai-agent-configuration-tab.tsx | 11 +++++----- .../ui/ai-agent/llm-config-section.tsx | 21 ++++++++----------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx index 014a24f0e4..1f515c784a 100644 --- a/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx +++ b/frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx @@ -484,9 +484,9 @@ export const AIAgentConfigurationTab = () => { return null; } const gateway = gatewaysData.gateways.find( - (gw) => gw.name.split('/').pop() === aiAgentData.aiAgent.gateway?.virtualGatewayId + (gw) => gw.name.split('/').pop() === aiAgentData.aiAgent!.gateway?.virtualGatewayId ); - return gateway?.displayName || aiAgentData.aiAgent.gateway.virtualGatewayId; + return gateway?.displayName || aiAgentData.aiAgent!.gateway!.virtualGatewayId; }, [aiAgentData, gatewaysData]); const updateField = useCallback( @@ -727,10 +727,11 @@ export const AIAgentConfigurationTab = () => { } } - const tagsMap = buildTagsMap(aiAgentData.aiAgent.tags, displayData.tags); + const tagsMap = buildTagsMap(aiAgentData.aiAgent!.tags, displayData.tags); // When using gateway, keep the existing API key reference; otherwise use the selected secret - const apiKeyRef = isUsingGateway - ? extractProviderInfo(aiAgentData.aiAgent.provider).apiKeyTemplate + const currentProvider = aiAgentData.aiAgent!.provider; + const apiKeyRef = isUsingGateway && currentProvider + ? extractProviderInfo(currentProvider).apiKeyTemplate : `\${secrets.${displayData.apiKeySecret}}`; const updatedProvider = createUpdatedProvider(displayData.provider.provider.case, apiKeyRef, displayData.baseUrl); diff --git a/frontend/src/components/ui/ai-agent/llm-config-section.tsx b/frontend/src/components/ui/ai-agent/llm-config-section.tsx index 8026010064..a81838c7d2 100644 --- a/frontend/src/components/ui/ai-agent/llm-config-section.tsx +++ b/frontend/src/components/ui/ai-agent/llm-config-section.tsx @@ -38,10 +38,7 @@ import { useListModelsQuery, } from "react-query/api/ai-gateway"; -import { - detectProvider, - MODEL_OPTIONS_BY_PROVIDER, -} from "../../pages/agents/ai-agent-model"; +import { MODEL_OPTIONS_BY_PROVIDER } from "../../pages/agents/ai-agent-model"; export interface LLMConfigSectionProps { mode: 'create' | 'edit'; @@ -72,6 +69,7 @@ export const LLMConfigSection: React.FC = ({ showBaseUrl = false, showMaxIterations = true, hasGatewayDeployed = false, + isLoadingGateways = false, availableGateways = [], }) => { const selectedProvider = form.watch(fieldNames.provider) as keyof typeof MODEL_OPTIONS_BY_PROVIDER; @@ -190,16 +188,18 @@ export const LLMConfigSection: React.FC = ({ name={fieldNames.gatewayId} render={({ field }) => ( updateField({ model: e.target.value })} placeholder="Enter model name (e.g., llama-3.1-70b)" @@ -1266,7 +1264,7 @@ export const AIAgentConfigurationTab = () => { value={displayData.model} > - + {Boolean(displayData.model) && detectProvider(displayData.model) ? (
{
{MODEL_OPTIONS_BY_PROVIDER[displayData.provider.provider.case - {MODEL_OPTIONS_BY_PROVIDER[displayData.provider.provider.case as keyof typeof MODEL_OPTIONS_BY_PROVIDER]?.label} + + { + MODEL_OPTIONS_BY_PROVIDER[ + displayData.provider.provider.case as keyof typeof MODEL_OPTIONS_BY_PROVIDER + ]?.label + } +
)} - {filteredModels.map( - (model: { value: string; name: string; description: string }) => ( - - {model.name} - - ) - )} + {filteredModels.map((model: { value: string; name: string; description: string }) => ( + + {model.name} + + ))} ) : (
diff --git a/frontend/src/components/ui/ai-agent/llm-config-section.tsx b/frontend/src/components/ui/ai-agent/llm-config-section.tsx index f0675795a5..b19dc3b3f8 100644 --- a/frontend/src/components/ui/ai-agent/llm-config-section.tsx +++ b/frontend/src/components/ui/ai-agent/llm-config-section.tsx @@ -316,7 +316,7 @@ export const LLMConfigSection: React.FC = ({ } return ( -