From f28fe43aa84686b30b3ef50e5779d7175680b1e4 Mon Sep 17 00:00:00 2001 From: Gael Date: Thu, 8 Oct 2026 11:55:28 -0400 Subject: [PATCH 1/3] feat(moduleauthority): attest live runtime boundaries --- CHANGELOG.md | 8 + README.md | 8 + SOURCE.txt | 2 +- datasource/types.go | 9 + .../accountsv1connect/invitations.connect.go | 33 + .../module_capabilities.connect.go | 34 + .../organizations.connect.go | 103 + .../platform_admin.connect.go | 99 + gen/saas/accounts/v1/api_keys.pb.go | 6 +- gen/saas/accounts/v1/audit.pb.go | 86 +- gen/saas/accounts/v1/common.pb.go | 77 +- gen/saas/accounts/v1/datasource.pb.go | 612 +-- gen/saas/accounts/v1/invitations.pb.go | 201 +- .../accounts/v1/module_capabilities.pb.go | 706 ++-- gen/saas/accounts/v1/organizations.pb.go | 309 +- gen/saas/accounts/v1/platform_admin.pb.go | 3591 +++++++++++++---- gen/saas/accounts/v1/solution_registry.pb.go | 42 +- gen/saas/accounts/v1/work_contexts.pb.go | 25 +- moduleauthority/host_fake_test.go | 19 +- moduleauthority/runtime_boundary.go | 39 + moduleauthority/runtime_boundary_test.go | 47 + 21 files changed, 4734 insertions(+), 1322 deletions(-) create mode 100644 moduleauthority/runtime_boundary.go create mode 100644 moduleauthority/runtime_boundary_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 6361189..77f6ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## Unreleased — runtime boundary attestation + +- Added `moduleauthority.Client.VerifyWorkContextRuntimeBoundary`, preserving the + forwarded capability and independently authenticating the consuming module. +- Regenerated the complete API from the local host experiment recorded in + `SOURCE.txt`; module version remains 0.1.0. This is not a published release. + + ## Unreleased (targets 0.1.0) Regenerated `gen/` from `module-saas-starter` main (see `SOURCE.txt` for the diff --git a/README.md b/README.md index 3d80576..646340f 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,14 @@ The SDK surfaces are: op, err := authority.MintModuleOperationContext(ctx, installedBindingID) // op.Token goes in x-codefly-work-context on the call to op.Audience. ``` + `VerifyWorkContextRuntimeBoundary(ctx, forwarded)` uses the same independent + module authentication to attest an original viewer capability. Its result + (`TenantID`, `BoundaryID`) is a current observation, never a grant or a cached + proof: the consumer must compare both to its independently verified context + and enforce the context's scopes. The host requires an active registration + with both halves live and compatible. This method requires the unreleased + host contract recorded in `SOURCE.txt`. + - **`settings/`** — the schema-agnostic typed-settings library every module and product depends on instead of vendoring a copy. It has two parts: diff --git a/SOURCE.txt b/SOURCE.txt index 4b52313..80ec227 100644 --- a/SOURCE.txt +++ b/SOURCE.txt @@ -1,4 +1,4 @@ -gen/ generated from codefly-dev/module-saas-starter@c201081235a61da83500db4c30a8bbec7d391e1a +gen/ generated from codefly-dev/module-saas-starter@8b2fab2f6831a19db24d6ba760ee6e9c51c0a463 (accounts public proto: module/services/accounts/proto) module version: 0.1.0 (module/module.package.codefly.yaml) diff --git a/datasource/types.go b/datasource/types.go index 053a991..0352b4d 100644 --- a/datasource/types.go +++ b/datasource/types.go @@ -10,6 +10,7 @@ import v1 "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1" // itself: a consumer who can hold the value but cannot name the type of one of // its fields is still forced to import the generated tree. type ( + DatasourceLiveDelivery = v1.DatasourceLiveDelivery // Datasource is the non-secret projection of a connected source. Datasource = v1.Datasource // DatasourceStatus is the ingestion status carried by a Datasource. @@ -67,3 +68,11 @@ const ( ApiCredentialKindQuery = v1.ApiCredentialKind_API_CREDENTIAL_KIND_QUERY ApiCredentialKindOAuth2 = v1.ApiCredentialKind_API_CREDENTIAL_KIND_OAUTH2 ) + +const ( + DatasourceLiveDeliveryUnspecified = v1.DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_UNSPECIFIED + DatasourceLiveDeliveryNone = v1.DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_NONE + DatasourceLiveDeliverySourceWebhook = v1.DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_SOURCE_WEBHOOK +) + +const DatasourceLiveDeliveryAppWebhook = v1.DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_APP_WEBHOOK diff --git a/gen/saas/accounts/v1/accountsv1connect/invitations.connect.go b/gen/saas/accounts/v1/accountsv1connect/invitations.connect.go index 5e1120f..3530b95 100644 --- a/gen/saas/accounts/v1/accountsv1connect/invitations.connect.go +++ b/gen/saas/accounts/v1/accountsv1connect/invitations.connect.go @@ -52,6 +52,9 @@ const ( // InvitationServiceResendInvitationProcedure is the fully-qualified name of the InvitationService's // ResendInvitation RPC. InvitationServiceResendInvitationProcedure = "/saas.accounts.v1.InvitationService/ResendInvitation" + // InvitationServiceIssueInvitationLinkProcedure is the fully-qualified name of the + // InvitationService's IssueInvitationLink RPC. + InvitationServiceIssueInvitationLinkProcedure = "/saas.accounts.v1.InvitationService/IssueInvitationLink" // InvitationServiceRevokeInvitationProcedure is the fully-qualified name of the InvitationService's // RevokeInvitation RPC. InvitationServiceRevokeInvitationProcedure = "/saas.accounts.v1.InvitationService/RevokeInvitation" @@ -65,6 +68,9 @@ type InvitationServiceClient interface { AcceptInvitation(context.Context, *connect.Request[v1.AcceptInvitationRequest]) (*connect.Response[v1.AcceptInvitationResponse], error) ListInvitations(context.Context, *connect.Request[v1.ListInvitationsRequest]) (*connect.Response[v1.ListInvitationsResponse], error) ResendInvitation(context.Context, *connect.Request[v1.ResendInvitationRequest]) (*connect.Response[v1.Invitation], error) + // IssueInvitationLink rotates a pending invitation's token and returns its + // accept link to the administrator, without sending email. + IssueInvitationLink(context.Context, *connect.Request[v1.IssueInvitationLinkRequest]) (*connect.Response[v1.IssueInvitationLinkResponse], error) RevokeInvitation(context.Context, *connect.Request[v1.RevokeInvitationRequest]) (*connect.Response[emptypb.Empty], error) } @@ -115,6 +121,12 @@ func NewInvitationServiceClient(httpClient connect.HTTPClient, baseURL string, o connect.WithSchema(invitationServiceMethods.ByName("ResendInvitation")), connect.WithClientOptions(opts...), ), + issueInvitationLink: connect.NewClient[v1.IssueInvitationLinkRequest, v1.IssueInvitationLinkResponse]( + httpClient, + baseURL+InvitationServiceIssueInvitationLinkProcedure, + connect.WithSchema(invitationServiceMethods.ByName("IssueInvitationLink")), + connect.WithClientOptions(opts...), + ), revokeInvitation: connect.NewClient[v1.RevokeInvitationRequest, emptypb.Empty]( httpClient, baseURL+InvitationServiceRevokeInvitationProcedure, @@ -132,6 +144,7 @@ type invitationServiceClient struct { acceptInvitation *connect.Client[v1.AcceptInvitationRequest, v1.AcceptInvitationResponse] listInvitations *connect.Client[v1.ListInvitationsRequest, v1.ListInvitationsResponse] resendInvitation *connect.Client[v1.ResendInvitationRequest, v1.Invitation] + issueInvitationLink *connect.Client[v1.IssueInvitationLinkRequest, v1.IssueInvitationLinkResponse] revokeInvitation *connect.Client[v1.RevokeInvitationRequest, emptypb.Empty] } @@ -165,6 +178,11 @@ func (c *invitationServiceClient) ResendInvitation(ctx context.Context, req *con return c.resendInvitation.CallUnary(ctx, req) } +// IssueInvitationLink calls saas.accounts.v1.InvitationService.IssueInvitationLink. +func (c *invitationServiceClient) IssueInvitationLink(ctx context.Context, req *connect.Request[v1.IssueInvitationLinkRequest]) (*connect.Response[v1.IssueInvitationLinkResponse], error) { + return c.issueInvitationLink.CallUnary(ctx, req) +} + // RevokeInvitation calls saas.accounts.v1.InvitationService.RevokeInvitation. func (c *invitationServiceClient) RevokeInvitation(ctx context.Context, req *connect.Request[v1.RevokeInvitationRequest]) (*connect.Response[emptypb.Empty], error) { return c.revokeInvitation.CallUnary(ctx, req) @@ -178,6 +196,9 @@ type InvitationServiceHandler interface { AcceptInvitation(context.Context, *connect.Request[v1.AcceptInvitationRequest]) (*connect.Response[v1.AcceptInvitationResponse], error) ListInvitations(context.Context, *connect.Request[v1.ListInvitationsRequest]) (*connect.Response[v1.ListInvitationsResponse], error) ResendInvitation(context.Context, *connect.Request[v1.ResendInvitationRequest]) (*connect.Response[v1.Invitation], error) + // IssueInvitationLink rotates a pending invitation's token and returns its + // accept link to the administrator, without sending email. + IssueInvitationLink(context.Context, *connect.Request[v1.IssueInvitationLinkRequest]) (*connect.Response[v1.IssueInvitationLinkResponse], error) RevokeInvitation(context.Context, *connect.Request[v1.RevokeInvitationRequest]) (*connect.Response[emptypb.Empty], error) } @@ -224,6 +245,12 @@ func NewInvitationServiceHandler(svc InvitationServiceHandler, opts ...connect.H connect.WithSchema(invitationServiceMethods.ByName("ResendInvitation")), connect.WithHandlerOptions(opts...), ) + invitationServiceIssueInvitationLinkHandler := connect.NewUnaryHandler( + InvitationServiceIssueInvitationLinkProcedure, + svc.IssueInvitationLink, + connect.WithSchema(invitationServiceMethods.ByName("IssueInvitationLink")), + connect.WithHandlerOptions(opts...), + ) invitationServiceRevokeInvitationHandler := connect.NewUnaryHandler( InvitationServiceRevokeInvitationProcedure, svc.RevokeInvitation, @@ -244,6 +271,8 @@ func NewInvitationServiceHandler(svc InvitationServiceHandler, opts ...connect.H invitationServiceListInvitationsHandler.ServeHTTP(w, r) case InvitationServiceResendInvitationProcedure: invitationServiceResendInvitationHandler.ServeHTTP(w, r) + case InvitationServiceIssueInvitationLinkProcedure: + invitationServiceIssueInvitationLinkHandler.ServeHTTP(w, r) case InvitationServiceRevokeInvitationProcedure: invitationServiceRevokeInvitationHandler.ServeHTTP(w, r) default: @@ -279,6 +308,10 @@ func (UnimplementedInvitationServiceHandler) ResendInvitation(context.Context, * return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.InvitationService.ResendInvitation is not implemented")) } +func (UnimplementedInvitationServiceHandler) IssueInvitationLink(context.Context, *connect.Request[v1.IssueInvitationLinkRequest]) (*connect.Response[v1.IssueInvitationLinkResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.InvitationService.IssueInvitationLink is not implemented")) +} + func (UnimplementedInvitationServiceHandler) RevokeInvitation(context.Context, *connect.Request[v1.RevokeInvitationRequest]) (*connect.Response[emptypb.Empty], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.InvitationService.RevokeInvitation is not implemented")) } diff --git a/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go b/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go index 0a067d1..990742b 100644 --- a/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go +++ b/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go @@ -41,6 +41,9 @@ const ( // ModuleCapabilitiesServiceExchangeDelegatedOperationAudienceProcedure is the fully-qualified name // of the ModuleCapabilitiesService's ExchangeDelegatedOperationAudience RPC. ModuleCapabilitiesServiceExchangeDelegatedOperationAudienceProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/ExchangeDelegatedOperationAudience" + // ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure is the fully-qualified name of + // the ModuleCapabilitiesService's VerifyWorkContextRuntimeBoundary RPC. + ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/VerifyWorkContextRuntimeBoundary" // ModuleCapabilitiesServiceCheckWorkContextRecordAccessProcedure is the fully-qualified name of the // ModuleCapabilitiesService's CheckWorkContextRecordAccess RPC. ModuleCapabilitiesServiceCheckWorkContextRecordAccessProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/CheckWorkContextRecordAccess" @@ -137,6 +140,9 @@ type ModuleCapabilitiesServiceClient interface { // of a current parent context and exchanges only an installed operation's // invoke scopes, or its read-only receipt-lookup subset. ExchangeDelegatedOperationAudience(context.Context, *connect.Request[v1.ModuleExchangeDelegatedOperationAudienceRequest]) (*connect.Response[v1.IssuedWorkContext], error) + // Attests a current capability under an active host-owned solution boundary. + // This read grants no authority and does not expose the registration seed. + VerifyWorkContextRuntimeBoundary(context.Context, *connect.Request[v1.VerifyWorkContextRuntimeBoundaryRequest]) (*connect.Response[v1.VerifyWorkContextRuntimeBoundaryResponse], error) // Checks current owner and every delegated actor against true record placement, // intersected with the verified capability's attenuated resource/action scope. CheckWorkContextRecordAccess(context.Context, *connect.Request[v1.CheckWorkContextRecordAccessRequest]) (*connect.Response[v1.CheckWorkContextRecordAccessResponse], error) @@ -262,6 +268,12 @@ func NewModuleCapabilitiesServiceClient(httpClient connect.HTTPClient, baseURL s connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("ExchangeDelegatedOperationAudience")), connect.WithClientOptions(opts...), ), + verifyWorkContextRuntimeBoundary: connect.NewClient[v1.VerifyWorkContextRuntimeBoundaryRequest, v1.VerifyWorkContextRuntimeBoundaryResponse]( + httpClient, + baseURL+ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure, + connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("VerifyWorkContextRuntimeBoundary")), + connect.WithClientOptions(opts...), + ), checkWorkContextRecordAccess: connect.NewClient[v1.CheckWorkContextRecordAccessRequest, v1.CheckWorkContextRecordAccessResponse]( httpClient, baseURL+ModuleCapabilitiesServiceCheckWorkContextRecordAccessProcedure, @@ -437,6 +449,7 @@ func NewModuleCapabilitiesServiceClient(httpClient connect.HTTPClient, baseURL s type moduleCapabilitiesServiceClient struct { exchangeDelegatedReadAudience *connect.Client[v1.ModuleExchangeDelegatedReadAudienceRequest, v1.IssuedWorkContext] exchangeDelegatedOperationAudience *connect.Client[v1.ModuleExchangeDelegatedOperationAudienceRequest, v1.IssuedWorkContext] + verifyWorkContextRuntimeBoundary *connect.Client[v1.VerifyWorkContextRuntimeBoundaryRequest, v1.VerifyWorkContextRuntimeBoundaryResponse] checkWorkContextRecordAccess *connect.Client[v1.CheckWorkContextRecordAccessRequest, v1.CheckWorkContextRecordAccessResponse] listReadableSourceCollections *connect.Client[v1.ListReadableSourceCollectionsRequest, v1.ListReadableSourceCollectionsResponse] placeRecord *connect.Client[v1.ModulePlaceRecordRequest, v1.ModulePlaceRecordResponse] @@ -479,6 +492,12 @@ func (c *moduleCapabilitiesServiceClient) ExchangeDelegatedOperationAudience(ctx return c.exchangeDelegatedOperationAudience.CallUnary(ctx, req) } +// VerifyWorkContextRuntimeBoundary calls +// saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary. +func (c *moduleCapabilitiesServiceClient) VerifyWorkContextRuntimeBoundary(ctx context.Context, req *connect.Request[v1.VerifyWorkContextRuntimeBoundaryRequest]) (*connect.Response[v1.VerifyWorkContextRuntimeBoundaryResponse], error) { + return c.verifyWorkContextRuntimeBoundary.CallUnary(ctx, req) +} + // CheckWorkContextRecordAccess calls // saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess. func (c *moduleCapabilitiesServiceClient) CheckWorkContextRecordAccess(ctx context.Context, req *connect.Request[v1.CheckWorkContextRecordAccessRequest]) (*connect.Response[v1.CheckWorkContextRecordAccessResponse], error) { @@ -636,6 +655,9 @@ type ModuleCapabilitiesServiceHandler interface { // of a current parent context and exchanges only an installed operation's // invoke scopes, or its read-only receipt-lookup subset. ExchangeDelegatedOperationAudience(context.Context, *connect.Request[v1.ModuleExchangeDelegatedOperationAudienceRequest]) (*connect.Response[v1.IssuedWorkContext], error) + // Attests a current capability under an active host-owned solution boundary. + // This read grants no authority and does not expose the registration seed. + VerifyWorkContextRuntimeBoundary(context.Context, *connect.Request[v1.VerifyWorkContextRuntimeBoundaryRequest]) (*connect.Response[v1.VerifyWorkContextRuntimeBoundaryResponse], error) // Checks current owner and every delegated actor against true record placement, // intersected with the verified capability's attenuated resource/action scope. CheckWorkContextRecordAccess(context.Context, *connect.Request[v1.CheckWorkContextRecordAccessRequest]) (*connect.Response[v1.CheckWorkContextRecordAccessResponse], error) @@ -757,6 +779,12 @@ func NewModuleCapabilitiesServiceHandler(svc ModuleCapabilitiesServiceHandler, o connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("ExchangeDelegatedOperationAudience")), connect.WithHandlerOptions(opts...), ) + moduleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryHandler := connect.NewUnaryHandler( + ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure, + svc.VerifyWorkContextRuntimeBoundary, + connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("VerifyWorkContextRuntimeBoundary")), + connect.WithHandlerOptions(opts...), + ) moduleCapabilitiesServiceCheckWorkContextRecordAccessHandler := connect.NewUnaryHandler( ModuleCapabilitiesServiceCheckWorkContextRecordAccessProcedure, svc.CheckWorkContextRecordAccess, @@ -931,6 +959,8 @@ func NewModuleCapabilitiesServiceHandler(svc ModuleCapabilitiesServiceHandler, o moduleCapabilitiesServiceExchangeDelegatedReadAudienceHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceExchangeDelegatedOperationAudienceProcedure: moduleCapabilitiesServiceExchangeDelegatedOperationAudienceHandler.ServeHTTP(w, r) + case ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure: + moduleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceCheckWorkContextRecordAccessProcedure: moduleCapabilitiesServiceCheckWorkContextRecordAccessHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceListReadableSourceCollectionsProcedure: @@ -1004,6 +1034,10 @@ func (UnimplementedModuleCapabilitiesServiceHandler) ExchangeDelegatedOperationA return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience is not implemented")) } +func (UnimplementedModuleCapabilitiesServiceHandler) VerifyWorkContextRuntimeBoundary(context.Context, *connect.Request[v1.VerifyWorkContextRuntimeBoundaryRequest]) (*connect.Response[v1.VerifyWorkContextRuntimeBoundaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary is not implemented")) +} + func (UnimplementedModuleCapabilitiesServiceHandler) CheckWorkContextRecordAccess(context.Context, *connect.Request[v1.CheckWorkContextRecordAccessRequest]) (*connect.Response[v1.CheckWorkContextRecordAccessResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess is not implemented")) } diff --git a/gen/saas/accounts/v1/accountsv1connect/organizations.connect.go b/gen/saas/accounts/v1/accountsv1connect/organizations.connect.go index 9dbb524..f38f46b 100644 --- a/gen/saas/accounts/v1/accountsv1connect/organizations.connect.go +++ b/gen/saas/accounts/v1/accountsv1connect/organizations.connect.go @@ -49,6 +49,15 @@ const ( // OrganizationServiceRemoveMemberProcedure is the fully-qualified name of the OrganizationService's // RemoveMember RPC. OrganizationServiceRemoveMemberProcedure = "/saas.accounts.v1.OrganizationService/RemoveMember" + // OrganizationServiceUpdateOrganizationProcedure is the fully-qualified name of the + // OrganizationService's UpdateOrganization RPC. + OrganizationServiceUpdateOrganizationProcedure = "/saas.accounts.v1.OrganizationService/UpdateOrganization" + // OrganizationServiceLeaveOrganizationProcedure is the fully-qualified name of the + // OrganizationService's LeaveOrganization RPC. + OrganizationServiceLeaveOrganizationProcedure = "/saas.accounts.v1.OrganizationService/LeaveOrganization" + // OrganizationServiceDeleteOrganizationProcedure is the fully-qualified name of the + // OrganizationService's DeleteOrganization RPC. + OrganizationServiceDeleteOrganizationProcedure = "/saas.accounts.v1.OrganizationService/DeleteOrganization" // OrganizationServiceListMembersProcedure is the fully-qualified name of the OrganizationService's // ListMembers RPC. OrganizationServiceListMembersProcedure = "/saas.accounts.v1.OrganizationService/ListMembers" @@ -73,6 +82,17 @@ type OrganizationServiceClient interface { ListOrganizations(context.Context, *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) AddMember(context.Context, *connect.Request[v1.AddOrgMemberRequest]) (*connect.Response[emptypb.Empty], error) RemoveMember(context.Context, *connect.Request[v1.RemoveOrgMemberRequest]) (*connect.Response[emptypb.Empty], error) + // UpdateOrganization renames an organization or changes its slug. + UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.Organization], error) + // LeaveOrganization removes the caller's own membership. The subject is + // always the caller; the last administrator of an organization others still + // belong to is refused. + LeaveOrganization(context.Context, *connect.Request[v1.LeaveOrganizationRequest]) (*connect.Response[emptypb.Empty], error) + // DeleteOrganization archives an organization: it disappears from every + // member's list, admits no further request, and its credentials, grants and + // pending invitations are revoked. Its history is kept. Only an owner or a + // platform super administrator may delete. + DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[emptypb.Empty], error) ListMembers(context.Context, *connect.Request[v1.ListOrgMembersRequest]) (*connect.Response[v1.ListOrgMembersResponse], error) GetOrgSettings(context.Context, *connect.Request[v1.GetOrgSettingsRequest]) (*connect.Response[v1.OrgSettings], error) UpdateOrgSettings(context.Context, *connect.Request[v1.UpdateOrgSettingsRequest]) (*connect.Response[v1.OrgSettings], error) @@ -125,6 +145,24 @@ func NewOrganizationServiceClient(httpClient connect.HTTPClient, baseURL string, connect.WithSchema(organizationServiceMethods.ByName("RemoveMember")), connect.WithClientOptions(opts...), ), + updateOrganization: connect.NewClient[v1.UpdateOrganizationRequest, v1.Organization]( + httpClient, + baseURL+OrganizationServiceUpdateOrganizationProcedure, + connect.WithSchema(organizationServiceMethods.ByName("UpdateOrganization")), + connect.WithClientOptions(opts...), + ), + leaveOrganization: connect.NewClient[v1.LeaveOrganizationRequest, emptypb.Empty]( + httpClient, + baseURL+OrganizationServiceLeaveOrganizationProcedure, + connect.WithSchema(organizationServiceMethods.ByName("LeaveOrganization")), + connect.WithClientOptions(opts...), + ), + deleteOrganization: connect.NewClient[v1.DeleteOrganizationRequest, emptypb.Empty]( + httpClient, + baseURL+OrganizationServiceDeleteOrganizationProcedure, + connect.WithSchema(organizationServiceMethods.ByName("DeleteOrganization")), + connect.WithClientOptions(opts...), + ), listMembers: connect.NewClient[v1.ListOrgMembersRequest, v1.ListOrgMembersResponse]( httpClient, baseURL+OrganizationServiceListMembersProcedure, @@ -165,6 +203,9 @@ type organizationServiceClient struct { listOrganizations *connect.Client[v1.ListOrganizationsRequest, v1.ListOrganizationsResponse] addMember *connect.Client[v1.AddOrgMemberRequest, emptypb.Empty] removeMember *connect.Client[v1.RemoveOrgMemberRequest, emptypb.Empty] + updateOrganization *connect.Client[v1.UpdateOrganizationRequest, v1.Organization] + leaveOrganization *connect.Client[v1.LeaveOrganizationRequest, emptypb.Empty] + deleteOrganization *connect.Client[v1.DeleteOrganizationRequest, emptypb.Empty] listMembers *connect.Client[v1.ListOrgMembersRequest, v1.ListOrgMembersResponse] getOrgSettings *connect.Client[v1.GetOrgSettingsRequest, v1.OrgSettings] updateOrgSettings *connect.Client[v1.UpdateOrgSettingsRequest, v1.OrgSettings] @@ -197,6 +238,21 @@ func (c *organizationServiceClient) RemoveMember(ctx context.Context, req *conne return c.removeMember.CallUnary(ctx, req) } +// UpdateOrganization calls saas.accounts.v1.OrganizationService.UpdateOrganization. +func (c *organizationServiceClient) UpdateOrganization(ctx context.Context, req *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.Organization], error) { + return c.updateOrganization.CallUnary(ctx, req) +} + +// LeaveOrganization calls saas.accounts.v1.OrganizationService.LeaveOrganization. +func (c *organizationServiceClient) LeaveOrganization(ctx context.Context, req *connect.Request[v1.LeaveOrganizationRequest]) (*connect.Response[emptypb.Empty], error) { + return c.leaveOrganization.CallUnary(ctx, req) +} + +// DeleteOrganization calls saas.accounts.v1.OrganizationService.DeleteOrganization. +func (c *organizationServiceClient) DeleteOrganization(ctx context.Context, req *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[emptypb.Empty], error) { + return c.deleteOrganization.CallUnary(ctx, req) +} + // ListMembers calls saas.accounts.v1.OrganizationService.ListMembers. func (c *organizationServiceClient) ListMembers(ctx context.Context, req *connect.Request[v1.ListOrgMembersRequest]) (*connect.Response[v1.ListOrgMembersResponse], error) { return c.listMembers.CallUnary(ctx, req) @@ -230,6 +286,17 @@ type OrganizationServiceHandler interface { ListOrganizations(context.Context, *connect.Request[v1.ListOrganizationsRequest]) (*connect.Response[v1.ListOrganizationsResponse], error) AddMember(context.Context, *connect.Request[v1.AddOrgMemberRequest]) (*connect.Response[emptypb.Empty], error) RemoveMember(context.Context, *connect.Request[v1.RemoveOrgMemberRequest]) (*connect.Response[emptypb.Empty], error) + // UpdateOrganization renames an organization or changes its slug. + UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.Organization], error) + // LeaveOrganization removes the caller's own membership. The subject is + // always the caller; the last administrator of an organization others still + // belong to is refused. + LeaveOrganization(context.Context, *connect.Request[v1.LeaveOrganizationRequest]) (*connect.Response[emptypb.Empty], error) + // DeleteOrganization archives an organization: it disappears from every + // member's list, admits no further request, and its credentials, grants and + // pending invitations are revoked. Its history is kept. Only an owner or a + // platform super administrator may delete. + DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[emptypb.Empty], error) ListMembers(context.Context, *connect.Request[v1.ListOrgMembersRequest]) (*connect.Response[v1.ListOrgMembersResponse], error) GetOrgSettings(context.Context, *connect.Request[v1.GetOrgSettingsRequest]) (*connect.Response[v1.OrgSettings], error) UpdateOrgSettings(context.Context, *connect.Request[v1.UpdateOrgSettingsRequest]) (*connect.Response[v1.OrgSettings], error) @@ -278,6 +345,24 @@ func NewOrganizationServiceHandler(svc OrganizationServiceHandler, opts ...conne connect.WithSchema(organizationServiceMethods.ByName("RemoveMember")), connect.WithHandlerOptions(opts...), ) + organizationServiceUpdateOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceUpdateOrganizationProcedure, + svc.UpdateOrganization, + connect.WithSchema(organizationServiceMethods.ByName("UpdateOrganization")), + connect.WithHandlerOptions(opts...), + ) + organizationServiceLeaveOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceLeaveOrganizationProcedure, + svc.LeaveOrganization, + connect.WithSchema(organizationServiceMethods.ByName("LeaveOrganization")), + connect.WithHandlerOptions(opts...), + ) + organizationServiceDeleteOrganizationHandler := connect.NewUnaryHandler( + OrganizationServiceDeleteOrganizationProcedure, + svc.DeleteOrganization, + connect.WithSchema(organizationServiceMethods.ByName("DeleteOrganization")), + connect.WithHandlerOptions(opts...), + ) organizationServiceListMembersHandler := connect.NewUnaryHandler( OrganizationServiceListMembersProcedure, svc.ListMembers, @@ -320,6 +405,12 @@ func NewOrganizationServiceHandler(svc OrganizationServiceHandler, opts ...conne organizationServiceAddMemberHandler.ServeHTTP(w, r) case OrganizationServiceRemoveMemberProcedure: organizationServiceRemoveMemberHandler.ServeHTTP(w, r) + case OrganizationServiceUpdateOrganizationProcedure: + organizationServiceUpdateOrganizationHandler.ServeHTTP(w, r) + case OrganizationServiceLeaveOrganizationProcedure: + organizationServiceLeaveOrganizationHandler.ServeHTTP(w, r) + case OrganizationServiceDeleteOrganizationProcedure: + organizationServiceDeleteOrganizationHandler.ServeHTTP(w, r) case OrganizationServiceListMembersProcedure: organizationServiceListMembersHandler.ServeHTTP(w, r) case OrganizationServiceGetOrgSettingsProcedure: @@ -359,6 +450,18 @@ func (UnimplementedOrganizationServiceHandler) RemoveMember(context.Context, *co return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.OrganizationService.RemoveMember is not implemented")) } +func (UnimplementedOrganizationServiceHandler) UpdateOrganization(context.Context, *connect.Request[v1.UpdateOrganizationRequest]) (*connect.Response[v1.Organization], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.OrganizationService.UpdateOrganization is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) LeaveOrganization(context.Context, *connect.Request[v1.LeaveOrganizationRequest]) (*connect.Response[emptypb.Empty], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.OrganizationService.LeaveOrganization is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) DeleteOrganization(context.Context, *connect.Request[v1.DeleteOrganizationRequest]) (*connect.Response[emptypb.Empty], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.OrganizationService.DeleteOrganization is not implemented")) +} + func (UnimplementedOrganizationServiceHandler) ListMembers(context.Context, *connect.Request[v1.ListOrgMembersRequest]) (*connect.Response[v1.ListOrgMembersResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.OrganizationService.ListMembers is not implemented")) } diff --git a/gen/saas/accounts/v1/accountsv1connect/platform_admin.connect.go b/gen/saas/accounts/v1/accountsv1connect/platform_admin.connect.go index b9a2832..d5b42b9 100644 --- a/gen/saas/accounts/v1/accountsv1connect/platform_admin.connect.go +++ b/gen/saas/accounts/v1/accountsv1connect/platform_admin.connect.go @@ -72,6 +72,12 @@ const ( // PlatformAdminServiceListPlatformAdminsProcedure is the fully-qualified name of the // PlatformAdminService's ListPlatformAdmins RPC. PlatformAdminServiceListPlatformAdminsProcedure = "/saas.accounts.v1.PlatformAdminService/ListPlatformAdmins" + // PlatformAdminServiceListAllOrganizationsProcedure is the fully-qualified name of the + // PlatformAdminService's ListAllOrganizations RPC. + PlatformAdminServiceListAllOrganizationsProcedure = "/saas.accounts.v1.PlatformAdminService/ListAllOrganizations" + // PlatformAdminServiceGetOrganizationRosterProcedure is the fully-qualified name of the + // PlatformAdminService's GetOrganizationRoster RPC. + PlatformAdminServiceGetOrganizationRosterProcedure = "/saas.accounts.v1.PlatformAdminService/GetOrganizationRoster" // PlatformAdminServiceListFeatureFlagsProcedure is the fully-qualified name of the // PlatformAdminService's ListFeatureFlags RPC. PlatformAdminServiceListFeatureFlagsProcedure = "/saas.accounts.v1.PlatformAdminService/ListFeatureFlags" @@ -96,6 +102,9 @@ const ( // PlatformAdminServiceListEventSubscriptionsProcedure is the fully-qualified name of the // PlatformAdminService's ListEventSubscriptions RPC. PlatformAdminServiceListEventSubscriptionsProcedure = "/saas.accounts.v1.PlatformAdminService/ListEventSubscriptions" + // PlatformAdminServiceListPlatformCatalogueProcedure is the fully-qualified name of the + // PlatformAdminService's ListPlatformCatalogue RPC. + PlatformAdminServiceListPlatformCatalogueProcedure = "/saas.accounts.v1.PlatformAdminService/ListPlatformCatalogue" ) // PlatformAdminServiceClient is a client for the saas.accounts.v1.PlatformAdminService service. @@ -124,6 +133,12 @@ type PlatformAdminServiceClient interface { GrantPlatformRole(context.Context, *connect.Request[v1.GrantPlatformRoleRequest]) (*connect.Response[emptypb.Empty], error) RevokePlatformRole(context.Context, *connect.Request[v1.RevokePlatformRoleRequest]) (*connect.Response[emptypb.Empty], error) ListPlatformAdmins(context.Context, *connect.Request[v1.ListPlatformAdminsRequest]) (*connect.Response[v1.ListPlatformAdminsResponse], error) + // ListAllOrganizations lists every organization on the platform, whether or + // not the caller belongs to it. + ListAllOrganizations(context.Context, *connect.Request[v1.ListAllOrganizationsRequest]) (*connect.Response[v1.ListAllOrganizationsResponse], error) + // GetOrganizationRoster lists any organization's members for the platform + // view, which needs no membership of its own. + GetOrganizationRoster(context.Context, *connect.Request[v1.GetOrganizationRosterRequest]) (*connect.Response[v1.GetOrganizationRosterResponse], error) // Legacy feature-flag migration inventory (platform-only, read-only) ListFeatureFlags(context.Context, *connect.Request[v1.ListFeatureFlagsRequest]) (*connect.Response[v1.ListFeatureFlagsResponse], error) // Deprecated: retained for v1 wire compatibility. The legacy inventory is @@ -142,6 +157,9 @@ type PlatformAdminServiceClient interface { // control-plane subscription metadata do. GetEventOperations(context.Context, *connect.Request[v12.GetEventOperationsRequest]) (*connect.Response[v12.GetEventOperationsResponse], error) ListEventSubscriptions(context.Context, *connect.Request[v12.ListEventSubscriptionsRequest]) (*connect.Response[v12.ListEventSubscriptionsResponse], error) + // ListPlatformCatalogue lists every composed module and solution with what + // it declares, what runs, and which organizations have it installed. + ListPlatformCatalogue(context.Context, *connect.Request[v1.ListPlatformCatalogueRequest]) (*connect.Response[v1.ListPlatformCatalogueResponse], error) } // NewPlatformAdminServiceClient constructs a client for the saas.accounts.v1.PlatformAdminService @@ -227,6 +245,18 @@ func NewPlatformAdminServiceClient(httpClient connect.HTTPClient, baseURL string connect.WithSchema(platformAdminServiceMethods.ByName("ListPlatformAdmins")), connect.WithClientOptions(opts...), ), + listAllOrganizations: connect.NewClient[v1.ListAllOrganizationsRequest, v1.ListAllOrganizationsResponse]( + httpClient, + baseURL+PlatformAdminServiceListAllOrganizationsProcedure, + connect.WithSchema(platformAdminServiceMethods.ByName("ListAllOrganizations")), + connect.WithClientOptions(opts...), + ), + getOrganizationRoster: connect.NewClient[v1.GetOrganizationRosterRequest, v1.GetOrganizationRosterResponse]( + httpClient, + baseURL+PlatformAdminServiceGetOrganizationRosterProcedure, + connect.WithSchema(platformAdminServiceMethods.ByName("GetOrganizationRoster")), + connect.WithClientOptions(opts...), + ), listFeatureFlags: connect.NewClient[v1.ListFeatureFlagsRequest, v1.ListFeatureFlagsResponse]( httpClient, baseURL+PlatformAdminServiceListFeatureFlagsProcedure, @@ -275,6 +305,12 @@ func NewPlatformAdminServiceClient(httpClient connect.HTTPClient, baseURL string connect.WithSchema(platformAdminServiceMethods.ByName("ListEventSubscriptions")), connect.WithClientOptions(opts...), ), + listPlatformCatalogue: connect.NewClient[v1.ListPlatformCatalogueRequest, v1.ListPlatformCatalogueResponse]( + httpClient, + baseURL+PlatformAdminServiceListPlatformCatalogueProcedure, + connect.WithSchema(platformAdminServiceMethods.ByName("ListPlatformCatalogue")), + connect.WithClientOptions(opts...), + ), } } @@ -292,6 +328,8 @@ type platformAdminServiceClient struct { grantPlatformRole *connect.Client[v1.GrantPlatformRoleRequest, emptypb.Empty] revokePlatformRole *connect.Client[v1.RevokePlatformRoleRequest, emptypb.Empty] listPlatformAdmins *connect.Client[v1.ListPlatformAdminsRequest, v1.ListPlatformAdminsResponse] + listAllOrganizations *connect.Client[v1.ListAllOrganizationsRequest, v1.ListAllOrganizationsResponse] + getOrganizationRoster *connect.Client[v1.GetOrganizationRosterRequest, v1.GetOrganizationRosterResponse] listFeatureFlags *connect.Client[v1.ListFeatureFlagsRequest, v1.ListFeatureFlagsResponse] upsertFeatureFlag *connect.Client[v1.UpsertFeatureFlagRequest, v1.UpsertFeatureFlagResponse] getJobOperations *connect.Client[v11.GetJobOperationsRequest, v11.GetJobOperationsResponse] @@ -300,6 +338,7 @@ type platformAdminServiceClient struct { replayJob *connect.Client[v11.ReplayJobRequest, v11.ReplayJobResponse] getEventOperations *connect.Client[v12.GetEventOperationsRequest, v12.GetEventOperationsResponse] listEventSubscriptions *connect.Client[v12.ListEventSubscriptionsRequest, v12.ListEventSubscriptionsResponse] + listPlatformCatalogue *connect.Client[v1.ListPlatformCatalogueRequest, v1.ListPlatformCatalogueResponse] } // SearchUsers calls saas.accounts.v1.PlatformAdminService.SearchUsers. @@ -362,6 +401,16 @@ func (c *platformAdminServiceClient) ListPlatformAdmins(ctx context.Context, req return c.listPlatformAdmins.CallUnary(ctx, req) } +// ListAllOrganizations calls saas.accounts.v1.PlatformAdminService.ListAllOrganizations. +func (c *platformAdminServiceClient) ListAllOrganizations(ctx context.Context, req *connect.Request[v1.ListAllOrganizationsRequest]) (*connect.Response[v1.ListAllOrganizationsResponse], error) { + return c.listAllOrganizations.CallUnary(ctx, req) +} + +// GetOrganizationRoster calls saas.accounts.v1.PlatformAdminService.GetOrganizationRoster. +func (c *platformAdminServiceClient) GetOrganizationRoster(ctx context.Context, req *connect.Request[v1.GetOrganizationRosterRequest]) (*connect.Response[v1.GetOrganizationRosterResponse], error) { + return c.getOrganizationRoster.CallUnary(ctx, req) +} + // ListFeatureFlags calls saas.accounts.v1.PlatformAdminService.ListFeatureFlags. func (c *platformAdminServiceClient) ListFeatureFlags(ctx context.Context, req *connect.Request[v1.ListFeatureFlagsRequest]) (*connect.Response[v1.ListFeatureFlagsResponse], error) { return c.listFeatureFlags.CallUnary(ctx, req) @@ -404,6 +453,11 @@ func (c *platformAdminServiceClient) ListEventSubscriptions(ctx context.Context, return c.listEventSubscriptions.CallUnary(ctx, req) } +// ListPlatformCatalogue calls saas.accounts.v1.PlatformAdminService.ListPlatformCatalogue. +func (c *platformAdminServiceClient) ListPlatformCatalogue(ctx context.Context, req *connect.Request[v1.ListPlatformCatalogueRequest]) (*connect.Response[v1.ListPlatformCatalogueResponse], error) { + return c.listPlatformCatalogue.CallUnary(ctx, req) +} + // PlatformAdminServiceHandler is an implementation of the saas.accounts.v1.PlatformAdminService // service. type PlatformAdminServiceHandler interface { @@ -431,6 +485,12 @@ type PlatformAdminServiceHandler interface { GrantPlatformRole(context.Context, *connect.Request[v1.GrantPlatformRoleRequest]) (*connect.Response[emptypb.Empty], error) RevokePlatformRole(context.Context, *connect.Request[v1.RevokePlatformRoleRequest]) (*connect.Response[emptypb.Empty], error) ListPlatformAdmins(context.Context, *connect.Request[v1.ListPlatformAdminsRequest]) (*connect.Response[v1.ListPlatformAdminsResponse], error) + // ListAllOrganizations lists every organization on the platform, whether or + // not the caller belongs to it. + ListAllOrganizations(context.Context, *connect.Request[v1.ListAllOrganizationsRequest]) (*connect.Response[v1.ListAllOrganizationsResponse], error) + // GetOrganizationRoster lists any organization's members for the platform + // view, which needs no membership of its own. + GetOrganizationRoster(context.Context, *connect.Request[v1.GetOrganizationRosterRequest]) (*connect.Response[v1.GetOrganizationRosterResponse], error) // Legacy feature-flag migration inventory (platform-only, read-only) ListFeatureFlags(context.Context, *connect.Request[v1.ListFeatureFlagsRequest]) (*connect.Response[v1.ListFeatureFlagsResponse], error) // Deprecated: retained for v1 wire compatibility. The legacy inventory is @@ -449,6 +509,9 @@ type PlatformAdminServiceHandler interface { // control-plane subscription metadata do. GetEventOperations(context.Context, *connect.Request[v12.GetEventOperationsRequest]) (*connect.Response[v12.GetEventOperationsResponse], error) ListEventSubscriptions(context.Context, *connect.Request[v12.ListEventSubscriptionsRequest]) (*connect.Response[v12.ListEventSubscriptionsResponse], error) + // ListPlatformCatalogue lists every composed module and solution with what + // it declares, what runs, and which organizations have it installed. + ListPlatformCatalogue(context.Context, *connect.Request[v1.ListPlatformCatalogueRequest]) (*connect.Response[v1.ListPlatformCatalogueResponse], error) } // NewPlatformAdminServiceHandler builds an HTTP handler from the service implementation. It returns @@ -530,6 +593,18 @@ func NewPlatformAdminServiceHandler(svc PlatformAdminServiceHandler, opts ...con connect.WithSchema(platformAdminServiceMethods.ByName("ListPlatformAdmins")), connect.WithHandlerOptions(opts...), ) + platformAdminServiceListAllOrganizationsHandler := connect.NewUnaryHandler( + PlatformAdminServiceListAllOrganizationsProcedure, + svc.ListAllOrganizations, + connect.WithSchema(platformAdminServiceMethods.ByName("ListAllOrganizations")), + connect.WithHandlerOptions(opts...), + ) + platformAdminServiceGetOrganizationRosterHandler := connect.NewUnaryHandler( + PlatformAdminServiceGetOrganizationRosterProcedure, + svc.GetOrganizationRoster, + connect.WithSchema(platformAdminServiceMethods.ByName("GetOrganizationRoster")), + connect.WithHandlerOptions(opts...), + ) platformAdminServiceListFeatureFlagsHandler := connect.NewUnaryHandler( PlatformAdminServiceListFeatureFlagsProcedure, svc.ListFeatureFlags, @@ -578,6 +653,12 @@ func NewPlatformAdminServiceHandler(svc PlatformAdminServiceHandler, opts ...con connect.WithSchema(platformAdminServiceMethods.ByName("ListEventSubscriptions")), connect.WithHandlerOptions(opts...), ) + platformAdminServiceListPlatformCatalogueHandler := connect.NewUnaryHandler( + PlatformAdminServiceListPlatformCatalogueProcedure, + svc.ListPlatformCatalogue, + connect.WithSchema(platformAdminServiceMethods.ByName("ListPlatformCatalogue")), + connect.WithHandlerOptions(opts...), + ) return "/saas.accounts.v1.PlatformAdminService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case PlatformAdminServiceSearchUsersProcedure: @@ -604,6 +685,10 @@ func NewPlatformAdminServiceHandler(svc PlatformAdminServiceHandler, opts ...con platformAdminServiceRevokePlatformRoleHandler.ServeHTTP(w, r) case PlatformAdminServiceListPlatformAdminsProcedure: platformAdminServiceListPlatformAdminsHandler.ServeHTTP(w, r) + case PlatformAdminServiceListAllOrganizationsProcedure: + platformAdminServiceListAllOrganizationsHandler.ServeHTTP(w, r) + case PlatformAdminServiceGetOrganizationRosterProcedure: + platformAdminServiceGetOrganizationRosterHandler.ServeHTTP(w, r) case PlatformAdminServiceListFeatureFlagsProcedure: platformAdminServiceListFeatureFlagsHandler.ServeHTTP(w, r) case PlatformAdminServiceUpsertFeatureFlagProcedure: @@ -620,6 +705,8 @@ func NewPlatformAdminServiceHandler(svc PlatformAdminServiceHandler, opts ...con platformAdminServiceGetEventOperationsHandler.ServeHTTP(w, r) case PlatformAdminServiceListEventSubscriptionsProcedure: platformAdminServiceListEventSubscriptionsHandler.ServeHTTP(w, r) + case PlatformAdminServiceListPlatformCatalogueProcedure: + platformAdminServiceListPlatformCatalogueHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -677,6 +764,14 @@ func (UnimplementedPlatformAdminServiceHandler) ListPlatformAdmins(context.Conte return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.ListPlatformAdmins is not implemented")) } +func (UnimplementedPlatformAdminServiceHandler) ListAllOrganizations(context.Context, *connect.Request[v1.ListAllOrganizationsRequest]) (*connect.Response[v1.ListAllOrganizationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.ListAllOrganizations is not implemented")) +} + +func (UnimplementedPlatformAdminServiceHandler) GetOrganizationRoster(context.Context, *connect.Request[v1.GetOrganizationRosterRequest]) (*connect.Response[v1.GetOrganizationRosterResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.GetOrganizationRoster is not implemented")) +} + func (UnimplementedPlatformAdminServiceHandler) ListFeatureFlags(context.Context, *connect.Request[v1.ListFeatureFlagsRequest]) (*connect.Response[v1.ListFeatureFlagsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.ListFeatureFlags is not implemented")) } @@ -708,3 +803,7 @@ func (UnimplementedPlatformAdminServiceHandler) GetEventOperations(context.Conte func (UnimplementedPlatformAdminServiceHandler) ListEventSubscriptions(context.Context, *connect.Request[v12.ListEventSubscriptionsRequest]) (*connect.Response[v12.ListEventSubscriptionsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.ListEventSubscriptions is not implemented")) } + +func (UnimplementedPlatformAdminServiceHandler) ListPlatformCatalogue(context.Context, *connect.Request[v1.ListPlatformCatalogueRequest]) (*connect.Response[v1.ListPlatformCatalogueResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.PlatformAdminService.ListPlatformCatalogue is not implemented")) +} diff --git a/gen/saas/accounts/v1/api_keys.pb.go b/gen/saas/accounts/v1/api_keys.pb.go index 557b00f..6aef82e 100644 --- a/gen/saas/accounts/v1/api_keys.pb.go +++ b/gen/saas/accounts/v1/api_keys.pb.go @@ -714,9 +714,9 @@ const file_saas_accounts_v1_api_keys_proto_rawDesc = "" + "\x11APIKeyEnvironment\x12#\n" + "\x1fAPI_KEY_ENVIRONMENT_UNSPECIFIED\x10\x00\x12\x1c\n" + "\x18API_KEY_ENVIRONMENT_LIVE\x10\x01\x12\x1c\n" + - "\x18API_KEY_ENVIRONMENT_TEST\x10\x022\x81\x06\n" + - "\rAPIKeyService\x12\xdd\x01\n" + - "\fCreateAPIKey\x12%.saas.accounts.v1.CreateAPIKeyRequest\x1a&.saas.accounts.v1.CreateAPIKeyResponse\"~\xc2\xf3\x18c\b\x02\x10\x04\x1a\x0eapi_keys:write\"\x0eapi_keys:write*\x15\n" + + "\x18API_KEY_ENVIRONMENT_TEST\x10\x022\xf1\x05\n" + + "\rAPIKeyService\x12\xcd\x01\n" + + "\fCreateAPIKey\x12%.saas.accounts.v1.CreateAPIKeyRequest\x1a&.saas.accounts.v1.CreateAPIKeyResponse\"n\xc2\xf3\x18S\b\x02\x10\x04\x1a\x0eapi_keys:write*\x15\n" + "\x0forganization_id\x10\x02\x18\x010\x01:\x18\n" + "\x14saas.api_key.created\x10\x02@\x01H\x04P\x03X\x04`\x01x\x02\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/v1/api-keys\x12\xbd\x01\n" + "\vListAPIKeys\x12$.saas.accounts.v1.ListAPIKeysRequest\x1a%.saas.accounts.v1.ListAPIKeysResponse\"a\xc2\xf3\x18I\b\x02\x10\x03\x1a\rapi_keys:read\"\rapi_keys:read*\x15\n" + diff --git a/gen/saas/accounts/v1/audit.pb.go b/gen/saas/accounts/v1/audit.pb.go index bd10ff8..dbea0c7 100644 --- a/gen/saas/accounts/v1/audit.pb.go +++ b/gen/saas/accounts/v1/audit.pb.go @@ -215,7 +215,18 @@ type QueryAuditLogRequest struct { // client_id narrows the search to calls made through one registered client. // It is the companion to reading the client off each record: without it // "what did this client do" can only be answered by paging the whole trail. - ClientId string `protobuf:"bytes,14,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + ClientId string `protobuf:"bytes,14,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // event_types is the set form of event_type: a record matches when its type is + // any one of them. Both may be sent; a record must then satisfy each, which + // for a single-element set is the same answer as either alone. + // + // It exists because a summary over a *family* of event types had no filter to + // open. "New users" counts every type the registry marks as recording a + // person joining — a set the registry owns and may extend — and a scalar + // event_type cannot name a set, so the figure could be shown and never + // checked. Picking one member instead would have shown a different number + // from the one clicked. + EventTypes []string `protobuf:"bytes,15,rep,name=event_types,json=eventTypes,proto3" json:"event_types,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -349,6 +360,13 @@ func (x *QueryAuditLogRequest) GetClientId() string { return "" } +func (x *QueryAuditLogRequest) GetEventTypes() []string { + if x != nil { + return x.EventTypes + } + return nil +} + type QueryAuditLogResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Events []*AuditEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` @@ -415,8 +433,11 @@ type ExportAuditLogRequest struct { Format string `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"` // "csv" or "json" ActorId string `protobuf:"bytes,3,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` // Deprecated: Marked as deprecated in saas/accounts/v1/audit.proto. - Action string `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"` // use event_type - EventType string `protobuf:"bytes,5,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + Action string `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"` // use event_type + EventType string `protobuf:"bytes,5,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + // The set form of event_type, matching QueryAuditLogRequest.event_types, so a + // download carries the same filter as the list it was taken from. + EventTypes []string `protobuf:"bytes,6,rep,name=event_types,json=eventTypes,proto3" json:"event_types,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -487,6 +508,13 @@ func (x *ExportAuditLogRequest) GetEventType() string { return "" } +func (x *ExportAuditLogRequest) GetEventTypes() []string { + if x != nil { + return x.EventTypes + } + return nil +} + type ExportAuditLogResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` @@ -730,7 +758,12 @@ type AggregateAuditLogRequest struct { CollectionId string `protobuf:"bytes,16,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"` // client_id narrows the aggregation to calls made through one registered // client, matching QueryAuditLogRequest.client_id. - ClientId string `protobuf:"bytes,17,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + ClientId string `protobuf:"bytes,17,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // The set form of event_type, matching QueryAuditLogRequest.event_types. A + // tile that summarises a family of event types reads its figure through this + // and drives its own click through the same value, so the number shown and + // the list it opens cannot disagree. + EventTypes []string `protobuf:"bytes,18,rep,name=event_types,json=eventTypes,proto3" json:"event_types,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -884,6 +917,13 @@ func (x *AggregateAuditLogRequest) GetClientId() string { return "" } +func (x *AggregateAuditLogRequest) GetEventTypes() []string { + if x != nil { + return x.EventTypes + } + return nil +} + type AuditAggregateBucket struct { state protoimpl.MessageState `protogen:"open.v1"` // key is the first group dimension's value; keys holds every dimension. @@ -1077,6 +1117,14 @@ type AuditEventType struct { // stand in for it — a category groups events for facets, and not every // identity event is a person arriving. MarksUserJoined bool `protobuf:"varint,8,opt,name=marks_user_joined,json=marksUserJoined,proto3" json:"marks_user_joined,omitempty"` + // Whether an outbound webhook endpoint may subscribe to this type and ever + // receive it. A type is eligible when it is declared with external + // visibility: every platform type is, and a solution-declared or + // module-declared type is only when its producer declared it external AND + // the operator marked its namespace externally deliverable. The registry + // owns the answer so a subscription form cannot offer a name that can never + // fire, which is the silent acceptance this flag exists to end. + WebhookEligible bool `protobuf:"varint,9,opt,name=webhook_eligible,json=webhookEligible,proto3" json:"webhook_eligible,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1167,6 +1215,13 @@ func (x *AuditEventType) GetMarksUserJoined() bool { return false } +func (x *AuditEventType) GetWebhookEligible() bool { + if x != nil { + return x.WebhookEligible + } + return false +} + type ListAuditEventTypesResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Types []*AuditEventType `protobuf:"bytes,1,rep,name=types,proto3" json:"types,omitempty"` @@ -1241,7 +1296,7 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "\tclient_id\x18\x0f \x01(\tR\bclientId\x1a;\n" + "\rMetadataEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xe6\x04\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x98\x05\n" + "\x14QueryAuditLogRequest\x12\x15\n" + "\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x19\n" + "\bactor_id\x18\x02 \x01(\tR\aactorId\x12\x1a\n" + @@ -1260,7 +1315,9 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "\bcategory\x18\v \x01(\tR\bcategory\x12f\n" + "\x10payload_contains\x18\f \x03(\v2;.saas.accounts.v1.QueryAuditLogRequest.PayloadContainsEntryR\x0fpayloadContains\x12\x1c\n" + "\tnamespace\x18\r \x01(\tR\tnamespace\x12\x1b\n" + - "\tclient_id\x18\x0e \x01(\tR\bclientId\x1aB\n" + + "\tclient_id\x18\x0e \x01(\tR\bclientId\x120\n" + + "\vevent_types\x18\x0f \x03(\tB\x0f\xbaH\f\x92\x01\t\x10@\"\x05r\x03\x18\xff\x01R\n" + + "eventTypes\x1aB\n" + "\x14PayloadContainsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x96\x01\n" + @@ -1268,14 +1325,16 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "\x06events\x18\x01 \x03(\v2\x1c.saas.accounts.v1.AuditEventR\x06events\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x12\x1f\n" + "\vtotal_count\x18\x03 \x01(\x05R\n" + - "totalCount\"\x9c\x01\n" + + "totalCount\"\xce\x01\n" + "\x15ExportAuditLogRequest\x12\x15\n" + "\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x16\n" + "\x06format\x18\x02 \x01(\tR\x06format\x12\x19\n" + "\bactor_id\x18\x03 \x01(\tR\aactorId\x12\x1a\n" + "\x06action\x18\x04 \x01(\tB\x02\x18\x01R\x06action\x12\x1d\n" + "\n" + - "event_type\x18\x05 \x01(\tR\teventType\"k\n" + + "event_type\x18\x05 \x01(\tR\teventType\x120\n" + + "\vevent_types\x18\x06 \x03(\tB\x0f\xbaH\f\x92\x01\t\x10@\"\x05r\x03\x18\xff\x01R\n" + + "eventTypes\"k\n" + "\x16ExportAuditLogResponse\x12\x12\n" + "\x04data\x18\x01 \x01(\fR\x04data\x12!\n" + "\fcontent_type\x18\x02 \x01(\tR\vcontentType\x12\x1a\n" + @@ -1290,7 +1349,7 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "\x12AuditDerivedMetric\x12\x14\n" + "\x05alias\x18\x01 \x01(\tR\x05alias\x12\x1c\n" + "\tnumerator\x18\x02 \x01(\tR\tnumerator\x12 \n" + - "\vdenominator\x18\x03 \x01(\tR\vdenominator\"\xf9\x05\n" + + "\vdenominator\x18\x03 \x01(\tR\vdenominator\"\xab\x06\n" + "\x18AggregateAuditLogRequest\x12\x15\n" + "\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x19\n" + "\bactor_id\x18\x02 \x01(\tR\aactorId\x12\x1d\n" + @@ -1311,7 +1370,9 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "resourceId\x12j\n" + "\x10payload_contains\x18\x0f \x03(\v2?.saas.accounts.v1.AggregateAuditLogRequest.PayloadContainsEntryR\x0fpayloadContains\x12#\n" + "\rcollection_id\x18\x10 \x01(\tR\fcollectionId\x12\x1b\n" + - "\tclient_id\x18\x11 \x01(\tR\bclientId\x1aB\n" + + "\tclient_id\x18\x11 \x01(\tR\bclientId\x120\n" + + "\vevent_types\x18\x12 \x03(\tB\x0f\xbaH\f\x92\x01\t\x10@\"\x05r\x03\x18\xff\x01R\n" + + "eventTypes\x1aB\n" + "\x14PayloadContainsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xe8\x02\n" + @@ -1330,7 +1391,7 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "\x19AggregateAuditLogResponse\x12@\n" + "\abuckets\x18\x01 \x03(\v2&.saas.accounts.v1.AuditAggregateBucketR\abuckets\x124\n" + "\x16scope_contract_version\x18\x02 \x01(\rR\x14scopeContractVersion\"\x1c\n" + - "\x1aListAuditEventTypesRequest\"\xfc\x01\n" + + "\x1aListAuditEventTypesRequest\"\xa7\x02\n" + "\x0eAuditEventType\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n" + "\aversion\x18\x02 \x01(\x05R\aversion\x12\x1a\n" + @@ -1341,7 +1402,8 @@ const file_saas_accounts_v1_audit_proto_rawDesc = "" + "deprecated\x12 \n" + "\vdescription\x18\x06 \x01(\tR\vdescription\x12\x1c\n" + "\tnamespace\x18\a \x01(\tR\tnamespace\x12*\n" + - "\x11marks_user_joined\x18\b \x01(\bR\x0fmarksUserJoined\"U\n" + + "\x11marks_user_joined\x18\b \x01(\bR\x0fmarksUserJoined\x12)\n" + + "\x10webhook_eligible\x18\t \x01(\bR\x0fwebhookEligible\"U\n" + "\x1bListAuditEventTypesResponse\x126\n" + "\x05types\x18\x01 \x03(\v2 .saas.accounts.v1.AuditEventTypeR\x05types2\x9d\x06\n" + "\fAuditService\x12\xb5\x01\n" + diff --git a/gen/saas/accounts/v1/common.pb.go b/gen/saas/accounts/v1/common.pb.go index c22f6f5..2c75680 100644 --- a/gen/saas/accounts/v1/common.pb.go +++ b/gen/saas/accounts/v1/common.pb.go @@ -646,12 +646,16 @@ func (x *UserIdentity) GetEmailVerified() bool { } type Organization struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` - OwnerId string `protobuf:"bytes,4,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` + OwnerId string `protobuf:"bytes,4,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // Set when the organization was deleted. An archived organization is never + // listed to its former members and admits no request; only the platform + // view shows it. + ArchivedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=archived_at,json=archivedAt,proto3" json:"archived_at,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -721,6 +725,13 @@ func (x *Organization) GetCreatedAt() *timestamppb.Timestamp { return nil } +func (x *Organization) GetArchivedAt() *timestamppb.Timestamp { + if x != nil { + return x.ArchivedAt + } + return nil +} + type OrgMembership struct { state protoimpl.MessageState `protogen:"open.v1"` OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` @@ -983,6 +994,11 @@ func (x *TeamMembership) GetUserEmail() string { return "" } +// Permission is one resource:action grant: a role's RBAC grant, or one scope +// of an API key. The pair travels joined as `resource:action`, and a key's +// scopes as one comma-separated header, so neither half may hold `:`, `,`, +// whitespace or a control character — `users` / `read,*:*` would read back +// as the root `*:*`. A lone `*` is the wildcard. type Permission struct { state protoimpl.MessageState `protogen:"open.v1"` Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` @@ -1409,14 +1425,16 @@ const file_saas_accounts_v1_common_proto_rawDesc = "" + "\x0eemail_verified\x18\t \x01(\bR\remailVerified\x1a?\n" + "\x11ProviderDataEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xe2\x01\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9f\x02\n" + "\fOrganization\x12\x18\n" + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x1b\n" + "\x04name\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12;\n" + "\x04slug\x18\x03 \x01(\tB'\xbaH$r\"\x10\x01\x18?2\x1c^[a-z0-9][a-z0-9-]*[a-z0-9]$R\x04slug\x12#\n" + "\bowner_id\x18\x04 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aownerId\x129\n" + "\n" + - "created_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\"\xc6\x01\n" + + "created_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12;\n" + + "\varchived_at\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "archivedAt\"\xc6\x01\n" + "\rOrgMembership\x12\x15\n" + "\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x17\n" + "\auser_id\x18\x02 \x01(\tR\x06userId\x12-\n" + @@ -1440,11 +1458,11 @@ const file_saas_accounts_v1_common_proto_rawDesc = "" + "\x04role\x18\x03 \x01(\x0e2\x1a.saas.accounts.v1.TeamRoleR\x04role\x127\n" + "\tjoined_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\bjoinedAt\x12\x1d\n" + "\n" + - "user_email\x18\x05 \x01(\tR\tuserEmail\"R\n" + + "user_email\x18\x05 \x01(\tR\tuserEmail\"\x98\x01\n" + "\n" + - "Permission\x12#\n" + - "\bresource\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\bresource\x12\x1f\n" + - "\x06action\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x06action\"\xd1\x01\n" + + "Permission\x12F\n" + + "\bresource\x18\x01 \x01(\tB*\xbaH'r%\x10\x012!^(\\*|[A-Za-z0-9][A-Za-z0-9._-]*)$R\bresource\x12B\n" + + "\x06action\x18\x02 \x01(\tB*\xbaH'r%\x10\x012!^(\\*|[A-Za-z0-9][A-Za-z0-9._-]*)$R\x06action\"\xd1\x01\n" + "\x04Role\x12\x18\n" + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x1b\n" + "\x04name\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12 \n" + @@ -1562,23 +1580,24 @@ var file_saas_accounts_v1_common_proto_depIdxs = []int32{ 20, // 6: saas.accounts.v1.UserIdentity.last_used:type_name -> google.protobuf.Timestamp 19, // 7: saas.accounts.v1.UserIdentity.provider_data:type_name -> saas.accounts.v1.UserIdentity.ProviderDataEntry 20, // 8: saas.accounts.v1.Organization.created_at:type_name -> google.protobuf.Timestamp - 1, // 9: saas.accounts.v1.OrgMembership.role:type_name -> saas.accounts.v1.OrgRole - 20, // 10: saas.accounts.v1.OrgMembership.joined_at:type_name -> google.protobuf.Timestamp - 20, // 11: saas.accounts.v1.Team.created_at:type_name -> google.protobuf.Timestamp - 2, // 12: saas.accounts.v1.TeamMembership.role:type_name -> saas.accounts.v1.TeamRole - 20, // 13: saas.accounts.v1.TeamMembership.joined_at:type_name -> google.protobuf.Timestamp - 14, // 14: saas.accounts.v1.Role.permissions:type_name -> saas.accounts.v1.Permission - 3, // 15: saas.accounts.v1.RoleAssignment.subject_kind:type_name -> saas.accounts.v1.SubjectKind - 20, // 16: saas.accounts.v1.RoleAssignment.assigned_at:type_name -> google.protobuf.Timestamp - 4, // 17: saas.accounts.v1.Principal.kind:type_name -> saas.accounts.v1.PrincipalKind - 20, // 18: saas.accounts.v1.Principal.created_at:type_name -> google.protobuf.Timestamp - 20, // 19: saas.accounts.v1.Principal.revoked_at:type_name -> google.protobuf.Timestamp - 20, // 20: saas.accounts.v1.Principal.disabled_at:type_name -> google.protobuf.Timestamp - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 20, // 9: saas.accounts.v1.Organization.archived_at:type_name -> google.protobuf.Timestamp + 1, // 10: saas.accounts.v1.OrgMembership.role:type_name -> saas.accounts.v1.OrgRole + 20, // 11: saas.accounts.v1.OrgMembership.joined_at:type_name -> google.protobuf.Timestamp + 20, // 12: saas.accounts.v1.Team.created_at:type_name -> google.protobuf.Timestamp + 2, // 13: saas.accounts.v1.TeamMembership.role:type_name -> saas.accounts.v1.TeamRole + 20, // 14: saas.accounts.v1.TeamMembership.joined_at:type_name -> google.protobuf.Timestamp + 14, // 15: saas.accounts.v1.Role.permissions:type_name -> saas.accounts.v1.Permission + 3, // 16: saas.accounts.v1.RoleAssignment.subject_kind:type_name -> saas.accounts.v1.SubjectKind + 20, // 17: saas.accounts.v1.RoleAssignment.assigned_at:type_name -> google.protobuf.Timestamp + 4, // 18: saas.accounts.v1.Principal.kind:type_name -> saas.accounts.v1.PrincipalKind + 20, // 19: saas.accounts.v1.Principal.created_at:type_name -> google.protobuf.Timestamp + 20, // 20: saas.accounts.v1.Principal.revoked_at:type_name -> google.protobuf.Timestamp + 20, // 21: saas.accounts.v1.Principal.disabled_at:type_name -> google.protobuf.Timestamp + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_saas_accounts_v1_common_proto_init() } diff --git a/gen/saas/accounts/v1/datasource.pb.go b/gen/saas/accounts/v1/datasource.pb.go index 54938e1..0b7ff24 100644 --- a/gen/saas/accounts/v1/datasource.pb.go +++ b/gen/saas/accounts/v1/datasource.pb.go @@ -12,6 +12,7 @@ import ( _ "github.com/codefly-dev/saas-sdk-go/gen/saas/policy/v1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -146,6 +147,78 @@ func (DatasourceStatus) EnumDescriptor() ([]byte, []int) { return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{1} } +// DatasourceLiveDelivery is how a change at the source reaches this deployment +// without waiting for the periodic reconcile. It is what makes "is this source +// current?" answerable: with no live delivery, a source is current only as of +// its last sync, and reconcile_interval bounds how stale it may be. +// +// It is a property of the source AND of the deployment, which is why one +// boolean could never carry it. A source connected through the GitHub App holds +// no push secret of its own — its pushes arrive at the App's single webhook URL +// — so the per-source webhook_configured flag is false for it whether the +// deployment registered that App webhook or not. Reading that flag alone, +// every App-backed source looks exactly like a source with no live delivery at +// all, which is the most common connect path. +type DatasourceLiveDelivery int32 + +const ( + DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_UNSPECIFIED DatasourceLiveDelivery = 0 + // Nothing pushes to this source. It is refreshed by the periodic reconcile + // and by "Sync now", and by nothing else. + DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_NONE DatasourceLiveDelivery = 1 + // The source's own repository webhook, verified with the signing secret + // stored against it. This is what webhook_configured has always reported. + DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_SOURCE_WEBHOOK DatasourceLiveDelivery = 2 + // The deployment's GitHub App webhook: one registered endpoint carrying the + // pushes of every App-backed source, fanned out per source on receipt. Set + // only when this deployment has actually registered that webhook, so it is + // also the answer to "has anyone wired live delivery here at all". + DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_APP_WEBHOOK DatasourceLiveDelivery = 3 +) + +// Enum value maps for DatasourceLiveDelivery. +var ( + DatasourceLiveDelivery_name = map[int32]string{ + 0: "DATASOURCE_LIVE_DELIVERY_UNSPECIFIED", + 1: "DATASOURCE_LIVE_DELIVERY_NONE", + 2: "DATASOURCE_LIVE_DELIVERY_SOURCE_WEBHOOK", + 3: "DATASOURCE_LIVE_DELIVERY_APP_WEBHOOK", + } + DatasourceLiveDelivery_value = map[string]int32{ + "DATASOURCE_LIVE_DELIVERY_UNSPECIFIED": 0, + "DATASOURCE_LIVE_DELIVERY_NONE": 1, + "DATASOURCE_LIVE_DELIVERY_SOURCE_WEBHOOK": 2, + "DATASOURCE_LIVE_DELIVERY_APP_WEBHOOK": 3, + } +) + +func (x DatasourceLiveDelivery) Enum() *DatasourceLiveDelivery { + p := new(DatasourceLiveDelivery) + *p = x + return p +} + +func (x DatasourceLiveDelivery) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DatasourceLiveDelivery) Descriptor() protoreflect.EnumDescriptor { + return file_saas_accounts_v1_datasource_proto_enumTypes[2].Descriptor() +} + +func (DatasourceLiveDelivery) Type() protoreflect.EnumType { + return &file_saas_accounts_v1_datasource_proto_enumTypes[2] +} + +func (x DatasourceLiveDelivery) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DatasourceLiveDelivery.Descriptor instead. +func (DatasourceLiveDelivery) EnumDescriptor() ([]byte, []int) { + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{2} +} + // ApiCredentialKind is how the generic API connector presents its stored // credential on every outbound request. The credential material itself lives in // the secret store; only the kind (and, for KIND_HEADER/KIND_QUERY, the header @@ -204,11 +277,11 @@ func (x ApiCredentialKind) String() string { } func (ApiCredentialKind) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[2].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[3].Descriptor() } func (ApiCredentialKind) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[2] + return &file_saas_accounts_v1_datasource_proto_enumTypes[3] } func (x ApiCredentialKind) Number() protoreflect.EnumNumber { @@ -217,7 +290,7 @@ func (x ApiCredentialKind) Number() protoreflect.EnumNumber { // Deprecated: Use ApiCredentialKind.Descriptor instead. func (ApiCredentialKind) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{2} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{3} } // DatasourceConnectorInterface is one of the five connector interfaces a @@ -269,11 +342,11 @@ func (x DatasourceConnectorInterface) String() string { } func (DatasourceConnectorInterface) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[3].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[4].Descriptor() } func (DatasourceConnectorInterface) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[3] + return &file_saas_accounts_v1_datasource_proto_enumTypes[4] } func (x DatasourceConnectorInterface) Number() protoreflect.EnumNumber { @@ -282,7 +355,7 @@ func (x DatasourceConnectorInterface) Number() protoreflect.EnumNumber { // Deprecated: Use DatasourceConnectorInterface.Descriptor instead. func (DatasourceConnectorInterface) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{3} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{4} } // DatasourceCredentialMode is how a connector authenticates to its provider. @@ -330,11 +403,11 @@ func (x DatasourceCredentialMode) String() string { } func (DatasourceCredentialMode) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[4].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[5].Descriptor() } func (DatasourceCredentialMode) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[4] + return &file_saas_accounts_v1_datasource_proto_enumTypes[5] } func (x DatasourceCredentialMode) Number() protoreflect.EnumNumber { @@ -343,7 +416,7 @@ func (x DatasourceCredentialMode) Number() protoreflect.EnumNumber { // Deprecated: Use DatasourceCredentialMode.Descriptor instead. func (DatasourceCredentialMode) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{4} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{5} } // DatasourceReadersModel is how a connector derives each item's readers. @@ -385,11 +458,11 @@ func (x DatasourceReadersModel) String() string { } func (DatasourceReadersModel) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[5].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[6].Descriptor() } func (DatasourceReadersModel) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[5] + return &file_saas_accounts_v1_datasource_proto_enumTypes[6] } func (x DatasourceReadersModel) Number() protoreflect.EnumNumber { @@ -398,7 +471,7 @@ func (x DatasourceReadersModel) Number() protoreflect.EnumNumber { // Deprecated: Use DatasourceReadersModel.Descriptor instead. func (DatasourceReadersModel) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{5} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{6} } // SourceSyncPhase is the stage the host has reached in one sync of a source. @@ -461,11 +534,11 @@ func (x SourceSyncPhase) String() string { } func (SourceSyncPhase) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[6].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[7].Descriptor() } func (SourceSyncPhase) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[6] + return &file_saas_accounts_v1_datasource_proto_enumTypes[7] } func (x SourceSyncPhase) Number() protoreflect.EnumNumber { @@ -474,7 +547,7 @@ func (x SourceSyncPhase) Number() protoreflect.EnumNumber { // Deprecated: Use SourceSyncPhase.Descriptor instead. func (SourceSyncPhase) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{6} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{7} } // SourceSyncFailureReason classifies why a sync is waiting or failed, so a @@ -539,11 +612,11 @@ func (x SourceSyncFailureReason) String() string { } func (SourceSyncFailureReason) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[7].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[8].Descriptor() } func (SourceSyncFailureReason) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[7] + return &file_saas_accounts_v1_datasource_proto_enumTypes[8] } func (x SourceSyncFailureReason) Number() protoreflect.EnumNumber { @@ -552,7 +625,7 @@ func (x SourceSyncFailureReason) Number() protoreflect.EnumNumber { // Deprecated: Use SourceSyncFailureReason.Descriptor instead. func (SourceSyncFailureReason) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{7} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{8} } // SourceSyncTrigger is what started a sync. @@ -595,11 +668,11 @@ func (x SourceSyncTrigger) String() string { } func (SourceSyncTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[8].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[9].Descriptor() } func (SourceSyncTrigger) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[8] + return &file_saas_accounts_v1_datasource_proto_enumTypes[9] } func (x SourceSyncTrigger) Number() protoreflect.EnumNumber { @@ -608,7 +681,7 @@ func (x SourceSyncTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use SourceSyncTrigger.Descriptor instead. func (SourceSyncTrigger) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{8} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{9} } // DatasourceDomainStatus is where a domain's verification stands. @@ -647,11 +720,11 @@ func (x DatasourceDomainStatus) String() string { } func (DatasourceDomainStatus) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[9].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[10].Descriptor() } func (DatasourceDomainStatus) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[9] + return &file_saas_accounts_v1_datasource_proto_enumTypes[10] } func (x DatasourceDomainStatus) Number() protoreflect.EnumNumber { @@ -660,7 +733,7 @@ func (x DatasourceDomainStatus) Number() protoreflect.EnumNumber { // Deprecated: Use DatasourceDomainStatus.Descriptor instead. func (DatasourceDomainStatus) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{9} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{10} } // SourceDelegationRevocation says why a source delegation stopped delegating. @@ -722,11 +795,11 @@ func (x SourceDelegationRevocation) String() string { } func (SourceDelegationRevocation) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_datasource_proto_enumTypes[10].Descriptor() + return file_saas_accounts_v1_datasource_proto_enumTypes[11].Descriptor() } func (SourceDelegationRevocation) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_datasource_proto_enumTypes[10] + return &file_saas_accounts_v1_datasource_proto_enumTypes[11] } func (x SourceDelegationRevocation) Number() protoreflect.EnumNumber { @@ -735,7 +808,7 @@ func (x SourceDelegationRevocation) Number() protoreflect.EnumNumber { // Deprecated: Use SourceDelegationRevocation.Descriptor instead. func (SourceDelegationRevocation) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{10} + return file_saas_accounts_v1_datasource_proto_rawDescGZIP(), []int{11} } // GitHubDatasourceConfig is the public, non-secret configuration of a GitHub @@ -1189,8 +1262,18 @@ type Datasource struct { // so a client that must also read an older host, which sends neither field, // can key its flag on this and treat an empty gap as nothing to flag. ConformanceGap string `protobuf:"bytes,20,opt,name=conformance_gap,json=conformanceGap,proto3" json:"conformance_gap,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // How a change at the source reaches this deployment without waiting for the + // reconcile below. Strictly more informative than webhook_configured, which + // it does not replace: that field still reports exactly what it always did, + // whether a signing secret is stored for this source. + LiveDelivery DatasourceLiveDelivery `protobuf:"varint,21,opt,name=live_delivery,json=liveDelivery,proto3,enum=saas.accounts.v1.DatasourceLiveDelivery" json:"live_delivery,omitempty"` + // How often this source is reconciled from scratch when nothing pushes — the + // bound on how stale it may be. Zero means the periodic reconcile is off for + // it, which together with live_delivery NONE means it only ever changes when + // somebody presses "Sync now". + ReconcileInterval *durationpb.Duration `protobuf:"bytes,22,opt,name=reconcile_interval,json=reconcileInterval,proto3" json:"reconcile_interval,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Datasource) Reset() { @@ -1356,6 +1439,20 @@ func (x *Datasource) GetConformanceGap() string { return "" } +func (x *Datasource) GetLiveDelivery() DatasourceLiveDelivery { + if x != nil { + return x.LiveDelivery + } + return DatasourceLiveDelivery_DATASOURCE_LIVE_DELIVERY_UNSPECIFIED +} + +func (x *Datasource) GetReconcileInterval() *durationpb.Duration { + if x != nil { + return x.ReconcileInterval + } + return nil +} + type AddGitHubSourceRequest struct { state protoimpl.MessageState `protogen:"open.v1"` OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` @@ -2012,8 +2109,16 @@ type DatasourceProviderDescriptor struct { // non-conformant provider, and for one that translates provider permissions // while this deployment does not enforce them at read. AcceptsNewSources bool `protobuf:"varint,14,opt,name=accepts_new_sources,json=acceptsNewSources,proto3" json:"accepts_new_sources,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Whether THIS deployment has configured the provider-level push endpoint + // this connector receives on. supports_webhook says the connector can take + // pushes at all; this says an operator has wired them here. The pair is what + // distinguishes "this provider has no push path" from "it has one and nobody + // turned it on", which otherwise look identical from every client: both leave + // every source of it with no live delivery. Always false for a connector + // whose supports_webhook is false. + LiveDeliveryConfigured bool `protobuf:"varint,15,opt,name=live_delivery_configured,json=liveDeliveryConfigured,proto3" json:"live_delivery_configured,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DatasourceProviderDescriptor) Reset() { @@ -2144,6 +2249,13 @@ func (x *DatasourceProviderDescriptor) GetAcceptsNewSources() bool { return false } +func (x *DatasourceProviderDescriptor) GetLiveDeliveryConfigured() bool { + if x != nil { + return x.LiveDeliveryConfigured + } + return false +} + type GetDatasourceCatalogRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -2414,7 +2526,15 @@ type SyncSourceRequest struct { Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` // Optional replacement PAT: validate and encrypt for this existing GitHub // source before queuing sync. Empty keeps the saved credential. Never returned. - AccessToken string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + AccessToken string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // Reconnect the source: from now on its syncs run on behalf of the caller, + // exactly as when a person connects it (the source's delegations move to the + // caller). A replacement access_token is always a reconnect. Without one, + // only a GitHub source that holds no credential (a public repository) + // reconnects this way: the repository is proved still readable without a + // credential, then the delegation is recorded and a sync is queued. A source + // that holds a credential reconnects only with a replacement for it. + Reconnect bool `protobuf:"varint,4,opt,name=reconnect,proto3" json:"reconnect,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2470,6 +2590,13 @@ func (x *SyncSourceRequest) GetAccessToken() string { return "" } +func (x *SyncSourceRequest) GetReconnect() bool { + if x != nil { + return x.Reconnect + } + return false +} + type SyncSourceResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Durable jobs-inbox id of the enqueued sync request. The pull runs @@ -5197,7 +5324,7 @@ var File_saas_accounts_v1_datasource_proto protoreflect.FileDescriptor const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\n" + - "!saas/accounts/v1/datasource.proto\x12\x10saas.accounts.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17saas/jobs/v1/jobs.proto\x1a\x1csaas/policy/v1/options.proto\"\x83\x01\n" + + "!saas/accounts/v1/datasource.proto\x12\x10saas.accounts.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17saas/jobs/v1/jobs.proto\x1a\x1csaas/policy/v1/options.proto\"\x83\x01\n" + "\x16GitHubDatasourceConfig\x12\x12\n" + "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x14\n" + "\x05paths\x18\x02 \x03(\tR\x05paths\x12\x16\n" + @@ -5225,7 +5352,7 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\x06prefix\x18\x04 \x01(\tR\x06prefix\x12\"\n" + "\raccess_key_id\x18\x05 \x01(\tR\vaccessKeyId\x12\x1f\n" + "\vmax_objects\x18\x06 \x01(\rR\n" + - "maxObjects\"\xea\a\n" + + "maxObjects\"\x83\t\n" + "\n" + "Datasource\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x15\n" + @@ -5251,7 +5378,9 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\n" + "conformant\x18\x13 \x01(\bR\n" + "conformant\x12'\n" + - "\x0fconformance_gap\x18\x14 \x01(\tR\x0econformanceGapJ\x04\b\x04\x10\x05R\x11target_collection\"\x9b\x04\n" + + "\x0fconformance_gap\x18\x14 \x01(\tR\x0econformanceGap\x12M\n" + + "\rlive_delivery\x18\x15 \x01(\x0e2(.saas.accounts.v1.DatasourceLiveDeliveryR\fliveDelivery\x12H\n" + + "\x12reconcile_interval\x18\x16 \x01(\v2\x19.google.protobuf.DurationR\x11reconcileIntervalJ\x04\b\x04\x10\x05R\x11target_collection\"\x9b\x04\n" + "\x16AddGitHubSourceRequest\x12\x1f\n" + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12A\n" + "\x04repo\x18\x02 \x01(\tB-\xbaH*r(\x10\x03\x18\xff\x012!^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$R\x04repo\x12'\n" + @@ -5303,7 +5432,7 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\x0emax_item_bytes\x18\x03 \x01(\x03R\fmaxItemBytes\x122\n" + "\x15operations_per_window\x18\x04 \x01(\rR\x13operationsPerWindow\x12%\n" + "\x0ewindow_seconds\x18\x05 \x01(\x03R\rwindowSeconds\x128\n" + - "\x18background_share_percent\x18\x06 \x01(\rR\x16backgroundSharePercent\"\xd1\x06\n" + + "\x18background_share_percent\x18\x06 \x01(\rR\x16backgroundSharePercent\"\x8b\a\n" + "\x1cDatasourceProviderDescriptor\x12@\n" + "\bprovider\x18\x01 \x01(\x0e2$.saas.accounts.v1.DatasourceProviderR\bprovider\x12!\n" + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12 \n" + @@ -5321,7 +5450,8 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "conformant\x18\f \x01(\bR\n" + "conformant\x12'\n" + "\x0fconformance_gap\x18\r \x01(\tR\x0econformanceGap\x12.\n" + - "\x13accepts_new_sources\x18\x0e \x01(\bR\x11acceptsNewSources\"\x1d\n" + + "\x13accepts_new_sources\x18\x0e \x01(\bR\x11acceptsNewSources\x128\n" + + "\x18live_delivery_configured\x18\x0f \x01(\bR\x16liveDeliveryConfigured\"\x1d\n" + "\x1bGetDatasourceCatalogRequest\"l\n" + "\x1cGetDatasourceCatalogResponse\x12L\n" + "\tproviders\x18\x01 \x03(\v2..saas.accounts.v1.DatasourceProviderDescriptorR\tproviders\"5\n" + @@ -5335,11 +5465,12 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\x11GetSourceResponse\x12<\n" + "\n" + "datasource\x18\x01 \x01(\v2\x1c.saas.accounts.v1.DatasourceR\n" + - "datasource\"{\n" + + "datasource\"\x99\x01\n" + "\x11SyncSourceRequest\x12\x1f\n" + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12\x18\n" + "\x02id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12+\n" + - "\faccess_token\x18\x03 \x01(\tB\b\xbaH\x05r\x03\x18\x80 R\vaccessToken\"+\n" + + "\faccess_token\x18\x03 \x01(\tB\b\xbaH\x05r\x03\x18\x80 R\vaccessToken\x12\x1c\n" + + "\treconnect\x18\x04 \x01(\bR\treconnect\"+\n" + "\x12SyncSourceResponse\x12\x15\n" + "\x06job_id\x18\x01 \x01(\tR\x05jobId\"\x82\x01\n" + "\x14GetSourceSyncRequest\x12\x1f\n" + @@ -5553,7 +5684,12 @@ const file_saas_accounts_v1_datasource_proto_rawDesc = "" + "\x1dDATASOURCE_STATUS_UNSPECIFIED\x10\x00\x12\x1c\n" + "\x18DATASOURCE_STATUS_ACTIVE\x10\x01\x12\x1c\n" + "\x18DATASOURCE_STATUS_PAUSED\x10\x02\x12\x1e\n" + - "\x1aDATASOURCE_STATUS_DEGRADED\x10\x03*\xd6\x01\n" + + "\x1aDATASOURCE_STATUS_DEGRADED\x10\x03*\xbc\x01\n" + + "\x16DatasourceLiveDelivery\x12(\n" + + "$DATASOURCE_LIVE_DELIVERY_UNSPECIFIED\x10\x00\x12!\n" + + "\x1dDATASOURCE_LIVE_DELIVERY_NONE\x10\x01\x12+\n" + + "'DATASOURCE_LIVE_DELIVERY_SOURCE_WEBHOOK\x10\x02\x12(\n" + + "$DATASOURCE_LIVE_DELIVERY_APP_WEBHOOK\x10\x03*\xd6\x01\n" + "\x11ApiCredentialKind\x12#\n" + "\x1fAPI_CREDENTIAL_KIND_UNSPECIFIED\x10\x00\x12\x1e\n" + "\x1aAPI_CREDENTIAL_KIND_BEARER\x10\x01\x12\x1d\n" + @@ -5691,209 +5827,213 @@ func file_saas_accounts_v1_datasource_proto_rawDescGZIP() []byte { return file_saas_accounts_v1_datasource_proto_rawDescData } -var file_saas_accounts_v1_datasource_proto_enumTypes = make([]protoimpl.EnumInfo, 11) +var file_saas_accounts_v1_datasource_proto_enumTypes = make([]protoimpl.EnumInfo, 12) var file_saas_accounts_v1_datasource_proto_msgTypes = make([]protoimpl.MessageInfo, 65) var file_saas_accounts_v1_datasource_proto_goTypes = []any{ (DatasourceProvider)(0), // 0: saas.accounts.v1.DatasourceProvider (DatasourceStatus)(0), // 1: saas.accounts.v1.DatasourceStatus - (ApiCredentialKind)(0), // 2: saas.accounts.v1.ApiCredentialKind - (DatasourceConnectorInterface)(0), // 3: saas.accounts.v1.DatasourceConnectorInterface - (DatasourceCredentialMode)(0), // 4: saas.accounts.v1.DatasourceCredentialMode - (DatasourceReadersModel)(0), // 5: saas.accounts.v1.DatasourceReadersModel - (SourceSyncPhase)(0), // 6: saas.accounts.v1.SourceSyncPhase - (SourceSyncFailureReason)(0), // 7: saas.accounts.v1.SourceSyncFailureReason - (SourceSyncTrigger)(0), // 8: saas.accounts.v1.SourceSyncTrigger - (DatasourceDomainStatus)(0), // 9: saas.accounts.v1.DatasourceDomainStatus - (SourceDelegationRevocation)(0), // 10: saas.accounts.v1.SourceDelegationRevocation - (*GitHubDatasourceConfig)(nil), // 11: saas.accounts.v1.GitHubDatasourceConfig - (*ApiOAuth2Config)(nil), // 12: saas.accounts.v1.ApiOAuth2Config - (*ApiDatasourceConfig)(nil), // 13: saas.accounts.v1.ApiDatasourceConfig - (*CrawlerDatasourceConfig)(nil), // 14: saas.accounts.v1.CrawlerDatasourceConfig - (*UploadDatasourceConfig)(nil), // 15: saas.accounts.v1.UploadDatasourceConfig - (*Datasource)(nil), // 16: saas.accounts.v1.Datasource - (*AddGitHubSourceRequest)(nil), // 17: saas.accounts.v1.AddGitHubSourceRequest - (*AddGitHubSourceResponse)(nil), // 18: saas.accounts.v1.AddGitHubSourceResponse - (*AddSourceRequest)(nil), // 19: saas.accounts.v1.AddSourceRequest - (*AddSourceResponse)(nil), // 20: saas.accounts.v1.AddSourceResponse - (*DatasourceConfigField)(nil), // 21: saas.accounts.v1.DatasourceConfigField - (*DatasourceConnectorBudget)(nil), // 22: saas.accounts.v1.DatasourceConnectorBudget - (*DatasourceProviderDescriptor)(nil), // 23: saas.accounts.v1.DatasourceProviderDescriptor - (*GetDatasourceCatalogRequest)(nil), // 24: saas.accounts.v1.GetDatasourceCatalogRequest - (*GetDatasourceCatalogResponse)(nil), // 25: saas.accounts.v1.GetDatasourceCatalogResponse - (*ListSourcesRequest)(nil), // 26: saas.accounts.v1.ListSourcesRequest - (*ListSourcesResponse)(nil), // 27: saas.accounts.v1.ListSourcesResponse - (*GetSourceRequest)(nil), // 28: saas.accounts.v1.GetSourceRequest - (*GetSourceResponse)(nil), // 29: saas.accounts.v1.GetSourceResponse - (*SyncSourceRequest)(nil), // 30: saas.accounts.v1.SyncSourceRequest - (*SyncSourceResponse)(nil), // 31: saas.accounts.v1.SyncSourceResponse - (*GetSourceSyncRequest)(nil), // 32: saas.accounts.v1.GetSourceSyncRequest - (*SourceSyncDelivery)(nil), // 33: saas.accounts.v1.SourceSyncDelivery - (*SourceSyncChanges)(nil), // 34: saas.accounts.v1.SourceSyncChanges - (*SourceSyncFailure)(nil), // 35: saas.accounts.v1.SourceSyncFailure - (*SourceSyncProgress)(nil), // 36: saas.accounts.v1.SourceSyncProgress - (*GetSourceSyncResponse)(nil), // 37: saas.accounts.v1.GetSourceSyncResponse - (*DeleteSourceRequest)(nil), // 38: saas.accounts.v1.DeleteSourceRequest - (*DeleteSourceResponse)(nil), // 39: saas.accounts.v1.DeleteSourceResponse - (*GitHubAppRepository)(nil), // 40: saas.accounts.v1.GitHubAppRepository - (*BeginGitHubAppSetupRequest)(nil), // 41: saas.accounts.v1.BeginGitHubAppSetupRequest - (*BeginGitHubAppSetupResponse)(nil), // 42: saas.accounts.v1.BeginGitHubAppSetupResponse - (*CompleteGitHubAppSetupRequest)(nil), // 43: saas.accounts.v1.CompleteGitHubAppSetupRequest - (*CompleteGitHubAppSetupResponse)(nil), // 44: saas.accounts.v1.CompleteGitHubAppSetupResponse - (*MigrateGitHubSourceToAppRequest)(nil), // 45: saas.accounts.v1.MigrateGitHubSourceToAppRequest - (*MigrateGitHubSourceToAppResponse)(nil), // 46: saas.accounts.v1.MigrateGitHubSourceToAppResponse - (*DatasourceAccountLink)(nil), // 47: saas.accounts.v1.DatasourceAccountLink - (*DatasourceGroupBinding)(nil), // 48: saas.accounts.v1.DatasourceGroupBinding - (*DatasourceVerifiedDomain)(nil), // 49: saas.accounts.v1.DatasourceVerifiedDomain - (*DatasourceDirectoryTeam)(nil), // 50: saas.accounts.v1.DatasourceDirectoryTeam - (*BeginDatasourceAccountLinkRequest)(nil), // 51: saas.accounts.v1.BeginDatasourceAccountLinkRequest - (*BeginDatasourceAccountLinkResponse)(nil), // 52: saas.accounts.v1.BeginDatasourceAccountLinkResponse - (*CompleteDatasourceAccountLinkRequest)(nil), // 53: saas.accounts.v1.CompleteDatasourceAccountLinkRequest - (*CompleteDatasourceAccountLinkResponse)(nil), // 54: saas.accounts.v1.CompleteDatasourceAccountLinkResponse - (*ListMyDatasourceAccountLinksRequest)(nil), // 55: saas.accounts.v1.ListMyDatasourceAccountLinksRequest - (*ListMyDatasourceAccountLinksResponse)(nil), // 56: saas.accounts.v1.ListMyDatasourceAccountLinksResponse - (*DeleteDatasourceAccountLinkRequest)(nil), // 57: saas.accounts.v1.DeleteDatasourceAccountLinkRequest - (*DeleteDatasourceAccountLinkResponse)(nil), // 58: saas.accounts.v1.DeleteDatasourceAccountLinkResponse - (*GetDatasourceDirectoryRequest)(nil), // 59: saas.accounts.v1.GetDatasourceDirectoryRequest - (*GetDatasourceDirectoryResponse)(nil), // 60: saas.accounts.v1.GetDatasourceDirectoryResponse - (*BindDatasourceGroupRequest)(nil), // 61: saas.accounts.v1.BindDatasourceGroupRequest - (*BindDatasourceGroupResponse)(nil), // 62: saas.accounts.v1.BindDatasourceGroupResponse - (*UnbindDatasourceGroupRequest)(nil), // 63: saas.accounts.v1.UnbindDatasourceGroupRequest - (*UnbindDatasourceGroupResponse)(nil), // 64: saas.accounts.v1.UnbindDatasourceGroupResponse - (*ClaimDatasourceDomainRequest)(nil), // 65: saas.accounts.v1.ClaimDatasourceDomainRequest - (*ClaimDatasourceDomainResponse)(nil), // 66: saas.accounts.v1.ClaimDatasourceDomainResponse - (*VerifyDatasourceDomainRequest)(nil), // 67: saas.accounts.v1.VerifyDatasourceDomainRequest - (*VerifyDatasourceDomainResponse)(nil), // 68: saas.accounts.v1.VerifyDatasourceDomainResponse - (*DeleteDatasourceDomainRequest)(nil), // 69: saas.accounts.v1.DeleteDatasourceDomainRequest - (*DeleteDatasourceDomainResponse)(nil), // 70: saas.accounts.v1.DeleteDatasourceDomainResponse - (*SourceDelegation)(nil), // 71: saas.accounts.v1.SourceDelegation - (*ListSourceDelegationsRequest)(nil), // 72: saas.accounts.v1.ListSourceDelegationsRequest - (*ListSourceDelegationsResponse)(nil), // 73: saas.accounts.v1.ListSourceDelegationsResponse - (*RevokeSourceDelegationRequest)(nil), // 74: saas.accounts.v1.RevokeSourceDelegationRequest - (*RevokeSourceDelegationResponse)(nil), // 75: saas.accounts.v1.RevokeSourceDelegationResponse - (*timestamppb.Timestamp)(nil), // 76: google.protobuf.Timestamp - (v1.JobState)(0), // 77: saas.jobs.v1.JobState - (*v1.JobExecutionReference)(nil), // 78: saas.jobs.v1.JobExecutionReference + (DatasourceLiveDelivery)(0), // 2: saas.accounts.v1.DatasourceLiveDelivery + (ApiCredentialKind)(0), // 3: saas.accounts.v1.ApiCredentialKind + (DatasourceConnectorInterface)(0), // 4: saas.accounts.v1.DatasourceConnectorInterface + (DatasourceCredentialMode)(0), // 5: saas.accounts.v1.DatasourceCredentialMode + (DatasourceReadersModel)(0), // 6: saas.accounts.v1.DatasourceReadersModel + (SourceSyncPhase)(0), // 7: saas.accounts.v1.SourceSyncPhase + (SourceSyncFailureReason)(0), // 8: saas.accounts.v1.SourceSyncFailureReason + (SourceSyncTrigger)(0), // 9: saas.accounts.v1.SourceSyncTrigger + (DatasourceDomainStatus)(0), // 10: saas.accounts.v1.DatasourceDomainStatus + (SourceDelegationRevocation)(0), // 11: saas.accounts.v1.SourceDelegationRevocation + (*GitHubDatasourceConfig)(nil), // 12: saas.accounts.v1.GitHubDatasourceConfig + (*ApiOAuth2Config)(nil), // 13: saas.accounts.v1.ApiOAuth2Config + (*ApiDatasourceConfig)(nil), // 14: saas.accounts.v1.ApiDatasourceConfig + (*CrawlerDatasourceConfig)(nil), // 15: saas.accounts.v1.CrawlerDatasourceConfig + (*UploadDatasourceConfig)(nil), // 16: saas.accounts.v1.UploadDatasourceConfig + (*Datasource)(nil), // 17: saas.accounts.v1.Datasource + (*AddGitHubSourceRequest)(nil), // 18: saas.accounts.v1.AddGitHubSourceRequest + (*AddGitHubSourceResponse)(nil), // 19: saas.accounts.v1.AddGitHubSourceResponse + (*AddSourceRequest)(nil), // 20: saas.accounts.v1.AddSourceRequest + (*AddSourceResponse)(nil), // 21: saas.accounts.v1.AddSourceResponse + (*DatasourceConfigField)(nil), // 22: saas.accounts.v1.DatasourceConfigField + (*DatasourceConnectorBudget)(nil), // 23: saas.accounts.v1.DatasourceConnectorBudget + (*DatasourceProviderDescriptor)(nil), // 24: saas.accounts.v1.DatasourceProviderDescriptor + (*GetDatasourceCatalogRequest)(nil), // 25: saas.accounts.v1.GetDatasourceCatalogRequest + (*GetDatasourceCatalogResponse)(nil), // 26: saas.accounts.v1.GetDatasourceCatalogResponse + (*ListSourcesRequest)(nil), // 27: saas.accounts.v1.ListSourcesRequest + (*ListSourcesResponse)(nil), // 28: saas.accounts.v1.ListSourcesResponse + (*GetSourceRequest)(nil), // 29: saas.accounts.v1.GetSourceRequest + (*GetSourceResponse)(nil), // 30: saas.accounts.v1.GetSourceResponse + (*SyncSourceRequest)(nil), // 31: saas.accounts.v1.SyncSourceRequest + (*SyncSourceResponse)(nil), // 32: saas.accounts.v1.SyncSourceResponse + (*GetSourceSyncRequest)(nil), // 33: saas.accounts.v1.GetSourceSyncRequest + (*SourceSyncDelivery)(nil), // 34: saas.accounts.v1.SourceSyncDelivery + (*SourceSyncChanges)(nil), // 35: saas.accounts.v1.SourceSyncChanges + (*SourceSyncFailure)(nil), // 36: saas.accounts.v1.SourceSyncFailure + (*SourceSyncProgress)(nil), // 37: saas.accounts.v1.SourceSyncProgress + (*GetSourceSyncResponse)(nil), // 38: saas.accounts.v1.GetSourceSyncResponse + (*DeleteSourceRequest)(nil), // 39: saas.accounts.v1.DeleteSourceRequest + (*DeleteSourceResponse)(nil), // 40: saas.accounts.v1.DeleteSourceResponse + (*GitHubAppRepository)(nil), // 41: saas.accounts.v1.GitHubAppRepository + (*BeginGitHubAppSetupRequest)(nil), // 42: saas.accounts.v1.BeginGitHubAppSetupRequest + (*BeginGitHubAppSetupResponse)(nil), // 43: saas.accounts.v1.BeginGitHubAppSetupResponse + (*CompleteGitHubAppSetupRequest)(nil), // 44: saas.accounts.v1.CompleteGitHubAppSetupRequest + (*CompleteGitHubAppSetupResponse)(nil), // 45: saas.accounts.v1.CompleteGitHubAppSetupResponse + (*MigrateGitHubSourceToAppRequest)(nil), // 46: saas.accounts.v1.MigrateGitHubSourceToAppRequest + (*MigrateGitHubSourceToAppResponse)(nil), // 47: saas.accounts.v1.MigrateGitHubSourceToAppResponse + (*DatasourceAccountLink)(nil), // 48: saas.accounts.v1.DatasourceAccountLink + (*DatasourceGroupBinding)(nil), // 49: saas.accounts.v1.DatasourceGroupBinding + (*DatasourceVerifiedDomain)(nil), // 50: saas.accounts.v1.DatasourceVerifiedDomain + (*DatasourceDirectoryTeam)(nil), // 51: saas.accounts.v1.DatasourceDirectoryTeam + (*BeginDatasourceAccountLinkRequest)(nil), // 52: saas.accounts.v1.BeginDatasourceAccountLinkRequest + (*BeginDatasourceAccountLinkResponse)(nil), // 53: saas.accounts.v1.BeginDatasourceAccountLinkResponse + (*CompleteDatasourceAccountLinkRequest)(nil), // 54: saas.accounts.v1.CompleteDatasourceAccountLinkRequest + (*CompleteDatasourceAccountLinkResponse)(nil), // 55: saas.accounts.v1.CompleteDatasourceAccountLinkResponse + (*ListMyDatasourceAccountLinksRequest)(nil), // 56: saas.accounts.v1.ListMyDatasourceAccountLinksRequest + (*ListMyDatasourceAccountLinksResponse)(nil), // 57: saas.accounts.v1.ListMyDatasourceAccountLinksResponse + (*DeleteDatasourceAccountLinkRequest)(nil), // 58: saas.accounts.v1.DeleteDatasourceAccountLinkRequest + (*DeleteDatasourceAccountLinkResponse)(nil), // 59: saas.accounts.v1.DeleteDatasourceAccountLinkResponse + (*GetDatasourceDirectoryRequest)(nil), // 60: saas.accounts.v1.GetDatasourceDirectoryRequest + (*GetDatasourceDirectoryResponse)(nil), // 61: saas.accounts.v1.GetDatasourceDirectoryResponse + (*BindDatasourceGroupRequest)(nil), // 62: saas.accounts.v1.BindDatasourceGroupRequest + (*BindDatasourceGroupResponse)(nil), // 63: saas.accounts.v1.BindDatasourceGroupResponse + (*UnbindDatasourceGroupRequest)(nil), // 64: saas.accounts.v1.UnbindDatasourceGroupRequest + (*UnbindDatasourceGroupResponse)(nil), // 65: saas.accounts.v1.UnbindDatasourceGroupResponse + (*ClaimDatasourceDomainRequest)(nil), // 66: saas.accounts.v1.ClaimDatasourceDomainRequest + (*ClaimDatasourceDomainResponse)(nil), // 67: saas.accounts.v1.ClaimDatasourceDomainResponse + (*VerifyDatasourceDomainRequest)(nil), // 68: saas.accounts.v1.VerifyDatasourceDomainRequest + (*VerifyDatasourceDomainResponse)(nil), // 69: saas.accounts.v1.VerifyDatasourceDomainResponse + (*DeleteDatasourceDomainRequest)(nil), // 70: saas.accounts.v1.DeleteDatasourceDomainRequest + (*DeleteDatasourceDomainResponse)(nil), // 71: saas.accounts.v1.DeleteDatasourceDomainResponse + (*SourceDelegation)(nil), // 72: saas.accounts.v1.SourceDelegation + (*ListSourceDelegationsRequest)(nil), // 73: saas.accounts.v1.ListSourceDelegationsRequest + (*ListSourceDelegationsResponse)(nil), // 74: saas.accounts.v1.ListSourceDelegationsResponse + (*RevokeSourceDelegationRequest)(nil), // 75: saas.accounts.v1.RevokeSourceDelegationRequest + (*RevokeSourceDelegationResponse)(nil), // 76: saas.accounts.v1.RevokeSourceDelegationResponse + (*timestamppb.Timestamp)(nil), // 77: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 78: google.protobuf.Duration + (v1.JobState)(0), // 79: saas.jobs.v1.JobState + (*v1.JobExecutionReference)(nil), // 80: saas.jobs.v1.JobExecutionReference } var file_saas_accounts_v1_datasource_proto_depIdxs = []int32{ - 2, // 0: saas.accounts.v1.ApiDatasourceConfig.credential_kind:type_name -> saas.accounts.v1.ApiCredentialKind - 12, // 1: saas.accounts.v1.ApiDatasourceConfig.oauth2:type_name -> saas.accounts.v1.ApiOAuth2Config + 3, // 0: saas.accounts.v1.ApiDatasourceConfig.credential_kind:type_name -> saas.accounts.v1.ApiCredentialKind + 13, // 1: saas.accounts.v1.ApiDatasourceConfig.oauth2:type_name -> saas.accounts.v1.ApiOAuth2Config 0, // 2: saas.accounts.v1.Datasource.provider:type_name -> saas.accounts.v1.DatasourceProvider - 11, // 3: saas.accounts.v1.Datasource.github:type_name -> saas.accounts.v1.GitHubDatasourceConfig + 12, // 3: saas.accounts.v1.Datasource.github:type_name -> saas.accounts.v1.GitHubDatasourceConfig 1, // 4: saas.accounts.v1.Datasource.status:type_name -> saas.accounts.v1.DatasourceStatus - 76, // 5: saas.accounts.v1.Datasource.created_at:type_name -> google.protobuf.Timestamp - 76, // 6: saas.accounts.v1.Datasource.updated_at:type_name -> google.protobuf.Timestamp - 76, // 7: saas.accounts.v1.Datasource.last_synced_at:type_name -> google.protobuf.Timestamp - 13, // 8: saas.accounts.v1.Datasource.api:type_name -> saas.accounts.v1.ApiDatasourceConfig - 14, // 9: saas.accounts.v1.Datasource.crawler:type_name -> saas.accounts.v1.CrawlerDatasourceConfig - 15, // 10: saas.accounts.v1.Datasource.upload:type_name -> saas.accounts.v1.UploadDatasourceConfig - 76, // 11: saas.accounts.v1.Datasource.last_ingested_at:type_name -> google.protobuf.Timestamp - 16, // 12: saas.accounts.v1.AddGitHubSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource - 0, // 13: saas.accounts.v1.AddSourceRequest.provider:type_name -> saas.accounts.v1.DatasourceProvider - 11, // 14: saas.accounts.v1.AddSourceRequest.github:type_name -> saas.accounts.v1.GitHubDatasourceConfig - 13, // 15: saas.accounts.v1.AddSourceRequest.api:type_name -> saas.accounts.v1.ApiDatasourceConfig - 14, // 16: saas.accounts.v1.AddSourceRequest.crawler:type_name -> saas.accounts.v1.CrawlerDatasourceConfig - 15, // 17: saas.accounts.v1.AddSourceRequest.upload:type_name -> saas.accounts.v1.UploadDatasourceConfig - 16, // 18: saas.accounts.v1.AddSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource - 0, // 19: saas.accounts.v1.DatasourceProviderDescriptor.provider:type_name -> saas.accounts.v1.DatasourceProvider - 21, // 20: saas.accounts.v1.DatasourceProviderDescriptor.config_fields:type_name -> saas.accounts.v1.DatasourceConfigField - 2, // 21: saas.accounts.v1.DatasourceProviderDescriptor.supported_credential_kinds:type_name -> saas.accounts.v1.ApiCredentialKind - 3, // 22: saas.accounts.v1.DatasourceProviderDescriptor.interface:type_name -> saas.accounts.v1.DatasourceConnectorInterface - 4, // 23: saas.accounts.v1.DatasourceProviderDescriptor.credential_modes:type_name -> saas.accounts.v1.DatasourceCredentialMode - 5, // 24: saas.accounts.v1.DatasourceProviderDescriptor.readers_model:type_name -> saas.accounts.v1.DatasourceReadersModel - 22, // 25: saas.accounts.v1.DatasourceProviderDescriptor.budget:type_name -> saas.accounts.v1.DatasourceConnectorBudget - 23, // 26: saas.accounts.v1.GetDatasourceCatalogResponse.providers:type_name -> saas.accounts.v1.DatasourceProviderDescriptor - 16, // 27: saas.accounts.v1.ListSourcesResponse.datasources:type_name -> saas.accounts.v1.Datasource - 16, // 28: saas.accounts.v1.GetSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource - 77, // 29: saas.accounts.v1.SourceSyncDelivery.state:type_name -> saas.jobs.v1.JobState - 78, // 30: saas.accounts.v1.SourceSyncDelivery.execution:type_name -> saas.jobs.v1.JobExecutionReference - 7, // 31: saas.accounts.v1.SourceSyncFailure.reason:type_name -> saas.accounts.v1.SourceSyncFailureReason - 76, // 32: saas.accounts.v1.SourceSyncFailure.retry_at:type_name -> google.protobuf.Timestamp - 6, // 33: saas.accounts.v1.SourceSyncProgress.phase:type_name -> saas.accounts.v1.SourceSyncPhase - 8, // 34: saas.accounts.v1.SourceSyncProgress.trigger:type_name -> saas.accounts.v1.SourceSyncTrigger - 76, // 35: saas.accounts.v1.SourceSyncProgress.queued_at:type_name -> google.protobuf.Timestamp - 76, // 36: saas.accounts.v1.SourceSyncProgress.fetching_at:type_name -> google.protobuf.Timestamp - 76, // 37: saas.accounts.v1.SourceSyncProgress.compiled_at:type_name -> google.protobuf.Timestamp - 76, // 38: saas.accounts.v1.SourceSyncProgress.handed_off_at:type_name -> google.protobuf.Timestamp - 76, // 39: saas.accounts.v1.SourceSyncProgress.finished_at:type_name -> google.protobuf.Timestamp - 34, // 40: saas.accounts.v1.SourceSyncProgress.changes:type_name -> saas.accounts.v1.SourceSyncChanges - 35, // 41: saas.accounts.v1.SourceSyncProgress.failure:type_name -> saas.accounts.v1.SourceSyncFailure - 77, // 42: saas.accounts.v1.GetSourceSyncResponse.state:type_name -> saas.jobs.v1.JobState - 33, // 43: saas.accounts.v1.GetSourceSyncResponse.deliveries:type_name -> saas.accounts.v1.SourceSyncDelivery - 36, // 44: saas.accounts.v1.GetSourceSyncResponse.progress:type_name -> saas.accounts.v1.SourceSyncProgress - 76, // 45: saas.accounts.v1.BeginGitHubAppSetupResponse.expires_at:type_name -> google.protobuf.Timestamp - 40, // 46: saas.accounts.v1.CompleteGitHubAppSetupResponse.repositories:type_name -> saas.accounts.v1.GitHubAppRepository - 16, // 47: saas.accounts.v1.MigrateGitHubSourceToAppResponse.datasource:type_name -> saas.accounts.v1.Datasource - 76, // 48: saas.accounts.v1.DatasourceAccountLink.created_at:type_name -> google.protobuf.Timestamp - 76, // 49: saas.accounts.v1.DatasourceGroupBinding.created_at:type_name -> google.protobuf.Timestamp - 9, // 50: saas.accounts.v1.DatasourceVerifiedDomain.status:type_name -> saas.accounts.v1.DatasourceDomainStatus - 76, // 51: saas.accounts.v1.DatasourceVerifiedDomain.verified_at:type_name -> google.protobuf.Timestamp - 76, // 52: saas.accounts.v1.DatasourceVerifiedDomain.created_at:type_name -> google.protobuf.Timestamp - 76, // 53: saas.accounts.v1.BeginDatasourceAccountLinkResponse.expires_at:type_name -> google.protobuf.Timestamp - 47, // 54: saas.accounts.v1.CompleteDatasourceAccountLinkResponse.link:type_name -> saas.accounts.v1.DatasourceAccountLink - 47, // 55: saas.accounts.v1.ListMyDatasourceAccountLinksResponse.links:type_name -> saas.accounts.v1.DatasourceAccountLink - 47, // 56: saas.accounts.v1.GetDatasourceDirectoryResponse.links:type_name -> saas.accounts.v1.DatasourceAccountLink - 48, // 57: saas.accounts.v1.GetDatasourceDirectoryResponse.bindings:type_name -> saas.accounts.v1.DatasourceGroupBinding - 49, // 58: saas.accounts.v1.GetDatasourceDirectoryResponse.domains:type_name -> saas.accounts.v1.DatasourceVerifiedDomain - 50, // 59: saas.accounts.v1.GetDatasourceDirectoryResponse.teams:type_name -> saas.accounts.v1.DatasourceDirectoryTeam - 48, // 60: saas.accounts.v1.BindDatasourceGroupResponse.binding:type_name -> saas.accounts.v1.DatasourceGroupBinding - 49, // 61: saas.accounts.v1.ClaimDatasourceDomainResponse.domain:type_name -> saas.accounts.v1.DatasourceVerifiedDomain - 49, // 62: saas.accounts.v1.VerifyDatasourceDomainResponse.domain:type_name -> saas.accounts.v1.DatasourceVerifiedDomain - 76, // 63: saas.accounts.v1.SourceDelegation.created_at:type_name -> google.protobuf.Timestamp - 76, // 64: saas.accounts.v1.SourceDelegation.revoked_at:type_name -> google.protobuf.Timestamp - 10, // 65: saas.accounts.v1.SourceDelegation.revocation:type_name -> saas.accounts.v1.SourceDelegationRevocation - 71, // 66: saas.accounts.v1.ListSourceDelegationsResponse.delegations:type_name -> saas.accounts.v1.SourceDelegation - 71, // 67: saas.accounts.v1.RevokeSourceDelegationResponse.delegation:type_name -> saas.accounts.v1.SourceDelegation - 17, // 68: saas.accounts.v1.DatasourceService.AddGitHubSource:input_type -> saas.accounts.v1.AddGitHubSourceRequest - 19, // 69: saas.accounts.v1.DatasourceService.AddSource:input_type -> saas.accounts.v1.AddSourceRequest - 24, // 70: saas.accounts.v1.DatasourceService.GetDatasourceCatalog:input_type -> saas.accounts.v1.GetDatasourceCatalogRequest - 26, // 71: saas.accounts.v1.DatasourceService.ListSources:input_type -> saas.accounts.v1.ListSourcesRequest - 28, // 72: saas.accounts.v1.DatasourceService.GetSource:input_type -> saas.accounts.v1.GetSourceRequest - 30, // 73: saas.accounts.v1.DatasourceService.SyncSource:input_type -> saas.accounts.v1.SyncSourceRequest - 32, // 74: saas.accounts.v1.DatasourceService.GetSourceSync:input_type -> saas.accounts.v1.GetSourceSyncRequest - 38, // 75: saas.accounts.v1.DatasourceService.DeleteSource:input_type -> saas.accounts.v1.DeleteSourceRequest - 41, // 76: saas.accounts.v1.DatasourceService.BeginGitHubAppSetup:input_type -> saas.accounts.v1.BeginGitHubAppSetupRequest - 43, // 77: saas.accounts.v1.DatasourceService.CompleteGitHubAppSetup:input_type -> saas.accounts.v1.CompleteGitHubAppSetupRequest - 45, // 78: saas.accounts.v1.DatasourceService.MigrateGitHubSourceToApp:input_type -> saas.accounts.v1.MigrateGitHubSourceToAppRequest - 51, // 79: saas.accounts.v1.DatasourceService.BeginDatasourceAccountLink:input_type -> saas.accounts.v1.BeginDatasourceAccountLinkRequest - 53, // 80: saas.accounts.v1.DatasourceService.CompleteDatasourceAccountLink:input_type -> saas.accounts.v1.CompleteDatasourceAccountLinkRequest - 55, // 81: saas.accounts.v1.DatasourceService.ListMyDatasourceAccountLinks:input_type -> saas.accounts.v1.ListMyDatasourceAccountLinksRequest - 57, // 82: saas.accounts.v1.DatasourceService.DeleteDatasourceAccountLink:input_type -> saas.accounts.v1.DeleteDatasourceAccountLinkRequest - 59, // 83: saas.accounts.v1.DatasourceService.GetDatasourceDirectory:input_type -> saas.accounts.v1.GetDatasourceDirectoryRequest - 61, // 84: saas.accounts.v1.DatasourceService.BindDatasourceGroup:input_type -> saas.accounts.v1.BindDatasourceGroupRequest - 63, // 85: saas.accounts.v1.DatasourceService.UnbindDatasourceGroup:input_type -> saas.accounts.v1.UnbindDatasourceGroupRequest - 65, // 86: saas.accounts.v1.DatasourceService.ClaimDatasourceDomain:input_type -> saas.accounts.v1.ClaimDatasourceDomainRequest - 67, // 87: saas.accounts.v1.DatasourceService.VerifyDatasourceDomain:input_type -> saas.accounts.v1.VerifyDatasourceDomainRequest - 69, // 88: saas.accounts.v1.DatasourceService.DeleteDatasourceDomain:input_type -> saas.accounts.v1.DeleteDatasourceDomainRequest - 72, // 89: saas.accounts.v1.DatasourceService.ListSourceDelegations:input_type -> saas.accounts.v1.ListSourceDelegationsRequest - 74, // 90: saas.accounts.v1.DatasourceService.RevokeSourceDelegation:input_type -> saas.accounts.v1.RevokeSourceDelegationRequest - 18, // 91: saas.accounts.v1.DatasourceService.AddGitHubSource:output_type -> saas.accounts.v1.AddGitHubSourceResponse - 20, // 92: saas.accounts.v1.DatasourceService.AddSource:output_type -> saas.accounts.v1.AddSourceResponse - 25, // 93: saas.accounts.v1.DatasourceService.GetDatasourceCatalog:output_type -> saas.accounts.v1.GetDatasourceCatalogResponse - 27, // 94: saas.accounts.v1.DatasourceService.ListSources:output_type -> saas.accounts.v1.ListSourcesResponse - 29, // 95: saas.accounts.v1.DatasourceService.GetSource:output_type -> saas.accounts.v1.GetSourceResponse - 31, // 96: saas.accounts.v1.DatasourceService.SyncSource:output_type -> saas.accounts.v1.SyncSourceResponse - 37, // 97: saas.accounts.v1.DatasourceService.GetSourceSync:output_type -> saas.accounts.v1.GetSourceSyncResponse - 39, // 98: saas.accounts.v1.DatasourceService.DeleteSource:output_type -> saas.accounts.v1.DeleteSourceResponse - 42, // 99: saas.accounts.v1.DatasourceService.BeginGitHubAppSetup:output_type -> saas.accounts.v1.BeginGitHubAppSetupResponse - 44, // 100: saas.accounts.v1.DatasourceService.CompleteGitHubAppSetup:output_type -> saas.accounts.v1.CompleteGitHubAppSetupResponse - 46, // 101: saas.accounts.v1.DatasourceService.MigrateGitHubSourceToApp:output_type -> saas.accounts.v1.MigrateGitHubSourceToAppResponse - 52, // 102: saas.accounts.v1.DatasourceService.BeginDatasourceAccountLink:output_type -> saas.accounts.v1.BeginDatasourceAccountLinkResponse - 54, // 103: saas.accounts.v1.DatasourceService.CompleteDatasourceAccountLink:output_type -> saas.accounts.v1.CompleteDatasourceAccountLinkResponse - 56, // 104: saas.accounts.v1.DatasourceService.ListMyDatasourceAccountLinks:output_type -> saas.accounts.v1.ListMyDatasourceAccountLinksResponse - 58, // 105: saas.accounts.v1.DatasourceService.DeleteDatasourceAccountLink:output_type -> saas.accounts.v1.DeleteDatasourceAccountLinkResponse - 60, // 106: saas.accounts.v1.DatasourceService.GetDatasourceDirectory:output_type -> saas.accounts.v1.GetDatasourceDirectoryResponse - 62, // 107: saas.accounts.v1.DatasourceService.BindDatasourceGroup:output_type -> saas.accounts.v1.BindDatasourceGroupResponse - 64, // 108: saas.accounts.v1.DatasourceService.UnbindDatasourceGroup:output_type -> saas.accounts.v1.UnbindDatasourceGroupResponse - 66, // 109: saas.accounts.v1.DatasourceService.ClaimDatasourceDomain:output_type -> saas.accounts.v1.ClaimDatasourceDomainResponse - 68, // 110: saas.accounts.v1.DatasourceService.VerifyDatasourceDomain:output_type -> saas.accounts.v1.VerifyDatasourceDomainResponse - 70, // 111: saas.accounts.v1.DatasourceService.DeleteDatasourceDomain:output_type -> saas.accounts.v1.DeleteDatasourceDomainResponse - 73, // 112: saas.accounts.v1.DatasourceService.ListSourceDelegations:output_type -> saas.accounts.v1.ListSourceDelegationsResponse - 75, // 113: saas.accounts.v1.DatasourceService.RevokeSourceDelegation:output_type -> saas.accounts.v1.RevokeSourceDelegationResponse - 91, // [91:114] is the sub-list for method output_type - 68, // [68:91] is the sub-list for method input_type - 68, // [68:68] is the sub-list for extension type_name - 68, // [68:68] is the sub-list for extension extendee - 0, // [0:68] is the sub-list for field type_name + 77, // 5: saas.accounts.v1.Datasource.created_at:type_name -> google.protobuf.Timestamp + 77, // 6: saas.accounts.v1.Datasource.updated_at:type_name -> google.protobuf.Timestamp + 77, // 7: saas.accounts.v1.Datasource.last_synced_at:type_name -> google.protobuf.Timestamp + 14, // 8: saas.accounts.v1.Datasource.api:type_name -> saas.accounts.v1.ApiDatasourceConfig + 15, // 9: saas.accounts.v1.Datasource.crawler:type_name -> saas.accounts.v1.CrawlerDatasourceConfig + 16, // 10: saas.accounts.v1.Datasource.upload:type_name -> saas.accounts.v1.UploadDatasourceConfig + 77, // 11: saas.accounts.v1.Datasource.last_ingested_at:type_name -> google.protobuf.Timestamp + 2, // 12: saas.accounts.v1.Datasource.live_delivery:type_name -> saas.accounts.v1.DatasourceLiveDelivery + 78, // 13: saas.accounts.v1.Datasource.reconcile_interval:type_name -> google.protobuf.Duration + 17, // 14: saas.accounts.v1.AddGitHubSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource + 0, // 15: saas.accounts.v1.AddSourceRequest.provider:type_name -> saas.accounts.v1.DatasourceProvider + 12, // 16: saas.accounts.v1.AddSourceRequest.github:type_name -> saas.accounts.v1.GitHubDatasourceConfig + 14, // 17: saas.accounts.v1.AddSourceRequest.api:type_name -> saas.accounts.v1.ApiDatasourceConfig + 15, // 18: saas.accounts.v1.AddSourceRequest.crawler:type_name -> saas.accounts.v1.CrawlerDatasourceConfig + 16, // 19: saas.accounts.v1.AddSourceRequest.upload:type_name -> saas.accounts.v1.UploadDatasourceConfig + 17, // 20: saas.accounts.v1.AddSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource + 0, // 21: saas.accounts.v1.DatasourceProviderDescriptor.provider:type_name -> saas.accounts.v1.DatasourceProvider + 22, // 22: saas.accounts.v1.DatasourceProviderDescriptor.config_fields:type_name -> saas.accounts.v1.DatasourceConfigField + 3, // 23: saas.accounts.v1.DatasourceProviderDescriptor.supported_credential_kinds:type_name -> saas.accounts.v1.ApiCredentialKind + 4, // 24: saas.accounts.v1.DatasourceProviderDescriptor.interface:type_name -> saas.accounts.v1.DatasourceConnectorInterface + 5, // 25: saas.accounts.v1.DatasourceProviderDescriptor.credential_modes:type_name -> saas.accounts.v1.DatasourceCredentialMode + 6, // 26: saas.accounts.v1.DatasourceProviderDescriptor.readers_model:type_name -> saas.accounts.v1.DatasourceReadersModel + 23, // 27: saas.accounts.v1.DatasourceProviderDescriptor.budget:type_name -> saas.accounts.v1.DatasourceConnectorBudget + 24, // 28: saas.accounts.v1.GetDatasourceCatalogResponse.providers:type_name -> saas.accounts.v1.DatasourceProviderDescriptor + 17, // 29: saas.accounts.v1.ListSourcesResponse.datasources:type_name -> saas.accounts.v1.Datasource + 17, // 30: saas.accounts.v1.GetSourceResponse.datasource:type_name -> saas.accounts.v1.Datasource + 79, // 31: saas.accounts.v1.SourceSyncDelivery.state:type_name -> saas.jobs.v1.JobState + 80, // 32: saas.accounts.v1.SourceSyncDelivery.execution:type_name -> saas.jobs.v1.JobExecutionReference + 8, // 33: saas.accounts.v1.SourceSyncFailure.reason:type_name -> saas.accounts.v1.SourceSyncFailureReason + 77, // 34: saas.accounts.v1.SourceSyncFailure.retry_at:type_name -> google.protobuf.Timestamp + 7, // 35: saas.accounts.v1.SourceSyncProgress.phase:type_name -> saas.accounts.v1.SourceSyncPhase + 9, // 36: saas.accounts.v1.SourceSyncProgress.trigger:type_name -> saas.accounts.v1.SourceSyncTrigger + 77, // 37: saas.accounts.v1.SourceSyncProgress.queued_at:type_name -> google.protobuf.Timestamp + 77, // 38: saas.accounts.v1.SourceSyncProgress.fetching_at:type_name -> google.protobuf.Timestamp + 77, // 39: saas.accounts.v1.SourceSyncProgress.compiled_at:type_name -> google.protobuf.Timestamp + 77, // 40: saas.accounts.v1.SourceSyncProgress.handed_off_at:type_name -> google.protobuf.Timestamp + 77, // 41: saas.accounts.v1.SourceSyncProgress.finished_at:type_name -> google.protobuf.Timestamp + 35, // 42: saas.accounts.v1.SourceSyncProgress.changes:type_name -> saas.accounts.v1.SourceSyncChanges + 36, // 43: saas.accounts.v1.SourceSyncProgress.failure:type_name -> saas.accounts.v1.SourceSyncFailure + 79, // 44: saas.accounts.v1.GetSourceSyncResponse.state:type_name -> saas.jobs.v1.JobState + 34, // 45: saas.accounts.v1.GetSourceSyncResponse.deliveries:type_name -> saas.accounts.v1.SourceSyncDelivery + 37, // 46: saas.accounts.v1.GetSourceSyncResponse.progress:type_name -> saas.accounts.v1.SourceSyncProgress + 77, // 47: saas.accounts.v1.BeginGitHubAppSetupResponse.expires_at:type_name -> google.protobuf.Timestamp + 41, // 48: saas.accounts.v1.CompleteGitHubAppSetupResponse.repositories:type_name -> saas.accounts.v1.GitHubAppRepository + 17, // 49: saas.accounts.v1.MigrateGitHubSourceToAppResponse.datasource:type_name -> saas.accounts.v1.Datasource + 77, // 50: saas.accounts.v1.DatasourceAccountLink.created_at:type_name -> google.protobuf.Timestamp + 77, // 51: saas.accounts.v1.DatasourceGroupBinding.created_at:type_name -> google.protobuf.Timestamp + 10, // 52: saas.accounts.v1.DatasourceVerifiedDomain.status:type_name -> saas.accounts.v1.DatasourceDomainStatus + 77, // 53: saas.accounts.v1.DatasourceVerifiedDomain.verified_at:type_name -> google.protobuf.Timestamp + 77, // 54: saas.accounts.v1.DatasourceVerifiedDomain.created_at:type_name -> google.protobuf.Timestamp + 77, // 55: saas.accounts.v1.BeginDatasourceAccountLinkResponse.expires_at:type_name -> google.protobuf.Timestamp + 48, // 56: saas.accounts.v1.CompleteDatasourceAccountLinkResponse.link:type_name -> saas.accounts.v1.DatasourceAccountLink + 48, // 57: saas.accounts.v1.ListMyDatasourceAccountLinksResponse.links:type_name -> saas.accounts.v1.DatasourceAccountLink + 48, // 58: saas.accounts.v1.GetDatasourceDirectoryResponse.links:type_name -> saas.accounts.v1.DatasourceAccountLink + 49, // 59: saas.accounts.v1.GetDatasourceDirectoryResponse.bindings:type_name -> saas.accounts.v1.DatasourceGroupBinding + 50, // 60: saas.accounts.v1.GetDatasourceDirectoryResponse.domains:type_name -> saas.accounts.v1.DatasourceVerifiedDomain + 51, // 61: saas.accounts.v1.GetDatasourceDirectoryResponse.teams:type_name -> saas.accounts.v1.DatasourceDirectoryTeam + 49, // 62: saas.accounts.v1.BindDatasourceGroupResponse.binding:type_name -> saas.accounts.v1.DatasourceGroupBinding + 50, // 63: saas.accounts.v1.ClaimDatasourceDomainResponse.domain:type_name -> saas.accounts.v1.DatasourceVerifiedDomain + 50, // 64: saas.accounts.v1.VerifyDatasourceDomainResponse.domain:type_name -> saas.accounts.v1.DatasourceVerifiedDomain + 77, // 65: saas.accounts.v1.SourceDelegation.created_at:type_name -> google.protobuf.Timestamp + 77, // 66: saas.accounts.v1.SourceDelegation.revoked_at:type_name -> google.protobuf.Timestamp + 11, // 67: saas.accounts.v1.SourceDelegation.revocation:type_name -> saas.accounts.v1.SourceDelegationRevocation + 72, // 68: saas.accounts.v1.ListSourceDelegationsResponse.delegations:type_name -> saas.accounts.v1.SourceDelegation + 72, // 69: saas.accounts.v1.RevokeSourceDelegationResponse.delegation:type_name -> saas.accounts.v1.SourceDelegation + 18, // 70: saas.accounts.v1.DatasourceService.AddGitHubSource:input_type -> saas.accounts.v1.AddGitHubSourceRequest + 20, // 71: saas.accounts.v1.DatasourceService.AddSource:input_type -> saas.accounts.v1.AddSourceRequest + 25, // 72: saas.accounts.v1.DatasourceService.GetDatasourceCatalog:input_type -> saas.accounts.v1.GetDatasourceCatalogRequest + 27, // 73: saas.accounts.v1.DatasourceService.ListSources:input_type -> saas.accounts.v1.ListSourcesRequest + 29, // 74: saas.accounts.v1.DatasourceService.GetSource:input_type -> saas.accounts.v1.GetSourceRequest + 31, // 75: saas.accounts.v1.DatasourceService.SyncSource:input_type -> saas.accounts.v1.SyncSourceRequest + 33, // 76: saas.accounts.v1.DatasourceService.GetSourceSync:input_type -> saas.accounts.v1.GetSourceSyncRequest + 39, // 77: saas.accounts.v1.DatasourceService.DeleteSource:input_type -> saas.accounts.v1.DeleteSourceRequest + 42, // 78: saas.accounts.v1.DatasourceService.BeginGitHubAppSetup:input_type -> saas.accounts.v1.BeginGitHubAppSetupRequest + 44, // 79: saas.accounts.v1.DatasourceService.CompleteGitHubAppSetup:input_type -> saas.accounts.v1.CompleteGitHubAppSetupRequest + 46, // 80: saas.accounts.v1.DatasourceService.MigrateGitHubSourceToApp:input_type -> saas.accounts.v1.MigrateGitHubSourceToAppRequest + 52, // 81: saas.accounts.v1.DatasourceService.BeginDatasourceAccountLink:input_type -> saas.accounts.v1.BeginDatasourceAccountLinkRequest + 54, // 82: saas.accounts.v1.DatasourceService.CompleteDatasourceAccountLink:input_type -> saas.accounts.v1.CompleteDatasourceAccountLinkRequest + 56, // 83: saas.accounts.v1.DatasourceService.ListMyDatasourceAccountLinks:input_type -> saas.accounts.v1.ListMyDatasourceAccountLinksRequest + 58, // 84: saas.accounts.v1.DatasourceService.DeleteDatasourceAccountLink:input_type -> saas.accounts.v1.DeleteDatasourceAccountLinkRequest + 60, // 85: saas.accounts.v1.DatasourceService.GetDatasourceDirectory:input_type -> saas.accounts.v1.GetDatasourceDirectoryRequest + 62, // 86: saas.accounts.v1.DatasourceService.BindDatasourceGroup:input_type -> saas.accounts.v1.BindDatasourceGroupRequest + 64, // 87: saas.accounts.v1.DatasourceService.UnbindDatasourceGroup:input_type -> saas.accounts.v1.UnbindDatasourceGroupRequest + 66, // 88: saas.accounts.v1.DatasourceService.ClaimDatasourceDomain:input_type -> saas.accounts.v1.ClaimDatasourceDomainRequest + 68, // 89: saas.accounts.v1.DatasourceService.VerifyDatasourceDomain:input_type -> saas.accounts.v1.VerifyDatasourceDomainRequest + 70, // 90: saas.accounts.v1.DatasourceService.DeleteDatasourceDomain:input_type -> saas.accounts.v1.DeleteDatasourceDomainRequest + 73, // 91: saas.accounts.v1.DatasourceService.ListSourceDelegations:input_type -> saas.accounts.v1.ListSourceDelegationsRequest + 75, // 92: saas.accounts.v1.DatasourceService.RevokeSourceDelegation:input_type -> saas.accounts.v1.RevokeSourceDelegationRequest + 19, // 93: saas.accounts.v1.DatasourceService.AddGitHubSource:output_type -> saas.accounts.v1.AddGitHubSourceResponse + 21, // 94: saas.accounts.v1.DatasourceService.AddSource:output_type -> saas.accounts.v1.AddSourceResponse + 26, // 95: saas.accounts.v1.DatasourceService.GetDatasourceCatalog:output_type -> saas.accounts.v1.GetDatasourceCatalogResponse + 28, // 96: saas.accounts.v1.DatasourceService.ListSources:output_type -> saas.accounts.v1.ListSourcesResponse + 30, // 97: saas.accounts.v1.DatasourceService.GetSource:output_type -> saas.accounts.v1.GetSourceResponse + 32, // 98: saas.accounts.v1.DatasourceService.SyncSource:output_type -> saas.accounts.v1.SyncSourceResponse + 38, // 99: saas.accounts.v1.DatasourceService.GetSourceSync:output_type -> saas.accounts.v1.GetSourceSyncResponse + 40, // 100: saas.accounts.v1.DatasourceService.DeleteSource:output_type -> saas.accounts.v1.DeleteSourceResponse + 43, // 101: saas.accounts.v1.DatasourceService.BeginGitHubAppSetup:output_type -> saas.accounts.v1.BeginGitHubAppSetupResponse + 45, // 102: saas.accounts.v1.DatasourceService.CompleteGitHubAppSetup:output_type -> saas.accounts.v1.CompleteGitHubAppSetupResponse + 47, // 103: saas.accounts.v1.DatasourceService.MigrateGitHubSourceToApp:output_type -> saas.accounts.v1.MigrateGitHubSourceToAppResponse + 53, // 104: saas.accounts.v1.DatasourceService.BeginDatasourceAccountLink:output_type -> saas.accounts.v1.BeginDatasourceAccountLinkResponse + 55, // 105: saas.accounts.v1.DatasourceService.CompleteDatasourceAccountLink:output_type -> saas.accounts.v1.CompleteDatasourceAccountLinkResponse + 57, // 106: saas.accounts.v1.DatasourceService.ListMyDatasourceAccountLinks:output_type -> saas.accounts.v1.ListMyDatasourceAccountLinksResponse + 59, // 107: saas.accounts.v1.DatasourceService.DeleteDatasourceAccountLink:output_type -> saas.accounts.v1.DeleteDatasourceAccountLinkResponse + 61, // 108: saas.accounts.v1.DatasourceService.GetDatasourceDirectory:output_type -> saas.accounts.v1.GetDatasourceDirectoryResponse + 63, // 109: saas.accounts.v1.DatasourceService.BindDatasourceGroup:output_type -> saas.accounts.v1.BindDatasourceGroupResponse + 65, // 110: saas.accounts.v1.DatasourceService.UnbindDatasourceGroup:output_type -> saas.accounts.v1.UnbindDatasourceGroupResponse + 67, // 111: saas.accounts.v1.DatasourceService.ClaimDatasourceDomain:output_type -> saas.accounts.v1.ClaimDatasourceDomainResponse + 69, // 112: saas.accounts.v1.DatasourceService.VerifyDatasourceDomain:output_type -> saas.accounts.v1.VerifyDatasourceDomainResponse + 71, // 113: saas.accounts.v1.DatasourceService.DeleteDatasourceDomain:output_type -> saas.accounts.v1.DeleteDatasourceDomainResponse + 74, // 114: saas.accounts.v1.DatasourceService.ListSourceDelegations:output_type -> saas.accounts.v1.ListSourceDelegationsResponse + 76, // 115: saas.accounts.v1.DatasourceService.RevokeSourceDelegation:output_type -> saas.accounts.v1.RevokeSourceDelegationResponse + 93, // [93:116] is the sub-list for method output_type + 70, // [70:93] is the sub-list for method input_type + 70, // [70:70] is the sub-list for extension type_name + 70, // [70:70] is the sub-list for extension extendee + 0, // [0:70] is the sub-list for field type_name } func init() { file_saas_accounts_v1_datasource_proto_init() } @@ -5919,7 +6059,7 @@ func file_saas_accounts_v1_datasource_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_datasource_proto_rawDesc), len(file_saas_accounts_v1_datasource_proto_rawDesc)), - NumEnums: 11, + NumEnums: 12, NumMessages: 65, NumExtensions: 0, NumServices: 1, diff --git a/gen/saas/accounts/v1/invitations.pb.go b/gen/saas/accounts/v1/invitations.pb.go index bb77e62..a5b27a2 100644 --- a/gen/saas/accounts/v1/invitations.pb.go +++ b/gen/saas/accounts/v1/invitations.pb.go @@ -452,8 +452,12 @@ func (x *CreateInvitationRequest) GetRole() InvitationRole { } type CreateInvitationResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Invitation *Invitation `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Invitation *Invitation `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"` + // The invitation's accept link, returned once to the administrator who + // created it so it can be shared without email. It is never stored in + // plaintext and never returned by any read. + AcceptUrl string `protobuf:"bytes,2,opt,name=accept_url,json=acceptUrl,proto3" json:"accept_url,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -495,6 +499,13 @@ func (x *CreateInvitationResponse) GetInvitation() *Invitation { return nil } +func (x *CreateInvitationResponse) GetAcceptUrl() string { + if x != nil { + return x.AcceptUrl + } + return "" +} + type InspectInvitationRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` @@ -901,6 +912,104 @@ func (x *ResendInvitationRequest) GetId() string { return "" } +type IssueInvitationLinkRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IssueInvitationLinkRequest) Reset() { + *x = IssueInvitationLinkRequest{} + mi := &file_saas_accounts_v1_invitations_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IssueInvitationLinkRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IssueInvitationLinkRequest) ProtoMessage() {} + +func (x *IssueInvitationLinkRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_invitations_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 IssueInvitationLinkRequest.ProtoReflect.Descriptor instead. +func (*IssueInvitationLinkRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_invitations_proto_rawDescGZIP(), []int{12} +} + +func (x *IssueInvitationLinkRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type IssueInvitationLinkResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Invitation *Invitation `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"` + // A freshly rotated accept link: every earlier link for this invitation, + // including one already emailed, stops working. + AcceptUrl string `protobuf:"bytes,2,opt,name=accept_url,json=acceptUrl,proto3" json:"accept_url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IssueInvitationLinkResponse) Reset() { + *x = IssueInvitationLinkResponse{} + mi := &file_saas_accounts_v1_invitations_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IssueInvitationLinkResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IssueInvitationLinkResponse) ProtoMessage() {} + +func (x *IssueInvitationLinkResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_invitations_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 IssueInvitationLinkResponse.ProtoReflect.Descriptor instead. +func (*IssueInvitationLinkResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_invitations_proto_rawDescGZIP(), []int{13} +} + +func (x *IssueInvitationLinkResponse) GetInvitation() *Invitation { + if x != nil { + return x.Invitation + } + return nil +} + +func (x *IssueInvitationLinkResponse) GetAcceptUrl() string { + if x != nil { + return x.AcceptUrl + } + return "" +} + var File_saas_accounts_v1_invitations_proto protoreflect.FileDescriptor const file_saas_accounts_v1_invitations_proto_rawDesc = "" + @@ -937,11 +1046,13 @@ const file_saas_accounts_v1_invitations_proto_rawDesc = "" + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12\x1d\n" + "\x05email\x18\x02 \x01(\tB\a\xbaH\x04r\x02`\x01R\x05email\x12@\n" + "\x04role\x18\x03 \x01(\x0e2 .saas.accounts.v1.InvitationRoleB\n" + - "\xbaH\a\x82\x01\x04\x10\x01 \x00R\x04role\"X\n" + + "\xbaH\a\x82\x01\x04\x10\x01 \x00R\x04role\"w\n" + "\x18CreateInvitationResponse\x12<\n" + "\n" + "invitation\x18\x01 \x01(\v2\x1c.saas.accounts.v1.InvitationR\n" + - "invitation\"<\n" + + "invitation\x12\x1d\n" + + "\n" + + "accept_url\x18\x02 \x01(\tR\tacceptUrl\"<\n" + "\x18InspectInvitationRequest\x12 \n" + "\x05token\x18\x01 \x01(\tB\n" + "\xbaH\ar\x05\x10 \x18\x80\x04R\x05token\"M\n" + @@ -964,7 +1075,15 @@ const file_saas_accounts_v1_invitations_proto_rawDesc = "" + "\x17RevokeInvitationRequest\x12\x18\n" + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\"3\n" + "\x17ResendInvitationRequest\x12\x18\n" + - "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id*\xb2\x01\n" + + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\"6\n" + + "\x1aIssueInvitationLinkRequest\x12\x18\n" + + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\"z\n" + + "\x1bIssueInvitationLinkResponse\x12<\n" + + "\n" + + "invitation\x18\x01 \x01(\v2\x1c.saas.accounts.v1.InvitationR\n" + + "invitation\x12\x1d\n" + + "\n" + + "accept_url\x18\x02 \x01(\tR\tacceptUrl*\xb2\x01\n" + "\x10InvitationStatus\x12!\n" + "\x1dINVITATION_STATUS_UNSPECIFIED\x10\x00\x12\x1d\n" + "\x19INVITATION_STATUS_PENDING\x10\x01\x12\x1e\n" + @@ -982,11 +1101,11 @@ const file_saas_accounts_v1_invitations_proto_rawDesc = "" + "\x1fINVITATION_DELIVERY_STATUS_SENT\x10\x03\x12(\n" + "$INVITATION_DELIVERY_STATUS_DELIVERED\x10\x04\x12&\n" + "\"INVITATION_DELIVERY_STATUS_BOUNCED\x10\x05\x12)\n" + - "%INVITATION_DELIVERY_STATUS_COMPLAINED\x10\x062\xa3\v\n" + + "%INVITATION_DELIVERY_STATUS_COMPLAINED\x10\x062\x81\r\n" + "\x11InvitationService\x12\xed\x01\n" + "\x10CreateInvitation\x12).saas.accounts.v1.CreateInvitationRequest\x1a*.saas.accounts.v1.CreateInvitationResponse\"\x81\x01\xc2\xf3\x18c\b\x02\x10\x04\x1a\x11invitations:write\"\x11invitations:write*\f\n" + "\x06org_id\x10\x02\x18\x010\x01:\x1b\n" + - "\x17saas.invitation.created\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/v1/invitations\x12\xa0\x01\n" + + "\x17saas.invitation.created\x10\x02@\x01H\x04P\x03X\x04`\x01x\x02\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/v1/invitations\x12\xa0\x01\n" + "\x11InspectInvitation\x12*.saas.accounts.v1.InspectInvitationRequest\x1a#.saas.accounts.v1.InvitationSummary\":\xc2\xf3\x18\x14\b\x01\x10\x010\x01:\x02\x10\x01@\x01H\x01P\x04X\x03`\x01\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v1/invitations:inspect\x12\xab\x01\n" + "\x15InspectInvitationById\x12..saas.accounts.v1.InspectInvitationByIdRequest\x1a#.saas.accounts.v1.InvitationSummary\"=\xc2\xf3\x18\x14\b\x02\x10\x020\x01:\x02\x10\x01@\x01H\x03P\x03X\x03`\x01\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v1/invitations:inspect-id\x12\xc0\x01\n" + "\x10AcceptInvitation\x12).saas.accounts.v1.AcceptInvitationRequest\x1a*.saas.accounts.v1.AcceptInvitationResponse\"U\xc2\xf3\x180\b\x02\x10\x020\x01:\x1c\n" + @@ -995,7 +1114,10 @@ const file_saas_accounts_v1_invitations_proto_rawDesc = "" + "\x06org_id\x10\x02\x18\x010\x01:\x02\x10\x01@\x01H\x03P\x03X\x03`\x01\x82\xd3\xe4\x93\x02\x11\x12\x0f/v1/invitations\x12\xe4\x01\n" + "\x10ResendInvitation\x12).saas.accounts.v1.ResendInvitationRequest\x1a\x1c.saas.accounts.v1.Invitation\"\x86\x01\xc2\xf3\x18\\\b\x02\x10\x04\x1a\x11invitations:write\"\x11invitations:write*\b\n" + "\x02id\x10\x04\x18\x030\x01:\x1a\n" + - "\x16saas.invitation.resent\x10\x02@\x03H\x04P\x03X\x03`\x01\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/invitations/{id}:resend\x12\xd6\x01\n" + + "\x16saas.invitation.resent\x10\x02@\x03H\x04P\x03X\x03`\x01\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/invitations/{id}:resend\x12\xdb\x01\n" + + "\x13IssueInvitationLink\x12,.saas.accounts.v1.IssueInvitationLinkRequest\x1a-.saas.accounts.v1.IssueInvitationLinkResponse\"g\xc2\xf3\x18c\b\x02\x10\x04\x1a\x11invitations:write\"\x11invitations:write*\b\n" + + "\x02id\x10\x04\x18\x030\x01:\x1f\n" + + "\x1bsaas.invitation.link_issued\x10\x02@\x01H\x04P\x03X\x04`\x01x\x02\x12\xd6\x01\n" + "\x10RevokeInvitation\x12).saas.accounts.v1.RevokeInvitationRequest\x1a\x16.google.protobuf.Empty\"\x7f\xc2\xf3\x18_\b\x02\x10\x04\x1a\x11invitations:write\"\x11invitations:write*\b\n" + "\x02id\x10\x04\x18\x030\x01:\x1b\n" + "\x17saas.invitation.revoked\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x82\xd3\xe4\x93\x02\x16*\x14/v1/invitations/{id}B\xce\x01\n" + @@ -1014,7 +1136,7 @@ func file_saas_accounts_v1_invitations_proto_rawDescGZIP() []byte { } var file_saas_accounts_v1_invitations_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_saas_accounts_v1_invitations_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_saas_accounts_v1_invitations_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_saas_accounts_v1_invitations_proto_goTypes = []any{ (InvitationStatus)(0), // 0: saas.accounts.v1.InvitationStatus (InvitationRole)(0), // 1: saas.accounts.v1.InvitationRole @@ -1031,44 +1153,49 @@ var file_saas_accounts_v1_invitations_proto_goTypes = []any{ (*ListInvitationsResponse)(nil), // 12: saas.accounts.v1.ListInvitationsResponse (*RevokeInvitationRequest)(nil), // 13: saas.accounts.v1.RevokeInvitationRequest (*ResendInvitationRequest)(nil), // 14: saas.accounts.v1.ResendInvitationRequest - (*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp - (*Organization)(nil), // 16: saas.accounts.v1.Organization - (*emptypb.Empty)(nil), // 17: google.protobuf.Empty + (*IssueInvitationLinkRequest)(nil), // 15: saas.accounts.v1.IssueInvitationLinkRequest + (*IssueInvitationLinkResponse)(nil), // 16: saas.accounts.v1.IssueInvitationLinkResponse + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp + (*Organization)(nil), // 18: saas.accounts.v1.Organization + (*emptypb.Empty)(nil), // 19: google.protobuf.Empty } var file_saas_accounts_v1_invitations_proto_depIdxs = []int32{ 1, // 0: saas.accounts.v1.Invitation.role:type_name -> saas.accounts.v1.InvitationRole 0, // 1: saas.accounts.v1.Invitation.status:type_name -> saas.accounts.v1.InvitationStatus 2, // 2: saas.accounts.v1.Invitation.delivery_status:type_name -> saas.accounts.v1.InvitationDeliveryStatus - 15, // 3: saas.accounts.v1.Invitation.expires_at:type_name -> google.protobuf.Timestamp - 15, // 4: saas.accounts.v1.Invitation.created_at:type_name -> google.protobuf.Timestamp - 15, // 5: saas.accounts.v1.Invitation.last_sent_at:type_name -> google.protobuf.Timestamp + 17, // 3: saas.accounts.v1.Invitation.expires_at:type_name -> google.protobuf.Timestamp + 17, // 4: saas.accounts.v1.Invitation.created_at:type_name -> google.protobuf.Timestamp + 17, // 5: saas.accounts.v1.Invitation.last_sent_at:type_name -> google.protobuf.Timestamp 0, // 6: saas.accounts.v1.InvitationSummary.status:type_name -> saas.accounts.v1.InvitationStatus 1, // 7: saas.accounts.v1.InvitationSummary.role:type_name -> saas.accounts.v1.InvitationRole - 15, // 8: saas.accounts.v1.InvitationSummary.expires_at:type_name -> google.protobuf.Timestamp + 17, // 8: saas.accounts.v1.InvitationSummary.expires_at:type_name -> google.protobuf.Timestamp 1, // 9: saas.accounts.v1.CreateInvitationRequest.role:type_name -> saas.accounts.v1.InvitationRole 3, // 10: saas.accounts.v1.CreateInvitationResponse.invitation:type_name -> saas.accounts.v1.Invitation - 16, // 11: saas.accounts.v1.AcceptInvitationResponse.organization:type_name -> saas.accounts.v1.Organization + 18, // 11: saas.accounts.v1.AcceptInvitationResponse.organization:type_name -> saas.accounts.v1.Organization 0, // 12: saas.accounts.v1.ListInvitationsRequest.status:type_name -> saas.accounts.v1.InvitationStatus 3, // 13: saas.accounts.v1.ListInvitationsResponse.invitations:type_name -> saas.accounts.v1.Invitation - 5, // 14: saas.accounts.v1.InvitationService.CreateInvitation:input_type -> saas.accounts.v1.CreateInvitationRequest - 7, // 15: saas.accounts.v1.InvitationService.InspectInvitation:input_type -> saas.accounts.v1.InspectInvitationRequest - 8, // 16: saas.accounts.v1.InvitationService.InspectInvitationById:input_type -> saas.accounts.v1.InspectInvitationByIdRequest - 9, // 17: saas.accounts.v1.InvitationService.AcceptInvitation:input_type -> saas.accounts.v1.AcceptInvitationRequest - 11, // 18: saas.accounts.v1.InvitationService.ListInvitations:input_type -> saas.accounts.v1.ListInvitationsRequest - 14, // 19: saas.accounts.v1.InvitationService.ResendInvitation:input_type -> saas.accounts.v1.ResendInvitationRequest - 13, // 20: saas.accounts.v1.InvitationService.RevokeInvitation:input_type -> saas.accounts.v1.RevokeInvitationRequest - 6, // 21: saas.accounts.v1.InvitationService.CreateInvitation:output_type -> saas.accounts.v1.CreateInvitationResponse - 4, // 22: saas.accounts.v1.InvitationService.InspectInvitation:output_type -> saas.accounts.v1.InvitationSummary - 4, // 23: saas.accounts.v1.InvitationService.InspectInvitationById:output_type -> saas.accounts.v1.InvitationSummary - 10, // 24: saas.accounts.v1.InvitationService.AcceptInvitation:output_type -> saas.accounts.v1.AcceptInvitationResponse - 12, // 25: saas.accounts.v1.InvitationService.ListInvitations:output_type -> saas.accounts.v1.ListInvitationsResponse - 3, // 26: saas.accounts.v1.InvitationService.ResendInvitation:output_type -> saas.accounts.v1.Invitation - 17, // 27: saas.accounts.v1.InvitationService.RevokeInvitation:output_type -> google.protobuf.Empty - 21, // [21:28] is the sub-list for method output_type - 14, // [14:21] 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 + 3, // 14: saas.accounts.v1.IssueInvitationLinkResponse.invitation:type_name -> saas.accounts.v1.Invitation + 5, // 15: saas.accounts.v1.InvitationService.CreateInvitation:input_type -> saas.accounts.v1.CreateInvitationRequest + 7, // 16: saas.accounts.v1.InvitationService.InspectInvitation:input_type -> saas.accounts.v1.InspectInvitationRequest + 8, // 17: saas.accounts.v1.InvitationService.InspectInvitationById:input_type -> saas.accounts.v1.InspectInvitationByIdRequest + 9, // 18: saas.accounts.v1.InvitationService.AcceptInvitation:input_type -> saas.accounts.v1.AcceptInvitationRequest + 11, // 19: saas.accounts.v1.InvitationService.ListInvitations:input_type -> saas.accounts.v1.ListInvitationsRequest + 14, // 20: saas.accounts.v1.InvitationService.ResendInvitation:input_type -> saas.accounts.v1.ResendInvitationRequest + 15, // 21: saas.accounts.v1.InvitationService.IssueInvitationLink:input_type -> saas.accounts.v1.IssueInvitationLinkRequest + 13, // 22: saas.accounts.v1.InvitationService.RevokeInvitation:input_type -> saas.accounts.v1.RevokeInvitationRequest + 6, // 23: saas.accounts.v1.InvitationService.CreateInvitation:output_type -> saas.accounts.v1.CreateInvitationResponse + 4, // 24: saas.accounts.v1.InvitationService.InspectInvitation:output_type -> saas.accounts.v1.InvitationSummary + 4, // 25: saas.accounts.v1.InvitationService.InspectInvitationById:output_type -> saas.accounts.v1.InvitationSummary + 10, // 26: saas.accounts.v1.InvitationService.AcceptInvitation:output_type -> saas.accounts.v1.AcceptInvitationResponse + 12, // 27: saas.accounts.v1.InvitationService.ListInvitations:output_type -> saas.accounts.v1.ListInvitationsResponse + 3, // 28: saas.accounts.v1.InvitationService.ResendInvitation:output_type -> saas.accounts.v1.Invitation + 16, // 29: saas.accounts.v1.InvitationService.IssueInvitationLink:output_type -> saas.accounts.v1.IssueInvitationLinkResponse + 19, // 30: saas.accounts.v1.InvitationService.RevokeInvitation:output_type -> google.protobuf.Empty + 23, // [23:31] is the sub-list for method output_type + 15, // [15:23] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_saas_accounts_v1_invitations_proto_init() } @@ -1087,7 +1214,7 @@ func file_saas_accounts_v1_invitations_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_invitations_proto_rawDesc), len(file_saas_accounts_v1_invitations_proto_rawDesc)), NumEnums: 3, - NumMessages: 12, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/saas/accounts/v1/module_capabilities.pb.go b/gen/saas/accounts/v1/module_capabilities.pb.go index 0896963..029c27e 100644 --- a/gen/saas/accounts/v1/module_capabilities.pb.go +++ b/gen/saas/accounts/v1/module_capabilities.pb.go @@ -98,6 +98,70 @@ func (ModuleAuditFieldKind) EnumDescriptor() ([]byte, []int) { return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{0} } +// ModuleAuditEventVisibility is how far an event of a declared audit type may +// travel. It is the vocabulary the composed event catalog already declares its +// published events under, narrowed to the two values a declaration can mean: +// an audit record is always readable by its own tenant, so `internal` has no +// reading here. +type ModuleAuditEventVisibility int32 + +const ( + // Unset means TENANT. A declaration that says nothing keeps its events + // inside the platform, because eligibility to leave is granted by an + // explicit declaration and never by omission. + ModuleAuditEventVisibility_MODULE_AUDIT_EVENT_VISIBILITY_UNSPECIFIED ModuleAuditEventVisibility = 0 + // Recorded in the tenant's audit log and never delivered outside the + // platform. + ModuleAuditEventVisibility_MODULE_AUDIT_EVENT_VISIBILITY_TENANT ModuleAuditEventVisibility = 1 + // May additionally be delivered to a tenant's outbound webhook endpoint. + // Admitted only in a namespace the operator marked externally deliverable + // (`external_namespaces` of the declaring principal's MODULE_PRINCIPALS + // entry): the producer decides which of its facts are customer-facing, and + // the operator decides whether that producer may send anything out at all. + ModuleAuditEventVisibility_MODULE_AUDIT_EVENT_VISIBILITY_EXTERNAL ModuleAuditEventVisibility = 2 +) + +// Enum value maps for ModuleAuditEventVisibility. +var ( + ModuleAuditEventVisibility_name = map[int32]string{ + 0: "MODULE_AUDIT_EVENT_VISIBILITY_UNSPECIFIED", + 1: "MODULE_AUDIT_EVENT_VISIBILITY_TENANT", + 2: "MODULE_AUDIT_EVENT_VISIBILITY_EXTERNAL", + } + ModuleAuditEventVisibility_value = map[string]int32{ + "MODULE_AUDIT_EVENT_VISIBILITY_UNSPECIFIED": 0, + "MODULE_AUDIT_EVENT_VISIBILITY_TENANT": 1, + "MODULE_AUDIT_EVENT_VISIBILITY_EXTERNAL": 2, + } +) + +func (x ModuleAuditEventVisibility) Enum() *ModuleAuditEventVisibility { + p := new(ModuleAuditEventVisibility) + *p = x + return p +} + +func (x ModuleAuditEventVisibility) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ModuleAuditEventVisibility) Descriptor() protoreflect.EnumDescriptor { + return file_saas_accounts_v1_module_capabilities_proto_enumTypes[1].Descriptor() +} + +func (ModuleAuditEventVisibility) Type() protoreflect.EnumType { + return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[1] +} + +func (x ModuleAuditEventVisibility) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ModuleAuditEventVisibility.Descriptor instead. +func (ModuleAuditEventVisibility) EnumDescriptor() ([]byte, []int) { + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{1} +} + // DatasourceItemReadersBasis says where an item's readers came from. type DatasourceItemReadersBasis int32 @@ -140,11 +204,11 @@ func (x DatasourceItemReadersBasis) String() string { } func (DatasourceItemReadersBasis) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_module_capabilities_proto_enumTypes[1].Descriptor() + return file_saas_accounts_v1_module_capabilities_proto_enumTypes[2].Descriptor() } func (DatasourceItemReadersBasis) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[1] + return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[2] } func (x DatasourceItemReadersBasis) Number() protoreflect.EnumNumber { @@ -153,7 +217,7 @@ func (x DatasourceItemReadersBasis) Number() protoreflect.EnumNumber { // Deprecated: Use DatasourceItemReadersBasis.Descriptor instead. func (DatasourceItemReadersBasis) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{1} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{2} } // EventDelivery is the ordering guarantee a subscription requests, mirroring @@ -192,11 +256,11 @@ func (x EventDelivery) String() string { } func (EventDelivery) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_module_capabilities_proto_enumTypes[2].Descriptor() + return file_saas_accounts_v1_module_capabilities_proto_enumTypes[3].Descriptor() } func (EventDelivery) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[2] + return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[3] } func (x EventDelivery) Number() protoreflect.EnumNumber { @@ -205,7 +269,7 @@ func (x EventDelivery) Number() protoreflect.EnumNumber { // Deprecated: Use EventDelivery.Descriptor instead. func (EventDelivery) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{2} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{3} } // MetadataDisclosure separates "the host withheld this from you" from "there is @@ -245,11 +309,11 @@ func (x MetadataDisclosure) String() string { } func (MetadataDisclosure) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_module_capabilities_proto_enumTypes[3].Descriptor() + return file_saas_accounts_v1_module_capabilities_proto_enumTypes[4].Descriptor() } func (MetadataDisclosure) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[3] + return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[4] } func (x MetadataDisclosure) Number() protoreflect.EnumNumber { @@ -258,7 +322,7 @@ func (x MetadataDisclosure) Number() protoreflect.EnumNumber { // Deprecated: Use MetadataDisclosure.Descriptor instead. func (MetadataDisclosure) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{3} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{4} } // SourceSyncStage names which occurrence CollectionSyncProvenance.at records. @@ -298,11 +362,11 @@ func (x SourceSyncStage) String() string { } func (SourceSyncStage) Descriptor() protoreflect.EnumDescriptor { - return file_saas_accounts_v1_module_capabilities_proto_enumTypes[4].Descriptor() + return file_saas_accounts_v1_module_capabilities_proto_enumTypes[5].Descriptor() } func (SourceSyncStage) Type() protoreflect.EnumType { - return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[4] + return &file_saas_accounts_v1_module_capabilities_proto_enumTypes[5] } func (x SourceSyncStage) Number() protoreflect.EnumNumber { @@ -311,7 +375,7 @@ func (x SourceSyncStage) Number() protoreflect.EnumNumber { // Deprecated: Use SourceSyncStage.Descriptor instead. func (SourceSyncStage) EnumDescriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{4} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{5} } // ModuleEnqueueJobRequest names the tenant the work belongs to and carries the @@ -1783,9 +1847,15 @@ type ModuleAuditEventTypeDeclaration struct { // .., lowercase snake_case segments. The // namespace must be one the operator bound to this module (the `namespaces` // of its MODULE_PRINCIPALS entry) and may not be the host's own. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Fields []*ModuleAuditFieldDeclaration `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Fields []*ModuleAuditFieldDeclaration `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + // How far an event of this type may travel. Fixed at admission: a later + // declaration that names a different visibility is refused, because + // narrowing it would silently stop deliveries to endpoints already + // subscribed and widening it would start sending out facts a tenant's + // endpoint never agreed to receive under this name. + Visibility ModuleAuditEventVisibility `protobuf:"varint,4,opt,name=visibility,proto3,enum=saas.accounts.v1.ModuleAuditEventVisibility" json:"visibility,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1841,6 +1911,13 @@ func (x *ModuleAuditEventTypeDeclaration) GetFields() []*ModuleAuditFieldDeclara return nil } +func (x *ModuleAuditEventTypeDeclaration) GetVisibility() ModuleAuditEventVisibility { + if x != nil { + return x.Visibility + } + return ModuleAuditEventVisibility_MODULE_AUDIT_EVENT_VISIBILITY_UNSPECIFIED +} + // ModuleDeclareAuditEventTypesRequest declares the audit event types a composed // module owns, so its EmitAuditEvent calls for them are accepted and checked // against the declared fields. It is the module-side form of a solution's @@ -3842,6 +3919,104 @@ func (x *ModulePlaceRecordResponse) GetNodeId() string { return "" } +// Read-only attestation; identity and boundary come exclusively from this signed +// context. The caller separately authenticates as its consuming module. +type VerifyWorkContextRuntimeBoundaryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ForwardedWorkContextToken string `protobuf:"bytes,1,opt,name=forwarded_work_context_token,json=forwardedWorkContextToken,proto3" json:"forwarded_work_context_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyWorkContextRuntimeBoundaryRequest) Reset() { + *x = VerifyWorkContextRuntimeBoundaryRequest{} + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyWorkContextRuntimeBoundaryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyWorkContextRuntimeBoundaryRequest) ProtoMessage() {} + +func (x *VerifyWorkContextRuntimeBoundaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyWorkContextRuntimeBoundaryRequest.ProtoReflect.Descriptor instead. +func (*VerifyWorkContextRuntimeBoundaryRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{52} +} + +func (x *VerifyWorkContextRuntimeBoundaryRequest) GetForwardedWorkContextToken() string { + if x != nil { + return x.ForwardedWorkContextToken + } + return "" +} + +type VerifyWorkContextRuntimeBoundaryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + TenantId string `protobuf:"bytes,1,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` + BoundaryId string `protobuf:"bytes,2,opt,name=boundary_id,json=boundaryId,proto3" json:"boundary_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyWorkContextRuntimeBoundaryResponse) Reset() { + *x = VerifyWorkContextRuntimeBoundaryResponse{} + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyWorkContextRuntimeBoundaryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyWorkContextRuntimeBoundaryResponse) ProtoMessage() {} + +func (x *VerifyWorkContextRuntimeBoundaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VerifyWorkContextRuntimeBoundaryResponse.ProtoReflect.Descriptor instead. +func (*VerifyWorkContextRuntimeBoundaryResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{53} +} + +func (x *VerifyWorkContextRuntimeBoundaryResponse) GetTenantId() string { + if x != nil { + return x.TenantId + } + return "" +} + +func (x *VerifyWorkContextRuntimeBoundaryResponse) GetBoundaryId() string { + if x != nil { + return x.BoundaryId + } + return "" +} + // Exact-record delegated oracle. Tenant and subjects come only from the signed // forwarded Work Context; a caller cannot provide a scope path or principal. type CheckWorkContextRecordAccessRequest struct { @@ -3855,7 +4030,7 @@ type CheckWorkContextRecordAccessRequest struct { func (x *CheckWorkContextRecordAccessRequest) Reset() { *x = CheckWorkContextRecordAccessRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3867,7 +4042,7 @@ func (x *CheckWorkContextRecordAccessRequest) String() string { func (*CheckWorkContextRecordAccessRequest) ProtoMessage() {} func (x *CheckWorkContextRecordAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3880,7 +4055,7 @@ func (x *CheckWorkContextRecordAccessRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use CheckWorkContextRecordAccessRequest.ProtoReflect.Descriptor instead. func (*CheckWorkContextRecordAccessRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{52} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{54} } func (x *CheckWorkContextRecordAccessRequest) GetResourceType() string { @@ -3916,7 +4091,7 @@ type CheckWorkContextRecordAccessResponse struct { func (x *CheckWorkContextRecordAccessResponse) Reset() { *x = CheckWorkContextRecordAccessResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3928,7 +4103,7 @@ func (x *CheckWorkContextRecordAccessResponse) String() string { func (*CheckWorkContextRecordAccessResponse) ProtoMessage() {} func (x *CheckWorkContextRecordAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3941,7 +4116,7 @@ func (x *CheckWorkContextRecordAccessResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use CheckWorkContextRecordAccessResponse.ProtoReflect.Descriptor instead. func (*CheckWorkContextRecordAccessResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{53} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{55} } func (x *CheckWorkContextRecordAccessResponse) GetAllowed() bool { @@ -3970,7 +4145,7 @@ type ModuleExchangeDelegatedReadAudienceRequest struct { func (x *ModuleExchangeDelegatedReadAudienceRequest) Reset() { *x = ModuleExchangeDelegatedReadAudienceRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3982,7 +4157,7 @@ func (x *ModuleExchangeDelegatedReadAudienceRequest) String() string { func (*ModuleExchangeDelegatedReadAudienceRequest) ProtoMessage() {} func (x *ModuleExchangeDelegatedReadAudienceRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3995,7 +4170,7 @@ func (x *ModuleExchangeDelegatedReadAudienceRequest) ProtoReflect() protoreflect // Deprecated: Use ModuleExchangeDelegatedReadAudienceRequest.ProtoReflect.Descriptor instead. func (*ModuleExchangeDelegatedReadAudienceRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{54} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{56} } func (x *ModuleExchangeDelegatedReadAudienceRequest) GetBindingId() string { @@ -4014,18 +4189,44 @@ func (x *ModuleExchangeDelegatedReadAudienceRequest) GetParentWorkContextToken() // Selects one immutable installed operation binding. The caller chooses only // invocation versus receipt lookup; audience, scopes and lifetime are policy. +// +// The caller presents its authority one of two ways, and exactly one: +// +// - parent_work_context_token, a live capability it already holds. The child +// is attenuated against that parent and expires with it, so work that +// outlives the parent cannot be authorized this way at all. +// - delegation_id, a reference to a host-owned, revocable source delegation. +// No capability is presented, none is held, and none needs to still be +// valid: the host re-checks the delegation live and mints a fresh short +// child from it. This is how work longer than any Work Context stays +// authorized — the caller holds the reference, never a token — and how it +// renews, by exchanging again against the same reference. A revocation +// takes effect on the next exchange. +// +// Not a oneof, though the two are exclusive and it is the shape this would +// otherwise take. Moving field 2 into one changes its presence and is a +// breaking contract change (`buf breaking`), which this surface does not get to +// make to a published field. The exclusivity is enforced here instead, so it is +// still the contract and not a convention: a request setting both, or neither, +// is INVALID_ARGUMENT before any handler sees it. type ModuleExchangeDelegatedOperationAudienceRequest struct { state protoimpl.MessageState `protogen:"open.v1"` BindingId string `protobuf:"bytes,1,opt,name=binding_id,json=bindingId,proto3" json:"binding_id,omitempty"` ParentWorkContextToken string `protobuf:"bytes,2,opt,name=parent_work_context_token,json=parentWorkContextToken,proto3" json:"parent_work_context_token,omitempty"` Lookup bool `protobuf:"varint,3,opt,name=lookup,proto3" json:"lookup,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // delegation_id names one source delegation. It must be the delegation a + // person made to the module whose installed binding names this caller as its + // audience; one belonging to another module, one this caller is not the + // audience of, and one that is revoked or does not exist are all refused with + // PERMISSION_DENIED, indistinguishably. Empty means the parent arm is in use. + DelegationId string `protobuf:"bytes,4,opt,name=delegation_id,json=delegationId,proto3" json:"delegation_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ModuleExchangeDelegatedOperationAudienceRequest) Reset() { *x = ModuleExchangeDelegatedOperationAudienceRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4037,7 +4238,7 @@ func (x *ModuleExchangeDelegatedOperationAudienceRequest) String() string { func (*ModuleExchangeDelegatedOperationAudienceRequest) ProtoMessage() {} func (x *ModuleExchangeDelegatedOperationAudienceRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4050,7 +4251,7 @@ func (x *ModuleExchangeDelegatedOperationAudienceRequest) ProtoReflect() protore // Deprecated: Use ModuleExchangeDelegatedOperationAudienceRequest.ProtoReflect.Descriptor instead. func (*ModuleExchangeDelegatedOperationAudienceRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{55} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{57} } func (x *ModuleExchangeDelegatedOperationAudienceRequest) GetBindingId() string { @@ -4074,6 +4275,13 @@ func (x *ModuleExchangeDelegatedOperationAudienceRequest) GetLookup() bool { return false } +func (x *ModuleExchangeDelegatedOperationAudienceRequest) GetDelegationId() string { + if x != nil { + return x.DelegationId + } + return "" +} + var File_saas_accounts_v1_module_capabilities_proto protoreflect.FileDescriptor const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + @@ -4205,12 +4413,15 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x04kind\x18\x02 \x01(\x0e2&.saas.accounts.v1.ModuleAuditFieldKindB\n" + "\xbaH\a\x82\x01\x04\x10\x01 \x00R\x04kind\x12 \n" + "\x06values\x18\x03 \x03(\tB\b\xbaH\x05\x92\x01\x02\x10@R\x06values\x12\x10\n" + - "\x03pii\x18\x04 \x01(\bR\x03pii\"\xbe\x01\n" + + "\x03pii\x18\x04 \x01(\bR\x03pii\"\x96\x02\n" + "\x1fModuleAuditEventTypeDeclaration\x12\x1e\n" + "\x04type\x18\x01 \x01(\tB\n" + "\xbaH\ar\x05\x10\x01\x18\x80\x01R\x04type\x12*\n" + "\vdescription\x18\x02 \x01(\tB\b\xbaH\x05r\x03\x18\x80\bR\vdescription\x12O\n" + - "\x06fields\x18\x03 \x03(\v2-.saas.accounts.v1.ModuleAuditFieldDeclarationB\b\xbaH\x05\x92\x01\x02\x10 R\x06fields\"\xc2\x01\n" + + "\x06fields\x18\x03 \x03(\v2-.saas.accounts.v1.ModuleAuditFieldDeclarationB\b\xbaH\x05\x92\x01\x02\x10 R\x06fields\x12V\n" + + "\n" + + "visibility\x18\x04 \x01(\x0e2,.saas.accounts.v1.ModuleAuditEventVisibilityB\b\xbaH\x05\x82\x01\x02\x10\x01R\n" + + "visibility\"\xc2\x01\n" + "#ModuleDeclareAuditEventTypesRequest\x12F\n" + "\x06prefix\x18\x01 \x01(\tB.\xbaH+r)\x10\x01\x18\x80\x012\"^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$R\x06prefix\x12S\n" + "\x05types\x18\x02 \x03(\v21.saas.accounts.v1.ModuleAuditEventTypeDeclarationB\n" + @@ -4355,7 +4566,13 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\xbaH\ar\x05\x10\x01\x18\x80\x04R\n" + "resourceId\">\n" + "\x19ModulePlaceRecordResponse\x12!\n" + - "\anode_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06nodeId\"\xa7\x01\n" + + "\anode_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06nodeId\"w\n" + + "'VerifyWorkContextRuntimeBoundaryRequest\x12L\n" + + "\x1cforwarded_work_context_token\x18\x01 \x01(\tB\v\xbaH\br\x06\x10\x01\x18\x80\x80\x02R\x19forwardedWorkContextToken\"h\n" + + "(VerifyWorkContextRuntimeBoundaryResponse\x12\x1b\n" + + "\ttenant_id\x18\x01 \x01(\tR\btenantId\x12\x1f\n" + + "\vboundary_id\x18\x02 \x01(\tR\n" + + "boundaryId\"\xa7\x01\n" + "#CheckWorkContextRecordAccessRequest\x12/\n" + "\rresource_type\x18\x01 \x01(\tB\n" + "\xbaH\ar\x05\x10\x01\x18\x80\x02R\fresourceType\x12+\n" + @@ -4371,13 +4588,15 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\n" + "binding_id\x18\x01 \x01(\tB\n" + "\xbaH\ar\x05\x10\x01\x18\x80\x01R\tbindingId\x12F\n" + - "\x19parent_work_context_token\x18\x02 \x01(\tB\v\xbaH\br\x06\x10\x01\x18\x80\x80\x02R\x16parentWorkContextToken\"\xbc\x01\n" + + "\x19parent_work_context_token\x18\x02 \x01(\tB\v\xbaH\br\x06\x10\x01\x18\x80\x80\x02R\x16parentWorkContextToken\"\xb9\x03\n" + "/ModuleExchangeDelegatedOperationAudienceRequest\x12)\n" + "\n" + "binding_id\x18\x01 \x01(\tB\n" + - "\xbaH\ar\x05\x10\x01\x18\x80\x01R\tbindingId\x12F\n" + - "\x19parent_work_context_token\x18\x02 \x01(\tB\v\xbaH\br\x06\x10\x01\x18\x80\x80\x02R\x16parentWorkContextToken\x12\x16\n" + - "\x06lookup\x18\x03 \x01(\bR\x06lookup*\xb8\x02\n" + + "\xbaH\ar\x05\x10\x01\x18\x80\x01R\tbindingId\x12D\n" + + "\x19parent_work_context_token\x18\x02 \x01(\tB\t\xbaH\x06r\x04\x18\x80\x80\x02R\x16parentWorkContextToken\x12\x16\n" + + "\x06lookup\x18\x03 \x01(\bR\x06lookup\x120\n" + + "\rdelegation_id\x18\x04 \x01(\tB\v\xbaH\b\xd8\x01\x01r\x03\xb0\x01\x01R\fdelegationId:\xca\x01\xbaH\xc6\x01\x1a\xc3\x01\n" + + "3exchange_delegated_operation_audience.one_authority\x12Fexactly one of parent_work_context_token and delegation_id is required\x1aD(this.parent_work_context_token != '') != (this.delegation_id != '')*\xb8\x02\n" + "\x14ModuleAuditFieldKind\x12'\n" + "#MODULE_AUDIT_FIELD_KIND_UNSPECIFIED\x10\x00\x12\"\n" + "\x1eMODULE_AUDIT_FIELD_KIND_STRING\x10\x01\x12 \n" + @@ -4386,7 +4605,11 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x1eMODULE_AUDIT_FIELD_KIND_NUMBER\x10\x04\x12 \n" + "\x1cMODULE_AUDIT_FIELD_KIND_BOOL\x10\x05\x12 \n" + "\x1cMODULE_AUDIT_FIELD_KIND_ENUM\x10\x06\x12(\n" + - "$MODULE_AUDIT_FIELD_KIND_STRING_ARRAY\x10\a*\xdc\x01\n" + + "$MODULE_AUDIT_FIELD_KIND_STRING_ARRAY\x10\a*\xa1\x01\n" + + "\x1aModuleAuditEventVisibility\x12-\n" + + ")MODULE_AUDIT_EVENT_VISIBILITY_UNSPECIFIED\x10\x00\x12(\n" + + "$MODULE_AUDIT_EVENT_VISIBILITY_TENANT\x10\x01\x12*\n" + + "&MODULE_AUDIT_EVENT_VISIBILITY_EXTERNAL\x10\x02*\xdc\x01\n" + "\x1aDatasourceItemReadersBasis\x12-\n" + ")DATASOURCE_ITEM_READERS_BASIS_UNSPECIFIED\x10\x00\x12,\n" + "(DATASOURCE_ITEM_READERS_BASIS_TRANSLATED\x10\x01\x12/\n" + @@ -4402,12 +4625,13 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x1cMETADATA_DISCLOSURE_WITHHELD\x10\x02*\\\n" + "\x0fSourceSyncStage\x12!\n" + "\x1dSOURCE_SYNC_STAGE_UNSPECIFIED\x10\x00\x12&\n" + - "\"SOURCE_SYNC_STAGE_CHANGES_ENQUEUED\x10\x012\xd1#\n" + + "\"SOURCE_SYNC_STAGE_CHANGES_ENQUEUED\x10\x012\x87%\n" + "\x19ModuleCapabilitiesService\x12\xc5\x01\n" + "\x1dExchangeDelegatedReadAudience\x12<.saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest\x1a#.saas.accounts.v1.IssuedWorkContext\"A\xc2\xf3\x18=\b\x03\x10\x010\x01:+\n" + "'saas.module.delegated_audience_exchange\x10\x04@\x01H\aP\x04X\x04`\x01\x12\xcf\x01\n" + "\"ExchangeDelegatedOperationAudience\x12A.saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest\x1a#.saas.accounts.v1.IssuedWorkContext\"A\xc2\xf3\x18=\b\x03\x10\x010\x01:+\n" + - "'saas.module.delegated_audience_exchange\x10\x04@\x01H\aP\x04X\x04`\x01\x12\xa7\x01\n" + + "'saas.module.delegated_audience_exchange\x10\x04@\x01H\aP\x04X\x04`\x01\x12\xb3\x01\n" + + " VerifyWorkContextRuntimeBoundary\x129.saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest\x1a:.saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x04X\x03`\x01\x12\xa7\x01\n" + "\x1cCheckWorkContextRecordAccess\x125.saas.accounts.v1.CheckWorkContextRecordAccessRequest\x1a6.saas.accounts.v1.CheckWorkContextRecordAccessResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\xaa\x01\n" + "\x1dListReadableSourceCollections\x126.saas.accounts.v1.ListReadableSourceCollectionsRequest\x1a7.saas.accounts.v1.ListReadableSourceCollectionsResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\x80\x01\n" + "\vPlaceRecord\x12*.saas.accounts.v1.ModulePlaceRecordRequest\x1a+.saas.accounts.v1.ModulePlaceRecordResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12}\n" + @@ -4459,208 +4683,214 @@ func file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP() []byte { return file_saas_accounts_v1_module_capabilities_proto_rawDescData } -var file_saas_accounts_v1_module_capabilities_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_saas_accounts_v1_module_capabilities_proto_msgTypes = make([]protoimpl.MessageInfo, 56) +var file_saas_accounts_v1_module_capabilities_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_saas_accounts_v1_module_capabilities_proto_msgTypes = make([]protoimpl.MessageInfo, 58) var file_saas_accounts_v1_module_capabilities_proto_goTypes = []any{ (ModuleAuditFieldKind)(0), // 0: saas.accounts.v1.ModuleAuditFieldKind - (DatasourceItemReadersBasis)(0), // 1: saas.accounts.v1.DatasourceItemReadersBasis - (EventDelivery)(0), // 2: saas.accounts.v1.EventDelivery - (MetadataDisclosure)(0), // 3: saas.accounts.v1.MetadataDisclosure - (SourceSyncStage)(0), // 4: saas.accounts.v1.SourceSyncStage - (*ModuleEnqueueJobRequest)(nil), // 5: saas.accounts.v1.ModuleEnqueueJobRequest - (*ModuleEnqueueJobResponse)(nil), // 6: saas.accounts.v1.ModuleEnqueueJobResponse - (*ModuleClaimJobsRequest)(nil), // 7: saas.accounts.v1.ModuleClaimJobsRequest - (*ModuleClaimJobsResponse)(nil), // 8: saas.accounts.v1.ModuleClaimJobsResponse - (*ModuleHeartbeatJobRequest)(nil), // 9: saas.accounts.v1.ModuleHeartbeatJobRequest - (*ModuleHeartbeatJobResponse)(nil), // 10: saas.accounts.v1.ModuleHeartbeatJobResponse - (*ModuleAckJobRequest)(nil), // 11: saas.accounts.v1.ModuleAckJobRequest - (*ModuleNackJobRequest)(nil), // 12: saas.accounts.v1.ModuleNackJobRequest - (*ModuleNotifyUserRequest)(nil), // 13: saas.accounts.v1.ModuleNotifyUserRequest - (*ModuleNotifyUserResponse)(nil), // 14: saas.accounts.v1.ModuleNotifyUserResponse - (*ModuleNotifyOrgAdminsRequest)(nil), // 15: saas.accounts.v1.ModuleNotifyOrgAdminsRequest - (*ModuleNotifyOrgAdminsResponse)(nil), // 16: saas.accounts.v1.ModuleNotifyOrgAdminsResponse - (*ModuleApprovalPolicy)(nil), // 17: saas.accounts.v1.ModuleApprovalPolicy - (*ModuleResumeRef)(nil), // 18: saas.accounts.v1.ModuleResumeRef - (*ModuleRequestApprovalRequest)(nil), // 19: saas.accounts.v1.ModuleRequestApprovalRequest - (*ModuleRequestApprovalResponse)(nil), // 20: saas.accounts.v1.ModuleRequestApprovalResponse - (*ModuleGetApprovalRequest)(nil), // 21: saas.accounts.v1.ModuleGetApprovalRequest - (*ModuleApproval)(nil), // 22: saas.accounts.v1.ModuleApproval - (*ModuleCancelApprovalRequest)(nil), // 23: saas.accounts.v1.ModuleCancelApprovalRequest - (*ModuleEmitAuditEventRequest)(nil), // 24: saas.accounts.v1.ModuleEmitAuditEventRequest - (*ModuleAuditFieldDeclaration)(nil), // 25: saas.accounts.v1.ModuleAuditFieldDeclaration - (*ModuleAuditEventTypeDeclaration)(nil), // 26: saas.accounts.v1.ModuleAuditEventTypeDeclaration - (*ModuleDeclareAuditEventTypesRequest)(nil), // 27: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest - (*ModuleDeclareAuditEventTypesResponse)(nil), // 28: saas.accounts.v1.ModuleDeclareAuditEventTypesResponse - (*SubjectVisibilityGrant)(nil), // 29: saas.accounts.v1.SubjectVisibilityGrant - (*ModuleListSubjectVisibilityRequest)(nil), // 30: saas.accounts.v1.ModuleListSubjectVisibilityRequest - (*ModuleListSubjectVisibilityResponse)(nil), // 31: saas.accounts.v1.ModuleListSubjectVisibilityResponse - (*FetchDatasourceBlobRequest)(nil), // 32: saas.accounts.v1.FetchDatasourceBlobRequest - (*FetchDatasourceBlobChunk)(nil), // 33: saas.accounts.v1.FetchDatasourceBlobChunk - (*DatasourceFileRef)(nil), // 34: saas.accounts.v1.DatasourceFileRef - (*FetchDatasourceFilesRequest)(nil), // 35: saas.accounts.v1.FetchDatasourceFilesRequest - (*DatasourceProvenance)(nil), // 36: saas.accounts.v1.DatasourceProvenance - (*DatasourceItemReaders)(nil), // 37: saas.accounts.v1.DatasourceItemReaders - (*DatasourceFileHeader)(nil), // 38: saas.accounts.v1.DatasourceFileHeader - (*FetchDatasourceFilesFrame)(nil), // 39: saas.accounts.v1.FetchDatasourceFilesFrame - (*ModulePublishEventRequest)(nil), // 40: saas.accounts.v1.ModulePublishEventRequest - (*ModulePublishEventResponse)(nil), // 41: saas.accounts.v1.ModulePublishEventResponse - (*ModuleSubscribeRequest)(nil), // 42: saas.accounts.v1.ModuleSubscribeRequest - (*ModuleSubscription)(nil), // 43: saas.accounts.v1.ModuleSubscription - (*ModuleSubscribeResponse)(nil), // 44: saas.accounts.v1.ModuleSubscribeResponse - (*ModuleUnsubscribeRequest)(nil), // 45: saas.accounts.v1.ModuleUnsubscribeRequest - (*ModuleListSubscriptionsRequest)(nil), // 46: saas.accounts.v1.ModuleListSubscriptionsRequest - (*ModuleListSubscriptionsResponse)(nil), // 47: saas.accounts.v1.ModuleListSubscriptionsResponse - (*ModuleReplayEventsRequest)(nil), // 48: saas.accounts.v1.ModuleReplayEventsRequest - (*ModuleReplayEventsResponse)(nil), // 49: saas.accounts.v1.ModuleReplayEventsResponse - (*ReadableSourceCollection)(nil), // 50: saas.accounts.v1.ReadableSourceCollection - (*ReadableCollectionGrant)(nil), // 51: saas.accounts.v1.ReadableCollectionGrant - (*CollectionSyncProvenance)(nil), // 52: saas.accounts.v1.CollectionSyncProvenance - (*ListReadableSourceCollectionsRequest)(nil), // 53: saas.accounts.v1.ListReadableSourceCollectionsRequest - (*ListReadableSourceCollectionsResponse)(nil), // 54: saas.accounts.v1.ListReadableSourceCollectionsResponse - (*ModulePlaceRecordRequest)(nil), // 55: saas.accounts.v1.ModulePlaceRecordRequest - (*ModulePlaceRecordResponse)(nil), // 56: saas.accounts.v1.ModulePlaceRecordResponse - (*CheckWorkContextRecordAccessRequest)(nil), // 57: saas.accounts.v1.CheckWorkContextRecordAccessRequest - (*CheckWorkContextRecordAccessResponse)(nil), // 58: saas.accounts.v1.CheckWorkContextRecordAccessResponse - (*ModuleExchangeDelegatedReadAudienceRequest)(nil), // 59: saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest - (*ModuleExchangeDelegatedOperationAudienceRequest)(nil), // 60: saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest - (*v1.NewJob)(nil), // 61: saas.jobs.v1.NewJob - (v1.JobEnqueueDisposition)(0), // 62: saas.jobs.v1.JobEnqueueDisposition - (*durationpb.Duration)(nil), // 63: google.protobuf.Duration - (*v1.JobEnvelope)(nil), // 64: saas.jobs.v1.JobEnvelope - (*v1.JobLeaseReference)(nil), // 65: saas.jobs.v1.JobLeaseReference - (*v1.JobLease)(nil), // 66: saas.jobs.v1.JobLease - (*v1.JobFailure)(nil), // 67: saas.jobs.v1.JobFailure - (*timestamppb.Timestamp)(nil), // 68: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 69: google.protobuf.Struct - (*v11.EventEnvelope)(nil), // 70: saas.events.v1.EventEnvelope - (*ModuleMintRegistrationRequest)(nil), // 71: saas.accounts.v1.ModuleMintRegistrationRequest - (*SolutionMintRegistrationRequest)(nil), // 72: saas.accounts.v1.SolutionMintRegistrationRequest - (*ModuleMintWorkContextRequest)(nil), // 73: saas.accounts.v1.ModuleMintWorkContextRequest - (*ModuleMintOperationContextRequest)(nil), // 74: saas.accounts.v1.ModuleMintOperationContextRequest - (*ModuleMintSourceOperationContextRequest)(nil), // 75: saas.accounts.v1.ModuleMintSourceOperationContextRequest - (*IssuedWorkContext)(nil), // 76: saas.accounts.v1.IssuedWorkContext - (*emptypb.Empty)(nil), // 77: google.protobuf.Empty - (*ModuleMintRegistrationResponse)(nil), // 78: saas.accounts.v1.ModuleMintRegistrationResponse - (*SolutionMintRegistrationResponse)(nil), // 79: saas.accounts.v1.SolutionMintRegistrationResponse - (*ModuleMintWorkContextResponse)(nil), // 80: saas.accounts.v1.ModuleMintWorkContextResponse - (*ModuleMintOperationContextResponse)(nil), // 81: saas.accounts.v1.ModuleMintOperationContextResponse - (*ModuleMintSourceOperationContextResponse)(nil), // 82: saas.accounts.v1.ModuleMintSourceOperationContextResponse + (ModuleAuditEventVisibility)(0), // 1: saas.accounts.v1.ModuleAuditEventVisibility + (DatasourceItemReadersBasis)(0), // 2: saas.accounts.v1.DatasourceItemReadersBasis + (EventDelivery)(0), // 3: saas.accounts.v1.EventDelivery + (MetadataDisclosure)(0), // 4: saas.accounts.v1.MetadataDisclosure + (SourceSyncStage)(0), // 5: saas.accounts.v1.SourceSyncStage + (*ModuleEnqueueJobRequest)(nil), // 6: saas.accounts.v1.ModuleEnqueueJobRequest + (*ModuleEnqueueJobResponse)(nil), // 7: saas.accounts.v1.ModuleEnqueueJobResponse + (*ModuleClaimJobsRequest)(nil), // 8: saas.accounts.v1.ModuleClaimJobsRequest + (*ModuleClaimJobsResponse)(nil), // 9: saas.accounts.v1.ModuleClaimJobsResponse + (*ModuleHeartbeatJobRequest)(nil), // 10: saas.accounts.v1.ModuleHeartbeatJobRequest + (*ModuleHeartbeatJobResponse)(nil), // 11: saas.accounts.v1.ModuleHeartbeatJobResponse + (*ModuleAckJobRequest)(nil), // 12: saas.accounts.v1.ModuleAckJobRequest + (*ModuleNackJobRequest)(nil), // 13: saas.accounts.v1.ModuleNackJobRequest + (*ModuleNotifyUserRequest)(nil), // 14: saas.accounts.v1.ModuleNotifyUserRequest + (*ModuleNotifyUserResponse)(nil), // 15: saas.accounts.v1.ModuleNotifyUserResponse + (*ModuleNotifyOrgAdminsRequest)(nil), // 16: saas.accounts.v1.ModuleNotifyOrgAdminsRequest + (*ModuleNotifyOrgAdminsResponse)(nil), // 17: saas.accounts.v1.ModuleNotifyOrgAdminsResponse + (*ModuleApprovalPolicy)(nil), // 18: saas.accounts.v1.ModuleApprovalPolicy + (*ModuleResumeRef)(nil), // 19: saas.accounts.v1.ModuleResumeRef + (*ModuleRequestApprovalRequest)(nil), // 20: saas.accounts.v1.ModuleRequestApprovalRequest + (*ModuleRequestApprovalResponse)(nil), // 21: saas.accounts.v1.ModuleRequestApprovalResponse + (*ModuleGetApprovalRequest)(nil), // 22: saas.accounts.v1.ModuleGetApprovalRequest + (*ModuleApproval)(nil), // 23: saas.accounts.v1.ModuleApproval + (*ModuleCancelApprovalRequest)(nil), // 24: saas.accounts.v1.ModuleCancelApprovalRequest + (*ModuleEmitAuditEventRequest)(nil), // 25: saas.accounts.v1.ModuleEmitAuditEventRequest + (*ModuleAuditFieldDeclaration)(nil), // 26: saas.accounts.v1.ModuleAuditFieldDeclaration + (*ModuleAuditEventTypeDeclaration)(nil), // 27: saas.accounts.v1.ModuleAuditEventTypeDeclaration + (*ModuleDeclareAuditEventTypesRequest)(nil), // 28: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest + (*ModuleDeclareAuditEventTypesResponse)(nil), // 29: saas.accounts.v1.ModuleDeclareAuditEventTypesResponse + (*SubjectVisibilityGrant)(nil), // 30: saas.accounts.v1.SubjectVisibilityGrant + (*ModuleListSubjectVisibilityRequest)(nil), // 31: saas.accounts.v1.ModuleListSubjectVisibilityRequest + (*ModuleListSubjectVisibilityResponse)(nil), // 32: saas.accounts.v1.ModuleListSubjectVisibilityResponse + (*FetchDatasourceBlobRequest)(nil), // 33: saas.accounts.v1.FetchDatasourceBlobRequest + (*FetchDatasourceBlobChunk)(nil), // 34: saas.accounts.v1.FetchDatasourceBlobChunk + (*DatasourceFileRef)(nil), // 35: saas.accounts.v1.DatasourceFileRef + (*FetchDatasourceFilesRequest)(nil), // 36: saas.accounts.v1.FetchDatasourceFilesRequest + (*DatasourceProvenance)(nil), // 37: saas.accounts.v1.DatasourceProvenance + (*DatasourceItemReaders)(nil), // 38: saas.accounts.v1.DatasourceItemReaders + (*DatasourceFileHeader)(nil), // 39: saas.accounts.v1.DatasourceFileHeader + (*FetchDatasourceFilesFrame)(nil), // 40: saas.accounts.v1.FetchDatasourceFilesFrame + (*ModulePublishEventRequest)(nil), // 41: saas.accounts.v1.ModulePublishEventRequest + (*ModulePublishEventResponse)(nil), // 42: saas.accounts.v1.ModulePublishEventResponse + (*ModuleSubscribeRequest)(nil), // 43: saas.accounts.v1.ModuleSubscribeRequest + (*ModuleSubscription)(nil), // 44: saas.accounts.v1.ModuleSubscription + (*ModuleSubscribeResponse)(nil), // 45: saas.accounts.v1.ModuleSubscribeResponse + (*ModuleUnsubscribeRequest)(nil), // 46: saas.accounts.v1.ModuleUnsubscribeRequest + (*ModuleListSubscriptionsRequest)(nil), // 47: saas.accounts.v1.ModuleListSubscriptionsRequest + (*ModuleListSubscriptionsResponse)(nil), // 48: saas.accounts.v1.ModuleListSubscriptionsResponse + (*ModuleReplayEventsRequest)(nil), // 49: saas.accounts.v1.ModuleReplayEventsRequest + (*ModuleReplayEventsResponse)(nil), // 50: saas.accounts.v1.ModuleReplayEventsResponse + (*ReadableSourceCollection)(nil), // 51: saas.accounts.v1.ReadableSourceCollection + (*ReadableCollectionGrant)(nil), // 52: saas.accounts.v1.ReadableCollectionGrant + (*CollectionSyncProvenance)(nil), // 53: saas.accounts.v1.CollectionSyncProvenance + (*ListReadableSourceCollectionsRequest)(nil), // 54: saas.accounts.v1.ListReadableSourceCollectionsRequest + (*ListReadableSourceCollectionsResponse)(nil), // 55: saas.accounts.v1.ListReadableSourceCollectionsResponse + (*ModulePlaceRecordRequest)(nil), // 56: saas.accounts.v1.ModulePlaceRecordRequest + (*ModulePlaceRecordResponse)(nil), // 57: saas.accounts.v1.ModulePlaceRecordResponse + (*VerifyWorkContextRuntimeBoundaryRequest)(nil), // 58: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest + (*VerifyWorkContextRuntimeBoundaryResponse)(nil), // 59: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse + (*CheckWorkContextRecordAccessRequest)(nil), // 60: saas.accounts.v1.CheckWorkContextRecordAccessRequest + (*CheckWorkContextRecordAccessResponse)(nil), // 61: saas.accounts.v1.CheckWorkContextRecordAccessResponse + (*ModuleExchangeDelegatedReadAudienceRequest)(nil), // 62: saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest + (*ModuleExchangeDelegatedOperationAudienceRequest)(nil), // 63: saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest + (*v1.NewJob)(nil), // 64: saas.jobs.v1.NewJob + (v1.JobEnqueueDisposition)(0), // 65: saas.jobs.v1.JobEnqueueDisposition + (*durationpb.Duration)(nil), // 66: google.protobuf.Duration + (*v1.JobEnvelope)(nil), // 67: saas.jobs.v1.JobEnvelope + (*v1.JobLeaseReference)(nil), // 68: saas.jobs.v1.JobLeaseReference + (*v1.JobLease)(nil), // 69: saas.jobs.v1.JobLease + (*v1.JobFailure)(nil), // 70: saas.jobs.v1.JobFailure + (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 72: google.protobuf.Struct + (*v11.EventEnvelope)(nil), // 73: saas.events.v1.EventEnvelope + (*ModuleMintRegistrationRequest)(nil), // 74: saas.accounts.v1.ModuleMintRegistrationRequest + (*SolutionMintRegistrationRequest)(nil), // 75: saas.accounts.v1.SolutionMintRegistrationRequest + (*ModuleMintWorkContextRequest)(nil), // 76: saas.accounts.v1.ModuleMintWorkContextRequest + (*ModuleMintOperationContextRequest)(nil), // 77: saas.accounts.v1.ModuleMintOperationContextRequest + (*ModuleMintSourceOperationContextRequest)(nil), // 78: saas.accounts.v1.ModuleMintSourceOperationContextRequest + (*IssuedWorkContext)(nil), // 79: saas.accounts.v1.IssuedWorkContext + (*emptypb.Empty)(nil), // 80: google.protobuf.Empty + (*ModuleMintRegistrationResponse)(nil), // 81: saas.accounts.v1.ModuleMintRegistrationResponse + (*SolutionMintRegistrationResponse)(nil), // 82: saas.accounts.v1.SolutionMintRegistrationResponse + (*ModuleMintWorkContextResponse)(nil), // 83: saas.accounts.v1.ModuleMintWorkContextResponse + (*ModuleMintOperationContextResponse)(nil), // 84: saas.accounts.v1.ModuleMintOperationContextResponse + (*ModuleMintSourceOperationContextResponse)(nil), // 85: saas.accounts.v1.ModuleMintSourceOperationContextResponse } var file_saas_accounts_v1_module_capabilities_proto_depIdxs = []int32{ - 61, // 0: saas.accounts.v1.ModuleEnqueueJobRequest.job:type_name -> saas.jobs.v1.NewJob - 62, // 1: saas.accounts.v1.ModuleEnqueueJobResponse.disposition:type_name -> saas.jobs.v1.JobEnqueueDisposition - 63, // 2: saas.accounts.v1.ModuleClaimJobsRequest.lease_duration:type_name -> google.protobuf.Duration - 64, // 3: saas.accounts.v1.ModuleClaimJobsResponse.jobs:type_name -> saas.jobs.v1.JobEnvelope - 65, // 4: saas.accounts.v1.ModuleHeartbeatJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 63, // 5: saas.accounts.v1.ModuleHeartbeatJobRequest.extension:type_name -> google.protobuf.Duration - 66, // 6: saas.accounts.v1.ModuleHeartbeatJobResponse.lease:type_name -> saas.jobs.v1.JobLease - 65, // 7: saas.accounts.v1.ModuleAckJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 65, // 8: saas.accounts.v1.ModuleNackJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 67, // 9: saas.accounts.v1.ModuleNackJobRequest.failure:type_name -> saas.jobs.v1.JobFailure - 68, // 10: saas.accounts.v1.ModuleNackJobRequest.retry_at:type_name -> google.protobuf.Timestamp - 69, // 11: saas.accounts.v1.ModuleResumeRef.payload:type_name -> google.protobuf.Struct - 69, // 12: saas.accounts.v1.ModuleRequestApprovalRequest.subject:type_name -> google.protobuf.Struct - 17, // 13: saas.accounts.v1.ModuleRequestApprovalRequest.policy:type_name -> saas.accounts.v1.ModuleApprovalPolicy - 18, // 14: saas.accounts.v1.ModuleRequestApprovalRequest.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef - 68, // 15: saas.accounts.v1.ModuleRequestApprovalRequest.expires_at:type_name -> google.protobuf.Timestamp - 68, // 16: saas.accounts.v1.ModuleRequestApprovalRequest.escalate_at:type_name -> google.protobuf.Timestamp - 69, // 17: saas.accounts.v1.ModuleApproval.subject:type_name -> google.protobuf.Struct - 18, // 18: saas.accounts.v1.ModuleApproval.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef - 68, // 19: saas.accounts.v1.ModuleApproval.expires_at:type_name -> google.protobuf.Timestamp - 68, // 20: saas.accounts.v1.ModuleApproval.escalate_at:type_name -> google.protobuf.Timestamp - 68, // 21: saas.accounts.v1.ModuleApproval.created_at:type_name -> google.protobuf.Timestamp - 69, // 22: saas.accounts.v1.ModuleEmitAuditEventRequest.fields:type_name -> google.protobuf.Struct + 64, // 0: saas.accounts.v1.ModuleEnqueueJobRequest.job:type_name -> saas.jobs.v1.NewJob + 65, // 1: saas.accounts.v1.ModuleEnqueueJobResponse.disposition:type_name -> saas.jobs.v1.JobEnqueueDisposition + 66, // 2: saas.accounts.v1.ModuleClaimJobsRequest.lease_duration:type_name -> google.protobuf.Duration + 67, // 3: saas.accounts.v1.ModuleClaimJobsResponse.jobs:type_name -> saas.jobs.v1.JobEnvelope + 68, // 4: saas.accounts.v1.ModuleHeartbeatJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 66, // 5: saas.accounts.v1.ModuleHeartbeatJobRequest.extension:type_name -> google.protobuf.Duration + 69, // 6: saas.accounts.v1.ModuleHeartbeatJobResponse.lease:type_name -> saas.jobs.v1.JobLease + 68, // 7: saas.accounts.v1.ModuleAckJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 68, // 8: saas.accounts.v1.ModuleNackJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 70, // 9: saas.accounts.v1.ModuleNackJobRequest.failure:type_name -> saas.jobs.v1.JobFailure + 71, // 10: saas.accounts.v1.ModuleNackJobRequest.retry_at:type_name -> google.protobuf.Timestamp + 72, // 11: saas.accounts.v1.ModuleResumeRef.payload:type_name -> google.protobuf.Struct + 72, // 12: saas.accounts.v1.ModuleRequestApprovalRequest.subject:type_name -> google.protobuf.Struct + 18, // 13: saas.accounts.v1.ModuleRequestApprovalRequest.policy:type_name -> saas.accounts.v1.ModuleApprovalPolicy + 19, // 14: saas.accounts.v1.ModuleRequestApprovalRequest.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef + 71, // 15: saas.accounts.v1.ModuleRequestApprovalRequest.expires_at:type_name -> google.protobuf.Timestamp + 71, // 16: saas.accounts.v1.ModuleRequestApprovalRequest.escalate_at:type_name -> google.protobuf.Timestamp + 72, // 17: saas.accounts.v1.ModuleApproval.subject:type_name -> google.protobuf.Struct + 19, // 18: saas.accounts.v1.ModuleApproval.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef + 71, // 19: saas.accounts.v1.ModuleApproval.expires_at:type_name -> google.protobuf.Timestamp + 71, // 20: saas.accounts.v1.ModuleApproval.escalate_at:type_name -> google.protobuf.Timestamp + 71, // 21: saas.accounts.v1.ModuleApproval.created_at:type_name -> google.protobuf.Timestamp + 72, // 22: saas.accounts.v1.ModuleEmitAuditEventRequest.fields:type_name -> google.protobuf.Struct 0, // 23: saas.accounts.v1.ModuleAuditFieldDeclaration.kind:type_name -> saas.accounts.v1.ModuleAuditFieldKind - 25, // 24: saas.accounts.v1.ModuleAuditEventTypeDeclaration.fields:type_name -> saas.accounts.v1.ModuleAuditFieldDeclaration - 26, // 25: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest.types:type_name -> saas.accounts.v1.ModuleAuditEventTypeDeclaration - 68, // 26: saas.accounts.v1.SubjectVisibilityGrant.expires_at:type_name -> google.protobuf.Timestamp - 29, // 27: saas.accounts.v1.ModuleListSubjectVisibilityResponse.grants:type_name -> saas.accounts.v1.SubjectVisibilityGrant - 34, // 28: saas.accounts.v1.FetchDatasourceFilesRequest.files:type_name -> saas.accounts.v1.DatasourceFileRef - 1, // 29: saas.accounts.v1.DatasourceItemReaders.basis:type_name -> saas.accounts.v1.DatasourceItemReadersBasis - 36, // 30: saas.accounts.v1.DatasourceFileHeader.provenance:type_name -> saas.accounts.v1.DatasourceProvenance - 37, // 31: saas.accounts.v1.DatasourceFileHeader.readers:type_name -> saas.accounts.v1.DatasourceItemReaders - 38, // 32: saas.accounts.v1.FetchDatasourceFilesFrame.header:type_name -> saas.accounts.v1.DatasourceFileHeader - 70, // 33: saas.accounts.v1.ModulePublishEventRequest.envelope:type_name -> saas.events.v1.EventEnvelope - 2, // 34: saas.accounts.v1.ModuleSubscribeRequest.delivery:type_name -> saas.accounts.v1.EventDelivery - 2, // 35: saas.accounts.v1.ModuleSubscription.delivery:type_name -> saas.accounts.v1.EventDelivery - 68, // 36: saas.accounts.v1.ModuleSubscription.created_at:type_name -> google.protobuf.Timestamp - 43, // 37: saas.accounts.v1.ModuleSubscribeResponse.subscription:type_name -> saas.accounts.v1.ModuleSubscription - 43, // 38: saas.accounts.v1.ModuleListSubscriptionsResponse.subscriptions:type_name -> saas.accounts.v1.ModuleSubscription - 68, // 39: saas.accounts.v1.ModuleReplayEventsRequest.since:type_name -> google.protobuf.Timestamp - 3, // 40: saas.accounts.v1.ReadableSourceCollection.grant_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure - 51, // 41: saas.accounts.v1.ReadableSourceCollection.read_grants:type_name -> saas.accounts.v1.ReadableCollectionGrant - 52, // 42: saas.accounts.v1.ReadableSourceCollection.sync:type_name -> saas.accounts.v1.CollectionSyncProvenance - 68, // 43: saas.accounts.v1.ReadableCollectionGrant.expires_at:type_name -> google.protobuf.Timestamp - 4, // 44: saas.accounts.v1.CollectionSyncProvenance.stage:type_name -> saas.accounts.v1.SourceSyncStage - 68, // 45: saas.accounts.v1.CollectionSyncProvenance.at:type_name -> google.protobuf.Timestamp - 3, // 46: saas.accounts.v1.CollectionSyncProvenance.requester_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure - 68, // 47: saas.accounts.v1.CollectionSyncProvenance.requested_at:type_name -> google.protobuf.Timestamp - 50, // 48: saas.accounts.v1.ListReadableSourceCollectionsResponse.collections:type_name -> saas.accounts.v1.ReadableSourceCollection - 59, // 49: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest - 60, // 50: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest - 57, // 51: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:input_type -> saas.accounts.v1.CheckWorkContextRecordAccessRequest - 53, // 52: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:input_type -> saas.accounts.v1.ListReadableSourceCollectionsRequest - 55, // 53: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:input_type -> saas.accounts.v1.ModulePlaceRecordRequest - 5, // 54: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:input_type -> saas.accounts.v1.ModuleEnqueueJobRequest - 7, // 55: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:input_type -> saas.accounts.v1.ModuleClaimJobsRequest - 9, // 56: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:input_type -> saas.accounts.v1.ModuleHeartbeatJobRequest - 11, // 57: saas.accounts.v1.ModuleCapabilitiesService.AckJob:input_type -> saas.accounts.v1.ModuleAckJobRequest - 12, // 58: saas.accounts.v1.ModuleCapabilitiesService.NackJob:input_type -> saas.accounts.v1.ModuleNackJobRequest - 13, // 59: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:input_type -> saas.accounts.v1.ModuleNotifyUserRequest - 15, // 60: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:input_type -> saas.accounts.v1.ModuleNotifyOrgAdminsRequest - 19, // 61: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:input_type -> saas.accounts.v1.ModuleRequestApprovalRequest - 21, // 62: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:input_type -> saas.accounts.v1.ModuleGetApprovalRequest - 23, // 63: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:input_type -> saas.accounts.v1.ModuleCancelApprovalRequest - 24, // 64: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:input_type -> saas.accounts.v1.ModuleEmitAuditEventRequest - 27, // 65: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:input_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesRequest - 30, // 66: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:input_type -> saas.accounts.v1.ModuleListSubjectVisibilityRequest - 32, // 67: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:input_type -> saas.accounts.v1.FetchDatasourceBlobRequest - 35, // 68: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:input_type -> saas.accounts.v1.FetchDatasourceFilesRequest - 71, // 69: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:input_type -> saas.accounts.v1.ModuleMintRegistrationRequest - 72, // 70: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:input_type -> saas.accounts.v1.SolutionMintRegistrationRequest - 73, // 71: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:input_type -> saas.accounts.v1.ModuleMintWorkContextRequest - 74, // 72: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:input_type -> saas.accounts.v1.ModuleMintOperationContextRequest - 75, // 73: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:input_type -> saas.accounts.v1.ModuleMintSourceOperationContextRequest - 40, // 74: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:input_type -> saas.accounts.v1.ModulePublishEventRequest - 42, // 75: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:input_type -> saas.accounts.v1.ModuleSubscribeRequest - 45, // 76: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:input_type -> saas.accounts.v1.ModuleUnsubscribeRequest - 46, // 77: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:input_type -> saas.accounts.v1.ModuleListSubscriptionsRequest - 48, // 78: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:input_type -> saas.accounts.v1.ModuleReplayEventsRequest - 76, // 79: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:output_type -> saas.accounts.v1.IssuedWorkContext - 76, // 80: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:output_type -> saas.accounts.v1.IssuedWorkContext - 58, // 81: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:output_type -> saas.accounts.v1.CheckWorkContextRecordAccessResponse - 54, // 82: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:output_type -> saas.accounts.v1.ListReadableSourceCollectionsResponse - 56, // 83: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:output_type -> saas.accounts.v1.ModulePlaceRecordResponse - 6, // 84: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:output_type -> saas.accounts.v1.ModuleEnqueueJobResponse - 8, // 85: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:output_type -> saas.accounts.v1.ModuleClaimJobsResponse - 10, // 86: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:output_type -> saas.accounts.v1.ModuleHeartbeatJobResponse - 77, // 87: saas.accounts.v1.ModuleCapabilitiesService.AckJob:output_type -> google.protobuf.Empty - 77, // 88: saas.accounts.v1.ModuleCapabilitiesService.NackJob:output_type -> google.protobuf.Empty - 14, // 89: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:output_type -> saas.accounts.v1.ModuleNotifyUserResponse - 16, // 90: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:output_type -> saas.accounts.v1.ModuleNotifyOrgAdminsResponse - 20, // 91: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:output_type -> saas.accounts.v1.ModuleRequestApprovalResponse - 22, // 92: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:output_type -> saas.accounts.v1.ModuleApproval - 77, // 93: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:output_type -> google.protobuf.Empty - 77, // 94: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:output_type -> google.protobuf.Empty - 28, // 95: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:output_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesResponse - 31, // 96: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:output_type -> saas.accounts.v1.ModuleListSubjectVisibilityResponse - 33, // 97: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:output_type -> saas.accounts.v1.FetchDatasourceBlobChunk - 39, // 98: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:output_type -> saas.accounts.v1.FetchDatasourceFilesFrame - 78, // 99: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:output_type -> saas.accounts.v1.ModuleMintRegistrationResponse - 79, // 100: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:output_type -> saas.accounts.v1.SolutionMintRegistrationResponse - 80, // 101: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:output_type -> saas.accounts.v1.ModuleMintWorkContextResponse - 81, // 102: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:output_type -> saas.accounts.v1.ModuleMintOperationContextResponse - 82, // 103: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:output_type -> saas.accounts.v1.ModuleMintSourceOperationContextResponse - 41, // 104: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:output_type -> saas.accounts.v1.ModulePublishEventResponse - 44, // 105: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:output_type -> saas.accounts.v1.ModuleSubscribeResponse - 77, // 106: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:output_type -> google.protobuf.Empty - 47, // 107: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:output_type -> saas.accounts.v1.ModuleListSubscriptionsResponse - 49, // 108: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:output_type -> saas.accounts.v1.ModuleReplayEventsResponse - 79, // [79:109] is the sub-list for method output_type - 49, // [49:79] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 26, // 24: saas.accounts.v1.ModuleAuditEventTypeDeclaration.fields:type_name -> saas.accounts.v1.ModuleAuditFieldDeclaration + 1, // 25: saas.accounts.v1.ModuleAuditEventTypeDeclaration.visibility:type_name -> saas.accounts.v1.ModuleAuditEventVisibility + 27, // 26: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest.types:type_name -> saas.accounts.v1.ModuleAuditEventTypeDeclaration + 71, // 27: saas.accounts.v1.SubjectVisibilityGrant.expires_at:type_name -> google.protobuf.Timestamp + 30, // 28: saas.accounts.v1.ModuleListSubjectVisibilityResponse.grants:type_name -> saas.accounts.v1.SubjectVisibilityGrant + 35, // 29: saas.accounts.v1.FetchDatasourceFilesRequest.files:type_name -> saas.accounts.v1.DatasourceFileRef + 2, // 30: saas.accounts.v1.DatasourceItemReaders.basis:type_name -> saas.accounts.v1.DatasourceItemReadersBasis + 37, // 31: saas.accounts.v1.DatasourceFileHeader.provenance:type_name -> saas.accounts.v1.DatasourceProvenance + 38, // 32: saas.accounts.v1.DatasourceFileHeader.readers:type_name -> saas.accounts.v1.DatasourceItemReaders + 39, // 33: saas.accounts.v1.FetchDatasourceFilesFrame.header:type_name -> saas.accounts.v1.DatasourceFileHeader + 73, // 34: saas.accounts.v1.ModulePublishEventRequest.envelope:type_name -> saas.events.v1.EventEnvelope + 3, // 35: saas.accounts.v1.ModuleSubscribeRequest.delivery:type_name -> saas.accounts.v1.EventDelivery + 3, // 36: saas.accounts.v1.ModuleSubscription.delivery:type_name -> saas.accounts.v1.EventDelivery + 71, // 37: saas.accounts.v1.ModuleSubscription.created_at:type_name -> google.protobuf.Timestamp + 44, // 38: saas.accounts.v1.ModuleSubscribeResponse.subscription:type_name -> saas.accounts.v1.ModuleSubscription + 44, // 39: saas.accounts.v1.ModuleListSubscriptionsResponse.subscriptions:type_name -> saas.accounts.v1.ModuleSubscription + 71, // 40: saas.accounts.v1.ModuleReplayEventsRequest.since:type_name -> google.protobuf.Timestamp + 4, // 41: saas.accounts.v1.ReadableSourceCollection.grant_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure + 52, // 42: saas.accounts.v1.ReadableSourceCollection.read_grants:type_name -> saas.accounts.v1.ReadableCollectionGrant + 53, // 43: saas.accounts.v1.ReadableSourceCollection.sync:type_name -> saas.accounts.v1.CollectionSyncProvenance + 71, // 44: saas.accounts.v1.ReadableCollectionGrant.expires_at:type_name -> google.protobuf.Timestamp + 5, // 45: saas.accounts.v1.CollectionSyncProvenance.stage:type_name -> saas.accounts.v1.SourceSyncStage + 71, // 46: saas.accounts.v1.CollectionSyncProvenance.at:type_name -> google.protobuf.Timestamp + 4, // 47: saas.accounts.v1.CollectionSyncProvenance.requester_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure + 71, // 48: saas.accounts.v1.CollectionSyncProvenance.requested_at:type_name -> google.protobuf.Timestamp + 51, // 49: saas.accounts.v1.ListReadableSourceCollectionsResponse.collections:type_name -> saas.accounts.v1.ReadableSourceCollection + 62, // 50: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest + 63, // 51: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest + 58, // 52: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:input_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest + 60, // 53: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:input_type -> saas.accounts.v1.CheckWorkContextRecordAccessRequest + 54, // 54: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:input_type -> saas.accounts.v1.ListReadableSourceCollectionsRequest + 56, // 55: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:input_type -> saas.accounts.v1.ModulePlaceRecordRequest + 6, // 56: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:input_type -> saas.accounts.v1.ModuleEnqueueJobRequest + 8, // 57: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:input_type -> saas.accounts.v1.ModuleClaimJobsRequest + 10, // 58: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:input_type -> saas.accounts.v1.ModuleHeartbeatJobRequest + 12, // 59: saas.accounts.v1.ModuleCapabilitiesService.AckJob:input_type -> saas.accounts.v1.ModuleAckJobRequest + 13, // 60: saas.accounts.v1.ModuleCapabilitiesService.NackJob:input_type -> saas.accounts.v1.ModuleNackJobRequest + 14, // 61: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:input_type -> saas.accounts.v1.ModuleNotifyUserRequest + 16, // 62: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:input_type -> saas.accounts.v1.ModuleNotifyOrgAdminsRequest + 20, // 63: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:input_type -> saas.accounts.v1.ModuleRequestApprovalRequest + 22, // 64: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:input_type -> saas.accounts.v1.ModuleGetApprovalRequest + 24, // 65: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:input_type -> saas.accounts.v1.ModuleCancelApprovalRequest + 25, // 66: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:input_type -> saas.accounts.v1.ModuleEmitAuditEventRequest + 28, // 67: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:input_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesRequest + 31, // 68: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:input_type -> saas.accounts.v1.ModuleListSubjectVisibilityRequest + 33, // 69: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:input_type -> saas.accounts.v1.FetchDatasourceBlobRequest + 36, // 70: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:input_type -> saas.accounts.v1.FetchDatasourceFilesRequest + 74, // 71: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:input_type -> saas.accounts.v1.ModuleMintRegistrationRequest + 75, // 72: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:input_type -> saas.accounts.v1.SolutionMintRegistrationRequest + 76, // 73: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:input_type -> saas.accounts.v1.ModuleMintWorkContextRequest + 77, // 74: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:input_type -> saas.accounts.v1.ModuleMintOperationContextRequest + 78, // 75: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:input_type -> saas.accounts.v1.ModuleMintSourceOperationContextRequest + 41, // 76: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:input_type -> saas.accounts.v1.ModulePublishEventRequest + 43, // 77: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:input_type -> saas.accounts.v1.ModuleSubscribeRequest + 46, // 78: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:input_type -> saas.accounts.v1.ModuleUnsubscribeRequest + 47, // 79: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:input_type -> saas.accounts.v1.ModuleListSubscriptionsRequest + 49, // 80: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:input_type -> saas.accounts.v1.ModuleReplayEventsRequest + 79, // 81: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:output_type -> saas.accounts.v1.IssuedWorkContext + 79, // 82: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:output_type -> saas.accounts.v1.IssuedWorkContext + 59, // 83: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:output_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse + 61, // 84: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:output_type -> saas.accounts.v1.CheckWorkContextRecordAccessResponse + 55, // 85: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:output_type -> saas.accounts.v1.ListReadableSourceCollectionsResponse + 57, // 86: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:output_type -> saas.accounts.v1.ModulePlaceRecordResponse + 7, // 87: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:output_type -> saas.accounts.v1.ModuleEnqueueJobResponse + 9, // 88: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:output_type -> saas.accounts.v1.ModuleClaimJobsResponse + 11, // 89: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:output_type -> saas.accounts.v1.ModuleHeartbeatJobResponse + 80, // 90: saas.accounts.v1.ModuleCapabilitiesService.AckJob:output_type -> google.protobuf.Empty + 80, // 91: saas.accounts.v1.ModuleCapabilitiesService.NackJob:output_type -> google.protobuf.Empty + 15, // 92: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:output_type -> saas.accounts.v1.ModuleNotifyUserResponse + 17, // 93: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:output_type -> saas.accounts.v1.ModuleNotifyOrgAdminsResponse + 21, // 94: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:output_type -> saas.accounts.v1.ModuleRequestApprovalResponse + 23, // 95: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:output_type -> saas.accounts.v1.ModuleApproval + 80, // 96: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:output_type -> google.protobuf.Empty + 80, // 97: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:output_type -> google.protobuf.Empty + 29, // 98: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:output_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesResponse + 32, // 99: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:output_type -> saas.accounts.v1.ModuleListSubjectVisibilityResponse + 34, // 100: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:output_type -> saas.accounts.v1.FetchDatasourceBlobChunk + 40, // 101: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:output_type -> saas.accounts.v1.FetchDatasourceFilesFrame + 81, // 102: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:output_type -> saas.accounts.v1.ModuleMintRegistrationResponse + 82, // 103: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:output_type -> saas.accounts.v1.SolutionMintRegistrationResponse + 83, // 104: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:output_type -> saas.accounts.v1.ModuleMintWorkContextResponse + 84, // 105: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:output_type -> saas.accounts.v1.ModuleMintOperationContextResponse + 85, // 106: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:output_type -> saas.accounts.v1.ModuleMintSourceOperationContextResponse + 42, // 107: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:output_type -> saas.accounts.v1.ModulePublishEventResponse + 45, // 108: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:output_type -> saas.accounts.v1.ModuleSubscribeResponse + 80, // 109: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:output_type -> google.protobuf.Empty + 48, // 110: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:output_type -> saas.accounts.v1.ModuleListSubscriptionsResponse + 50, // 111: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:output_type -> saas.accounts.v1.ModuleReplayEventsResponse + 81, // [81:112] is the sub-list for method output_type + 50, // [50:81] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_saas_accounts_v1_module_capabilities_proto_init() } @@ -4679,8 +4909,8 @@ func file_saas_accounts_v1_module_capabilities_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_module_capabilities_proto_rawDesc), len(file_saas_accounts_v1_module_capabilities_proto_rawDesc)), - NumEnums: 5, - NumMessages: 56, + NumEnums: 6, + NumMessages: 58, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/saas/accounts/v1/organizations.pb.go b/gen/saas/accounts/v1/organizations.pb.go index ef6955b..419c1a6 100644 --- a/gen/saas/accounts/v1/organizations.pb.go +++ b/gen/saas/accounts/v1/organizations.pb.go @@ -384,9 +384,12 @@ func (x *UpdateOrgSettingsRequest) GetFaviconUrl() string { } type CreateOrganizationRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` + // The user who owns the new organization. Only a platform administrator may + // name someone else; empty means the caller. + OwnerUserId string `protobuf:"bytes,3,opt,name=owner_user_id,json=ownerUserId,proto3" json:"owner_user_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -435,6 +438,13 @@ func (x *CreateOrganizationRequest) GetSlug() string { return "" } +func (x *CreateOrganizationRequest) GetOwnerUserId() string { + if x != nil { + return x.OwnerUserId + } + return "" +} + type CreateOrganizationResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` @@ -562,6 +572,9 @@ func (*ListOrganizationsRequest) Descriptor() ([]byte, []int) { type ListOrganizationsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Organizations []*Organization `protobuf:"bytes,1,rep,name=organizations,proto3" json:"organizations,omitempty"` + // Whether the caller may create an organization under the deployment's + // creation policy. The UI offers "Create organization" only when true. + CanCreate bool `protobuf:"varint,2,opt,name=can_create,json=canCreate,proto3" json:"can_create,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -603,6 +616,172 @@ func (x *ListOrganizationsResponse) GetOrganizations() []*Organization { return nil } +func (x *ListOrganizationsResponse) GetCanCreate() bool { + if x != nil { + return x.CanCreate + } + return false +} + +type UpdateOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateOrganizationRequest) Reset() { + *x = UpdateOrganizationRequest{} + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[11] + 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_saas_accounts_v1_organizations_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 UpdateOrganizationRequest.ProtoReflect.Descriptor instead. +func (*UpdateOrganizationRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{11} +} + +func (x *UpdateOrganizationRequest) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *UpdateOrganizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateOrganizationRequest) GetSlug() string { + if x != nil { + return x.Slug + } + return "" +} + +type LeaveOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LeaveOrganizationRequest) Reset() { + *x = LeaveOrganizationRequest{} + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LeaveOrganizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LeaveOrganizationRequest) ProtoMessage() {} + +func (x *LeaveOrganizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_organizations_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 LeaveOrganizationRequest.ProtoReflect.Descriptor instead. +func (*LeaveOrganizationRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{12} +} + +func (x *LeaveOrganizationRequest) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +type DeleteOrganizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + // The organization's current slug, typed by the person deleting it. A + // mismatch is refused, so a stale or mistaken id cannot delete the wrong + // organization. + ConfirmSlug string `protobuf:"bytes,2,opt,name=confirm_slug,json=confirmSlug,proto3" json:"confirm_slug,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteOrganizationRequest) Reset() { + *x = DeleteOrganizationRequest{} + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[13] + 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_saas_accounts_v1_organizations_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 DeleteOrganizationRequest.ProtoReflect.Descriptor instead. +func (*DeleteOrganizationRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{13} +} + +func (x *DeleteOrganizationRequest) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *DeleteOrganizationRequest) GetConfirmSlug() string { + if x != nil { + return x.ConfirmSlug + } + return "" +} + type AddOrgMemberRequest struct { state protoimpl.MessageState `protogen:"open.v1"` OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` @@ -614,7 +793,7 @@ type AddOrgMemberRequest struct { func (x *AddOrgMemberRequest) Reset() { *x = AddOrgMemberRequest{} - mi := &file_saas_accounts_v1_organizations_proto_msgTypes[11] + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -626,7 +805,7 @@ func (x *AddOrgMemberRequest) String() string { func (*AddOrgMemberRequest) ProtoMessage() {} func (x *AddOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_organizations_proto_msgTypes[11] + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -639,7 +818,7 @@ func (x *AddOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddOrgMemberRequest.ProtoReflect.Descriptor instead. func (*AddOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{11} + return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{14} } func (x *AddOrgMemberRequest) GetOrgId() string { @@ -673,7 +852,7 @@ type RemoveOrgMemberRequest struct { func (x *RemoveOrgMemberRequest) Reset() { *x = RemoveOrgMemberRequest{} - mi := &file_saas_accounts_v1_organizations_proto_msgTypes[12] + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +864,7 @@ func (x *RemoveOrgMemberRequest) String() string { func (*RemoveOrgMemberRequest) ProtoMessage() {} func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_organizations_proto_msgTypes[12] + mi := &file_saas_accounts_v1_organizations_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +877,7 @@ func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrgMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{12} + return file_saas_accounts_v1_organizations_proto_rawDescGZIP(), []int{15} } func (x *RemoveOrgMemberRequest) GetOrgId() string { @@ -744,24 +923,36 @@ const file_saas_accounts_v1_organizations_proto_rawDesc = "" + "\rprimary_color\x18\x03 \x01(\tB\x1b\xbaH\x18r\x162\x14^(|#[0-9A-Fa-f]{6})$R\fprimaryColor\x12f\n" + "\rcustom_domain\x18\x04 \x01(\tBA\xbaH>r<\x18\xfd\x0127^(|([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63})$R\fcustomDomain\x12>\n" + "\vfavicon_url\x18\x05 \x01(\tB\x1d\xbaH\x1ar\x18\x18\x80\x102\x13^(|https://[^\\s]+)$R\n" + - "faviconUrl\"u\n" + + "faviconUrl\"\xa6\x01\n" + "\x19CreateOrganizationRequest\x12\x1b\n" + "\x04name\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12;\n" + - "\x04slug\x18\x02 \x01(\tB'\xbaH$r\"\x10\x01\x18?2\x1c^[a-z0-9][a-z0-9-]*[a-z0-9]$R\x04slug\"`\n" + + "\x04slug\x18\x02 \x01(\tB'\xbaH$r\"\x10\x01\x18?2\x1c^[a-z0-9][a-z0-9-]*[a-z0-9]$R\x04slug\x12/\n" + + "\rowner_user_id\x18\x03 \x01(\tB\v\xbaH\b\xd8\x01\x01r\x03\xb0\x01\x01R\vownerUserId\"`\n" + "\x1aCreateOrganizationResponse\x12B\n" + "\forganization\x18\x01 \x01(\v2\x1e.saas.accounts.v1.OrganizationR\forganization\"2\n" + "\x16GetOrganizationRequest\x12\x18\n" + "\x02id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x1a\n" + - "\x18ListOrganizationsRequest\"a\n" + + "\x18ListOrganizationsRequest\"\x80\x01\n" + "\x19ListOrganizationsResponse\x12D\n" + - "\rorganizations\x18\x01 \x03(\v2\x1e.saas.accounts.v1.OrganizationR\rorganizations\"\x88\x01\n" + + "\rorganizations\x18\x01 \x03(\v2\x1e.saas.accounts.v1.OrganizationR\rorganizations\x12\x1d\n" + + "\n" + + "can_create\x18\x02 \x01(\bR\tcanCreate\"\x96\x01\n" + + "\x19UpdateOrganizationRequest\x12\x1f\n" + + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12\x1b\n" + + "\x04name\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12;\n" + + "\x04slug\x18\x03 \x01(\tB'\xbaH$r\"\x10\x01\x18?2\x1c^[a-z0-9][a-z0-9-]*[a-z0-9]$R\x04slug\";\n" + + "\x18LeaveOrganizationRequest\x12\x1f\n" + + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\"h\n" + + "\x19DeleteOrganizationRequest\x12\x1f\n" + + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12*\n" + + "\fconfirm_slug\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\vconfirmSlug\"\x88\x01\n" + "\x13AddOrgMemberRequest\x12\x1f\n" + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12!\n" + "\auser_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06userId\x12-\n" + "\x04role\x18\x03 \x01(\x0e2\x19.saas.accounts.v1.OrgRoleR\x04role\"\\\n" + "\x16RemoveOrgMemberRequest\x12\x1f\n" + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12!\n" + - "\auser_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06userId2\x99\x0f\n" + + "\auser_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06userId2\xeb\x12\n" + "\x13OrganizationService\x12\xb7\x01\n" + "\x12CreateOrganization\x12+.saas.accounts.v1.CreateOrganizationRequest\x1a,.saas.accounts.v1.CreateOrganizationResponse\"F\xc2\xf3\x18&\b\x02\x10\x020\x01:\x14\n" + "\x10saas.org.created\x10\x02@\x01H\x04P\x03X\x03`\x01\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/v1/organizations\x12\x9d\x01\n" + @@ -773,7 +964,16 @@ const file_saas_accounts_v1_organizations_proto_rawDesc = "" + "\x15saas.org.member_added\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x82\xd3\xe4\x93\x02':\x01*\"\"/v1/organizations/{org_id}/members\x12\xc7\x01\n" + "\fRemoveMember\x12(.saas.accounts.v1.RemoveOrgMemberRequest\x1a\x16.google.protobuf.Empty\"u\xc2\xf3\x18=\b\x02\x10\x04*\f\n" + "\x06org_id\x10\x02\x18\x010\x01:\x1b\n" + - "\x17saas.org.member_removed\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x82\xd3\xe4\x93\x02.*,/v1/organizations/{org_id}/members/{user_id}\x12\xb2\x01\n" + + "\x17saas.org.member_removed\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x82\xd3\xe4\x93\x02.*,/v1/organizations/{org_id}/members/{user_id}\x12\x9d\x01\n" + + "\x12UpdateOrganization\x12+.saas.accounts.v1.UpdateOrganizationRequest\x1a\x1e.saas.accounts.v1.Organization\":\xc2\xf3\x186\b\x02\x10\x04*\f\n" + + "\x06org_id\x10\x02\x18\x010\x01:\x14\n" + + "\x10saas.org.updated\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x12\x97\x01\n" + + "\x11LeaveOrganization\x12*.saas.accounts.v1.LeaveOrganizationRequest\x1a\x16.google.protobuf.Empty\">\xc2\xf3\x18:\b\x02\x10\x03*\f\n" + + "\x06org_id\x10\x02\x18\x010\x01:\x18\n" + + "\x14saas.org.member_left\x10\x02@\x01H\x04P\x03X\x03`\x01x\x02\x12\x95\x01\n" + + "\x12DeleteOrganization\x12+.saas.accounts.v1.DeleteOrganizationRequest\x1a\x16.google.protobuf.Empty\":\xc2\xf3\x186\b\x02\x10\x04*\f\n" + + "\x06org_id\x10\x02\x18\x010\x04:\x14\n" + + "\x10saas.org.deleted\x10\x02@\x01H\x05P\x03X\x03`\x01x\x02\x12\xb2\x01\n" + "\vListMembers\x12'.saas.accounts.v1.ListOrgMembersRequest\x1a(.saas.accounts.v1.ListOrgMembersResponse\"P\xc2\xf3\x18\"\b\x02\x10\x03*\f\n" + "\x06org_id\x10\x02\x18\x010\x01:\x02\x10\x01@\x01H\x03P\x03X\x03`\x01\x82\xd3\xe4\x93\x02$\x12\"/v1/organizations/{org_id}/members\x12\xab\x01\n" + "\x0eGetOrgSettings\x12'.saas.accounts.v1.GetOrgSettingsRequest\x1a\x1d.saas.accounts.v1.OrgSettings\"Q\xc2\xf3\x18\"\b\x02\x10\x03*\f\n" + @@ -800,7 +1000,7 @@ func file_saas_accounts_v1_organizations_proto_rawDescGZIP() []byte { return file_saas_accounts_v1_organizations_proto_rawDescData } -var file_saas_accounts_v1_organizations_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_saas_accounts_v1_organizations_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_saas_accounts_v1_organizations_proto_goTypes = []any{ (*OrgSettings)(nil), // 0: saas.accounts.v1.OrgSettings (*OrganizationSettings)(nil), // 1: saas.accounts.v1.OrganizationSettings @@ -813,45 +1013,54 @@ var file_saas_accounts_v1_organizations_proto_goTypes = []any{ (*GetOrganizationRequest)(nil), // 8: saas.accounts.v1.GetOrganizationRequest (*ListOrganizationsRequest)(nil), // 9: saas.accounts.v1.ListOrganizationsRequest (*ListOrganizationsResponse)(nil), // 10: saas.accounts.v1.ListOrganizationsResponse - (*AddOrgMemberRequest)(nil), // 11: saas.accounts.v1.AddOrgMemberRequest - (*RemoveOrgMemberRequest)(nil), // 12: saas.accounts.v1.RemoveOrgMemberRequest - (*v1.Settings)(nil), // 13: saas.composed.org_settings.v1.Settings - (*fieldmaskpb.FieldMask)(nil), // 14: google.protobuf.FieldMask - (*Organization)(nil), // 15: saas.accounts.v1.Organization - (OrgRole)(0), // 16: saas.accounts.v1.OrgRole - (*ListOrgMembersRequest)(nil), // 17: saas.accounts.v1.ListOrgMembersRequest - (*emptypb.Empty)(nil), // 18: google.protobuf.Empty - (*ListOrgMembersResponse)(nil), // 19: saas.accounts.v1.ListOrgMembersResponse + (*UpdateOrganizationRequest)(nil), // 11: saas.accounts.v1.UpdateOrganizationRequest + (*LeaveOrganizationRequest)(nil), // 12: saas.accounts.v1.LeaveOrganizationRequest + (*DeleteOrganizationRequest)(nil), // 13: saas.accounts.v1.DeleteOrganizationRequest + (*AddOrgMemberRequest)(nil), // 14: saas.accounts.v1.AddOrgMemberRequest + (*RemoveOrgMemberRequest)(nil), // 15: saas.accounts.v1.RemoveOrgMemberRequest + (*v1.Settings)(nil), // 16: saas.composed.org_settings.v1.Settings + (*fieldmaskpb.FieldMask)(nil), // 17: google.protobuf.FieldMask + (*Organization)(nil), // 18: saas.accounts.v1.Organization + (OrgRole)(0), // 19: saas.accounts.v1.OrgRole + (*ListOrgMembersRequest)(nil), // 20: saas.accounts.v1.ListOrgMembersRequest + (*emptypb.Empty)(nil), // 21: google.protobuf.Empty + (*ListOrgMembersResponse)(nil), // 22: saas.accounts.v1.ListOrgMembersResponse } var file_saas_accounts_v1_organizations_proto_depIdxs = []int32{ - 13, // 0: saas.accounts.v1.OrganizationSettings.composed:type_name -> saas.composed.org_settings.v1.Settings + 16, // 0: saas.accounts.v1.OrganizationSettings.composed:type_name -> saas.composed.org_settings.v1.Settings 1, // 1: saas.accounts.v1.UpdateOrganizationSettingsRequest.patch:type_name -> saas.accounts.v1.OrganizationSettings - 14, // 2: saas.accounts.v1.UpdateOrganizationSettingsRequest.clear_mask:type_name -> google.protobuf.FieldMask - 15, // 3: saas.accounts.v1.CreateOrganizationResponse.organization:type_name -> saas.accounts.v1.Organization - 15, // 4: saas.accounts.v1.ListOrganizationsResponse.organizations:type_name -> saas.accounts.v1.Organization - 16, // 5: saas.accounts.v1.AddOrgMemberRequest.role:type_name -> saas.accounts.v1.OrgRole + 17, // 2: saas.accounts.v1.UpdateOrganizationSettingsRequest.clear_mask:type_name -> google.protobuf.FieldMask + 18, // 3: saas.accounts.v1.CreateOrganizationResponse.organization:type_name -> saas.accounts.v1.Organization + 18, // 4: saas.accounts.v1.ListOrganizationsResponse.organizations:type_name -> saas.accounts.v1.Organization + 19, // 5: saas.accounts.v1.AddOrgMemberRequest.role:type_name -> saas.accounts.v1.OrgRole 6, // 6: saas.accounts.v1.OrganizationService.CreateOrganization:input_type -> saas.accounts.v1.CreateOrganizationRequest 8, // 7: saas.accounts.v1.OrganizationService.GetOrganization:input_type -> saas.accounts.v1.GetOrganizationRequest 9, // 8: saas.accounts.v1.OrganizationService.ListOrganizations:input_type -> saas.accounts.v1.ListOrganizationsRequest - 11, // 9: saas.accounts.v1.OrganizationService.AddMember:input_type -> saas.accounts.v1.AddOrgMemberRequest - 12, // 10: saas.accounts.v1.OrganizationService.RemoveMember:input_type -> saas.accounts.v1.RemoveOrgMemberRequest - 17, // 11: saas.accounts.v1.OrganizationService.ListMembers:input_type -> saas.accounts.v1.ListOrgMembersRequest - 4, // 12: saas.accounts.v1.OrganizationService.GetOrgSettings:input_type -> saas.accounts.v1.GetOrgSettingsRequest - 5, // 13: saas.accounts.v1.OrganizationService.UpdateOrgSettings:input_type -> saas.accounts.v1.UpdateOrgSettingsRequest - 2, // 14: saas.accounts.v1.OrganizationService.GetOrganizationSettings:input_type -> saas.accounts.v1.GetOrganizationSettingsRequest - 3, // 15: saas.accounts.v1.OrganizationService.UpdateOrganizationSettings:input_type -> saas.accounts.v1.UpdateOrganizationSettingsRequest - 7, // 16: saas.accounts.v1.OrganizationService.CreateOrganization:output_type -> saas.accounts.v1.CreateOrganizationResponse - 15, // 17: saas.accounts.v1.OrganizationService.GetOrganization:output_type -> saas.accounts.v1.Organization - 10, // 18: saas.accounts.v1.OrganizationService.ListOrganizations:output_type -> saas.accounts.v1.ListOrganizationsResponse - 18, // 19: saas.accounts.v1.OrganizationService.AddMember:output_type -> google.protobuf.Empty - 18, // 20: saas.accounts.v1.OrganizationService.RemoveMember:output_type -> google.protobuf.Empty - 19, // 21: saas.accounts.v1.OrganizationService.ListMembers:output_type -> saas.accounts.v1.ListOrgMembersResponse - 0, // 22: saas.accounts.v1.OrganizationService.GetOrgSettings:output_type -> saas.accounts.v1.OrgSettings - 0, // 23: saas.accounts.v1.OrganizationService.UpdateOrgSettings:output_type -> saas.accounts.v1.OrgSettings - 1, // 24: saas.accounts.v1.OrganizationService.GetOrganizationSettings:output_type -> saas.accounts.v1.OrganizationSettings - 1, // 25: saas.accounts.v1.OrganizationService.UpdateOrganizationSettings:output_type -> saas.accounts.v1.OrganizationSettings - 16, // [16:26] is the sub-list for method output_type - 6, // [6:16] is the sub-list for method input_type + 14, // 9: saas.accounts.v1.OrganizationService.AddMember:input_type -> saas.accounts.v1.AddOrgMemberRequest + 15, // 10: saas.accounts.v1.OrganizationService.RemoveMember:input_type -> saas.accounts.v1.RemoveOrgMemberRequest + 11, // 11: saas.accounts.v1.OrganizationService.UpdateOrganization:input_type -> saas.accounts.v1.UpdateOrganizationRequest + 12, // 12: saas.accounts.v1.OrganizationService.LeaveOrganization:input_type -> saas.accounts.v1.LeaveOrganizationRequest + 13, // 13: saas.accounts.v1.OrganizationService.DeleteOrganization:input_type -> saas.accounts.v1.DeleteOrganizationRequest + 20, // 14: saas.accounts.v1.OrganizationService.ListMembers:input_type -> saas.accounts.v1.ListOrgMembersRequest + 4, // 15: saas.accounts.v1.OrganizationService.GetOrgSettings:input_type -> saas.accounts.v1.GetOrgSettingsRequest + 5, // 16: saas.accounts.v1.OrganizationService.UpdateOrgSettings:input_type -> saas.accounts.v1.UpdateOrgSettingsRequest + 2, // 17: saas.accounts.v1.OrganizationService.GetOrganizationSettings:input_type -> saas.accounts.v1.GetOrganizationSettingsRequest + 3, // 18: saas.accounts.v1.OrganizationService.UpdateOrganizationSettings:input_type -> saas.accounts.v1.UpdateOrganizationSettingsRequest + 7, // 19: saas.accounts.v1.OrganizationService.CreateOrganization:output_type -> saas.accounts.v1.CreateOrganizationResponse + 18, // 20: saas.accounts.v1.OrganizationService.GetOrganization:output_type -> saas.accounts.v1.Organization + 10, // 21: saas.accounts.v1.OrganizationService.ListOrganizations:output_type -> saas.accounts.v1.ListOrganizationsResponse + 21, // 22: saas.accounts.v1.OrganizationService.AddMember:output_type -> google.protobuf.Empty + 21, // 23: saas.accounts.v1.OrganizationService.RemoveMember:output_type -> google.protobuf.Empty + 18, // 24: saas.accounts.v1.OrganizationService.UpdateOrganization:output_type -> saas.accounts.v1.Organization + 21, // 25: saas.accounts.v1.OrganizationService.LeaveOrganization:output_type -> google.protobuf.Empty + 21, // 26: saas.accounts.v1.OrganizationService.DeleteOrganization:output_type -> google.protobuf.Empty + 22, // 27: saas.accounts.v1.OrganizationService.ListMembers:output_type -> saas.accounts.v1.ListOrgMembersResponse + 0, // 28: saas.accounts.v1.OrganizationService.GetOrgSettings:output_type -> saas.accounts.v1.OrgSettings + 0, // 29: saas.accounts.v1.OrganizationService.UpdateOrgSettings:output_type -> saas.accounts.v1.OrgSettings + 1, // 30: saas.accounts.v1.OrganizationService.GetOrganizationSettings:output_type -> saas.accounts.v1.OrganizationSettings + 1, // 31: saas.accounts.v1.OrganizationService.UpdateOrganizationSettings:output_type -> saas.accounts.v1.OrganizationSettings + 19, // [19:32] is the sub-list for method output_type + 6, // [6:19] is the sub-list for method input_type 6, // [6:6] is the sub-list for extension type_name 6, // [6:6] is the sub-list for extension extendee 0, // [0:6] is the sub-list for field type_name @@ -870,7 +1079,7 @@ func file_saas_accounts_v1_organizations_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_organizations_proto_rawDesc), len(file_saas_accounts_v1_organizations_proto_rawDesc)), NumEnums: 0, - NumMessages: 13, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/saas/accounts/v1/platform_admin.pb.go b/gen/saas/accounts/v1/platform_admin.pb.go index c8a1fd9..89c4ee3 100644 --- a/gen/saas/accounts/v1/platform_admin.pb.go +++ b/gen/saas/accounts/v1/platform_admin.pb.go @@ -28,6 +28,179 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// CatalogueEntryKind distinguishes a composed module from a solution. +type CatalogueEntryKind int32 + +const ( + CatalogueEntryKind_CATALOGUE_ENTRY_KIND_UNSPECIFIED CatalogueEntryKind = 0 + // A module composed into this deployment, known by its module principal. + CatalogueEntryKind_CATALOGUE_ENTRY_KIND_MODULE CatalogueEntryKind = 1 + // A solution, known by its registration, its installations, or both. + CatalogueEntryKind_CATALOGUE_ENTRY_KIND_SOLUTION CatalogueEntryKind = 2 +) + +// Enum value maps for CatalogueEntryKind. +var ( + CatalogueEntryKind_name = map[int32]string{ + 0: "CATALOGUE_ENTRY_KIND_UNSPECIFIED", + 1: "CATALOGUE_ENTRY_KIND_MODULE", + 2: "CATALOGUE_ENTRY_KIND_SOLUTION", + } + CatalogueEntryKind_value = map[string]int32{ + "CATALOGUE_ENTRY_KIND_UNSPECIFIED": 0, + "CATALOGUE_ENTRY_KIND_MODULE": 1, + "CATALOGUE_ENTRY_KIND_SOLUTION": 2, + } +) + +func (x CatalogueEntryKind) Enum() *CatalogueEntryKind { + p := new(CatalogueEntryKind) + *p = x + return p +} + +func (x CatalogueEntryKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CatalogueEntryKind) Descriptor() protoreflect.EnumDescriptor { + return file_saas_accounts_v1_platform_admin_proto_enumTypes[0].Descriptor() +} + +func (CatalogueEntryKind) Type() protoreflect.EnumType { + return &file_saas_accounts_v1_platform_admin_proto_enumTypes[0] +} + +func (x CatalogueEntryKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CatalogueEntryKind.Descriptor instead. +func (CatalogueEntryKind) EnumDescriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{0} +} + +// CatalogueGapReason says why a Catalogue fact has no value. +type CatalogueGapReason int32 + +const ( + CatalogueGapReason_CATALOGUE_GAP_REASON_UNSPECIFIED CatalogueGapReason = 0 + // This host keeps no record that carries the fact. + CatalogueGapReason_CATALOGUE_GAP_REASON_NOT_RECORDED CatalogueGapReason = 1 + // The fact is a section of the producer's document, and the document this + // host holds carries no such section (an older producer). + CatalogueGapReason_CATALOGUE_GAP_REASON_NOT_REPORTED CatalogueGapReason = 2 + // The fact needs observed cluster state, and this host has none to read — + // a local run with no cluster, or an observation that is missing or stale. + CatalogueGapReason_CATALOGUE_GAP_REASON_NOT_OBSERVED CatalogueGapReason = 3 +) + +// Enum value maps for CatalogueGapReason. +var ( + CatalogueGapReason_name = map[int32]string{ + 0: "CATALOGUE_GAP_REASON_UNSPECIFIED", + 1: "CATALOGUE_GAP_REASON_NOT_RECORDED", + 2: "CATALOGUE_GAP_REASON_NOT_REPORTED", + 3: "CATALOGUE_GAP_REASON_NOT_OBSERVED", + } + CatalogueGapReason_value = map[string]int32{ + "CATALOGUE_GAP_REASON_UNSPECIFIED": 0, + "CATALOGUE_GAP_REASON_NOT_RECORDED": 1, + "CATALOGUE_GAP_REASON_NOT_REPORTED": 2, + "CATALOGUE_GAP_REASON_NOT_OBSERVED": 3, + } +) + +func (x CatalogueGapReason) Enum() *CatalogueGapReason { + p := new(CatalogueGapReason) + *p = x + return p +} + +func (x CatalogueGapReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CatalogueGapReason) Descriptor() protoreflect.EnumDescriptor { + return file_saas_accounts_v1_platform_admin_proto_enumTypes[1].Descriptor() +} + +func (CatalogueGapReason) Type() protoreflect.EnumType { + return &file_saas_accounts_v1_platform_admin_proto_enumTypes[1] +} + +func (x CatalogueGapReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CatalogueGapReason.Descriptor instead. +func (CatalogueGapReason) EnumDescriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{1} +} + +// CatalogueObservedVerdict judges what runs against what is authorized — +// never against what is declared, because only authorization admits execution. +type CatalogueObservedVerdict int32 + +const ( + CatalogueObservedVerdict_CATALOGUE_OBSERVED_VERDICT_UNSPECIFIED CatalogueObservedVerdict = 0 + // Every container of the approved inventory member runs its approved image + // digest, no other container runs, the incarnation is the approved one, and + // the observation that says so is dated and current. This is the only verdict + // a reader acts on by doing nothing, so it is the only one that requires + // complete, current evidence: see the verdict field below. + CatalogueObservedVerdict_CATALOGUE_OBSERVED_VERDICT_RUNNING_AUTHORIZED CatalogueObservedVerdict = 1 + // Something other than the approved execution is running: what cluster + // admission refuses. + CatalogueObservedVerdict_CATALOGUE_OBSERVED_VERDICT_RUNNING_DIFFERS CatalogueObservedVerdict = 2 + // Something is running with no current authorization at all: what the + // retirement sweep exists to stop. + CatalogueObservedVerdict_CATALOGUE_OBSERVED_VERDICT_RUNNING_UNAUTHORIZED CatalogueObservedVerdict = 3 +) + +// Enum value maps for CatalogueObservedVerdict. +var ( + CatalogueObservedVerdict_name = map[int32]string{ + 0: "CATALOGUE_OBSERVED_VERDICT_UNSPECIFIED", + 1: "CATALOGUE_OBSERVED_VERDICT_RUNNING_AUTHORIZED", + 2: "CATALOGUE_OBSERVED_VERDICT_RUNNING_DIFFERS", + 3: "CATALOGUE_OBSERVED_VERDICT_RUNNING_UNAUTHORIZED", + } + CatalogueObservedVerdict_value = map[string]int32{ + "CATALOGUE_OBSERVED_VERDICT_UNSPECIFIED": 0, + "CATALOGUE_OBSERVED_VERDICT_RUNNING_AUTHORIZED": 1, + "CATALOGUE_OBSERVED_VERDICT_RUNNING_DIFFERS": 2, + "CATALOGUE_OBSERVED_VERDICT_RUNNING_UNAUTHORIZED": 3, + } +) + +func (x CatalogueObservedVerdict) Enum() *CatalogueObservedVerdict { + p := new(CatalogueObservedVerdict) + *p = x + return p +} + +func (x CatalogueObservedVerdict) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CatalogueObservedVerdict) Descriptor() protoreflect.EnumDescriptor { + return file_saas_accounts_v1_platform_admin_proto_enumTypes[2].Descriptor() +} + +func (CatalogueObservedVerdict) Type() protoreflect.EnumType { + return &file_saas_accounts_v1_platform_admin_proto_enumTypes[2] +} + +func (x CatalogueObservedVerdict) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CatalogueObservedVerdict.Descriptor instead. +func (CatalogueObservedVerdict) EnumDescriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{2} +} + type SearchUsersRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` @@ -148,28 +321,31 @@ func (x *SearchUsersResponse) GetTotalCount() int32 { return 0 } -type SuspendUserRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type ListAllOrganizationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Matches a name or slug, case-insensitively. Empty lists every organization. + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,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"` + IncludeArchived bool `protobuf:"varint,4,opt,name=include_archived,json=includeArchived,proto3" json:"include_archived,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SuspendUserRequest) Reset() { - *x = SuspendUserRequest{} +func (x *ListAllOrganizationsRequest) Reset() { + *x = ListAllOrganizationsRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SuspendUserRequest) String() string { +func (x *ListAllOrganizationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuspendUserRequest) ProtoMessage() {} +func (*ListAllOrganizationsRequest) ProtoMessage() {} -func (x *SuspendUserRequest) ProtoReflect() protoreflect.Message { +func (x *ListAllOrganizationsRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -181,46 +357,61 @@ func (x *SuspendUserRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuspendUserRequest.ProtoReflect.Descriptor instead. -func (*SuspendUserRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListAllOrganizationsRequest.ProtoReflect.Descriptor instead. +func (*ListAllOrganizationsRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{2} } -func (x *SuspendUserRequest) GetUserId() string { +func (x *ListAllOrganizationsRequest) GetQuery() string { if x != nil { - return x.UserId + return x.Query } return "" } -func (x *SuspendUserRequest) GetReason() string { +func (x *ListAllOrganizationsRequest) GetPageSize() int32 { if x != nil { - return x.Reason + return x.PageSize + } + return 0 +} + +func (x *ListAllOrganizationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken } return "" } -type UnsuspendUserRequest struct { +func (x *ListAllOrganizationsRequest) GetIncludeArchived() bool { + if x != nil { + return x.IncludeArchived + } + return false +} + +type PlatformOrganization struct { state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Organization *Organization `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + MemberCount int32 `protobuf:"varint,2,opt,name=member_count,json=memberCount,proto3" json:"member_count,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *UnsuspendUserRequest) Reset() { - *x = UnsuspendUserRequest{} +func (x *PlatformOrganization) Reset() { + *x = PlatformOrganization{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UnsuspendUserRequest) String() string { +func (x *PlatformOrganization) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UnsuspendUserRequest) ProtoMessage() {} +func (*PlatformOrganization) ProtoMessage() {} -func (x *UnsuspendUserRequest) ProtoReflect() protoreflect.Message { +func (x *PlatformOrganization) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -232,46 +423,47 @@ func (x *UnsuspendUserRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UnsuspendUserRequest.ProtoReflect.Descriptor instead. -func (*UnsuspendUserRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use PlatformOrganization.ProtoReflect.Descriptor instead. +func (*PlatformOrganization) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{3} } -func (x *UnsuspendUserRequest) GetUserId() string { +func (x *PlatformOrganization) GetOrganization() *Organization { if x != nil { - return x.UserId + return x.Organization } - return "" + return nil } -type ImpersonateUserRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - // Why the operator is stepping into this account. Recorded on - // saas.platform.user_impersonated, which otherwise names only who and whom. - // The floor is a length rather than mere presence because a justification - // that accepts "." records nothing a reader can act on. The rule below - // measures the string as sent; the service applies the same floor to the - // value with surrounding whitespace removed, so padding does not satisfy it. - Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +func (x *PlatformOrganization) GetMemberCount() int32 { + if x != nil { + return x.MemberCount + } + return 0 +} + +type ListAllOrganizationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Organizations []*PlatformOrganization `protobuf:"bytes,1,rep,name=organizations,proto3" json:"organizations,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 *ImpersonateUserRequest) Reset() { - *x = ImpersonateUserRequest{} +func (x *ListAllOrganizationsResponse) Reset() { + *x = ListAllOrganizationsResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ImpersonateUserRequest) String() string { +func (x *ListAllOrganizationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ImpersonateUserRequest) ProtoMessage() {} +func (*ListAllOrganizationsResponse) ProtoMessage() {} -func (x *ImpersonateUserRequest) ProtoReflect() protoreflect.Message { +func (x *ListAllOrganizationsResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -283,47 +475,46 @@ func (x *ImpersonateUserRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ImpersonateUserRequest.ProtoReflect.Descriptor instead. -func (*ImpersonateUserRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListAllOrganizationsResponse.ProtoReflect.Descriptor instead. +func (*ListAllOrganizationsResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{4} } -func (x *ImpersonateUserRequest) GetUserId() string { +func (x *ListAllOrganizationsResponse) GetOrganizations() []*PlatformOrganization { if x != nil { - return x.UserId + return x.Organizations } - return "" + return nil } -func (x *ImpersonateUserRequest) GetReason() string { +func (x *ListAllOrganizationsResponse) GetNextPageToken() string { if x != nil { - return x.Reason + return x.NextPageToken } return "" } -type ImpersonateUserResponse struct { +type GetOrganizationRosterRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` - ExpiresIn int64 `protobuf:"varint,2,opt,name=expires_in,json=expiresIn,proto3" json:"expires_in,omitempty"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ImpersonateUserResponse) Reset() { - *x = ImpersonateUserResponse{} +func (x *GetOrganizationRosterRequest) Reset() { + *x = GetOrganizationRosterRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ImpersonateUserResponse) String() string { +func (x *GetOrganizationRosterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ImpersonateUserResponse) ProtoMessage() {} +func (*GetOrganizationRosterRequest) ProtoMessage() {} -func (x *ImpersonateUserResponse) ProtoReflect() protoreflect.Message { +func (x *GetOrganizationRosterRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -335,48 +526,39 @@ func (x *ImpersonateUserResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ImpersonateUserResponse.ProtoReflect.Descriptor instead. -func (*ImpersonateUserResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetOrganizationRosterRequest.ProtoReflect.Descriptor instead. +func (*GetOrganizationRosterRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{5} } -func (x *ImpersonateUserResponse) GetAccessToken() string { +func (x *GetOrganizationRosterRequest) GetOrgId() string { if x != nil { - return x.AccessToken + return x.OrgId } return "" } -func (x *ImpersonateUserResponse) GetExpiresIn() int64 { - if x != nil { - return x.ExpiresIn - } - return 0 -} - -// StopImpersonation ends the caller's own impersonation session. It carries no -// target: the session to end is derived from the verified identity, so there is -// no input by which one operator could end another's window. -type StopImpersonationRequest struct { +type GetOrganizationRosterResponse struct { state protoimpl.MessageState `protogen:"open.v1"` + Members []*OrgMembership `protobuf:"bytes,1,rep,name=members,proto3" json:"members,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *StopImpersonationRequest) Reset() { - *x = StopImpersonationRequest{} +func (x *GetOrganizationRosterResponse) Reset() { + *x = GetOrganizationRosterResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *StopImpersonationRequest) String() string { +func (x *GetOrganizationRosterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopImpersonationRequest) ProtoMessage() {} +func (*GetOrganizationRosterResponse) ProtoMessage() {} -func (x *StopImpersonationRequest) ProtoReflect() protoreflect.Message { +func (x *GetOrganizationRosterResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -388,43 +570,40 @@ func (x *StopImpersonationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopImpersonationRequest.ProtoReflect.Descriptor instead. -func (*StopImpersonationRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetOrganizationRosterResponse.ProtoReflect.Descriptor instead. +func (*GetOrganizationRosterResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{6} } -type StopImpersonationResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Seconds the impersonation window was open. 0 when it was already closed. - DurationSeconds int64 `protobuf:"varint,1,opt,name=duration_seconds,json=durationSeconds,proto3" json:"duration_seconds,omitempty"` - // Whether the window's outstanding access token was actually invalidated. - // False means the window is closed durably but its token keeps working until - // it expires on its own, which happens when no revocation store is wired or - // the marker could not be written — a caller that reports "stopped" without - // saying so would overstate what the stop achieved. - AccessTokenRevoked bool `protobuf:"varint,2,opt,name=access_token_revoked,json=accessTokenRevoked,proto3" json:"access_token_revoked,omitempty"` - // Whether the window had already been closed before this call, so a retry or - // a second tab reports the outcome without recording a second end of the same - // window. - AlreadyClosed bool `protobuf:"varint,3,opt,name=already_closed,json=alreadyClosed,proto3" json:"already_closed,omitempty"` +func (x *GetOrganizationRosterResponse) GetMembers() []*OrgMembership { + if x != nil { + return x.Members + } + return nil +} + +type SuspendUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *StopImpersonationResponse) Reset() { - *x = StopImpersonationResponse{} +func (x *SuspendUserRequest) Reset() { + *x = SuspendUserRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *StopImpersonationResponse) String() string { +func (x *SuspendUserRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopImpersonationResponse) ProtoMessage() {} +func (*SuspendUserRequest) ProtoMessage() {} -func (x *StopImpersonationResponse) ProtoReflect() protoreflect.Message { +func (x *SuspendUserRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -436,55 +615,46 @@ func (x *StopImpersonationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopImpersonationResponse.ProtoReflect.Descriptor instead. -func (*StopImpersonationResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use SuspendUserRequest.ProtoReflect.Descriptor instead. +func (*SuspendUserRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{7} } -func (x *StopImpersonationResponse) GetDurationSeconds() int64 { - if x != nil { - return x.DurationSeconds - } - return 0 -} - -func (x *StopImpersonationResponse) GetAccessTokenRevoked() bool { +func (x *SuspendUserRequest) GetUserId() string { if x != nil { - return x.AccessTokenRevoked + return x.UserId } - return false + return "" } -func (x *StopImpersonationResponse) GetAlreadyClosed() bool { +func (x *SuspendUserRequest) GetReason() string { if x != nil { - return x.AlreadyClosed + return x.Reason } - return false + return "" } -type ListActiveSessionsRequest struct { +type UnsuspendUserRequest struct { state protoimpl.MessageState `protogen:"open.v1"` UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,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 *ListActiveSessionsRequest) Reset() { - *x = ListActiveSessionsRequest{} +func (x *UnsuspendUserRequest) Reset() { + *x = UnsuspendUserRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListActiveSessionsRequest) String() string { +func (x *UnsuspendUserRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListActiveSessionsRequest) ProtoMessage() {} +func (*UnsuspendUserRequest) ProtoMessage() {} -func (x *ListActiveSessionsRequest) ProtoReflect() protoreflect.Message { +func (x *UnsuspendUserRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -496,66 +666,46 @@ func (x *ListActiveSessionsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListActiveSessionsRequest.ProtoReflect.Descriptor instead. -func (*ListActiveSessionsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use UnsuspendUserRequest.ProtoReflect.Descriptor instead. +func (*UnsuspendUserRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{8} } -func (x *ListActiveSessionsRequest) GetUserId() string { +func (x *UnsuspendUserRequest) GetUserId() string { if x != nil { return x.UserId } return "" } -func (x *ListActiveSessionsRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListActiveSessionsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -type SessionInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Stable refresh-family identifier for one device login. Unlike the JWT sid, - // it does not change when the refresh token rotates. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - IpAddress string `protobuf:"bytes,3,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` - DeviceInfo map[string]string `protobuf:"bytes,4,rep,name=device_info,json=deviceInfo,proto3" json:"device_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - LastActiveAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_active_at,json=lastActiveAt,proto3" json:"last_active_at,omitempty"` - ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` - IdleExpiresAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=idle_expires_at,json=idleExpiresAt,proto3" json:"idle_expires_at,omitempty"` - // Set only on an impersonation window, naming the user being viewed. An - // ordinary login leaves it empty, so a client can tell the two apart rather - // than presenting an admin's support session as a device they signed in on. - ActingAsUserId string `protobuf:"bytes,9,opt,name=acting_as_user_id,json=actingAsUserId,proto3" json:"acting_as_user_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type ImpersonateUserRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Why the operator is stepping into this account. Recorded on + // saas.platform.user_impersonated, which otherwise names only who and whom. + // The floor is a length rather than mere presence because a justification + // that accepts "." records nothing a reader can act on. The rule below + // measures the string as sent; the service applies the same floor to the + // value with surrounding whitespace removed, so padding does not satisfy it. + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SessionInfo) Reset() { - *x = SessionInfo{} +func (x *ImpersonateUserRequest) Reset() { + *x = ImpersonateUserRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SessionInfo) String() string { +func (x *ImpersonateUserRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SessionInfo) ProtoMessage() {} +func (*ImpersonateUserRequest) ProtoMessage() {} -func (x *SessionInfo) ProtoReflect() protoreflect.Message { +func (x *ImpersonateUserRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -567,96 +717,47 @@ func (x *SessionInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SessionInfo.ProtoReflect.Descriptor instead. -func (*SessionInfo) Descriptor() ([]byte, []int) { +// Deprecated: Use ImpersonateUserRequest.ProtoReflect.Descriptor instead. +func (*ImpersonateUserRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{9} } -func (x *SessionInfo) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *SessionInfo) GetUserId() string { +func (x *ImpersonateUserRequest) GetUserId() string { if x != nil { return x.UserId } return "" } -func (x *SessionInfo) GetIpAddress() string { - if x != nil { - return x.IpAddress - } - return "" -} - -func (x *SessionInfo) GetDeviceInfo() map[string]string { - if x != nil { - return x.DeviceInfo - } - return nil -} - -func (x *SessionInfo) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *SessionInfo) GetLastActiveAt() *timestamppb.Timestamp { - if x != nil { - return x.LastActiveAt - } - return nil -} - -func (x *SessionInfo) GetExpiresAt() *timestamppb.Timestamp { - if x != nil { - return x.ExpiresAt - } - return nil -} - -func (x *SessionInfo) GetIdleExpiresAt() *timestamppb.Timestamp { - if x != nil { - return x.IdleExpiresAt - } - return nil -} - -func (x *SessionInfo) GetActingAsUserId() string { +func (x *ImpersonateUserRequest) GetReason() string { if x != nil { - return x.ActingAsUserId + return x.Reason } return "" } -type ListActiveSessionsResponse struct { +type ImpersonateUserResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Sessions []*SessionInfo `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"` - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + ExpiresIn int64 `protobuf:"varint,2,opt,name=expires_in,json=expiresIn,proto3" json:"expires_in,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListActiveSessionsResponse) Reset() { - *x = ListActiveSessionsResponse{} +func (x *ImpersonateUserResponse) Reset() { + *x = ImpersonateUserResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListActiveSessionsResponse) String() string { +func (x *ImpersonateUserResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListActiveSessionsResponse) ProtoMessage() {} +func (*ImpersonateUserResponse) ProtoMessage() {} -func (x *ListActiveSessionsResponse) ProtoReflect() protoreflect.Message { +func (x *ImpersonateUserResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -668,48 +769,48 @@ func (x *ListActiveSessionsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListActiveSessionsResponse.ProtoReflect.Descriptor instead. -func (*ListActiveSessionsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ImpersonateUserResponse.ProtoReflect.Descriptor instead. +func (*ImpersonateUserResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{10} } -func (x *ListActiveSessionsResponse) GetSessions() []*SessionInfo { +func (x *ImpersonateUserResponse) GetAccessToken() string { if x != nil { - return x.Sessions + return x.AccessToken } - return nil + return "" } -func (x *ListActiveSessionsResponse) GetNextPageToken() string { +func (x *ImpersonateUserResponse) GetExpiresIn() int64 { if x != nil { - return x.NextPageToken + return x.ExpiresIn } - return "" + return 0 } -type RevokeSessionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // SessionInfo.id: the stable device refresh-family identifier. - SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` - Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +// StopImpersonation ends the caller's own impersonation session. It carries no +// target: the session to end is derived from the verified identity, so there is +// no input by which one operator could end another's window. +type StopImpersonationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RevokeSessionRequest) Reset() { - *x = RevokeSessionRequest{} +func (x *StopImpersonationRequest) Reset() { + *x = StopImpersonationRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RevokeSessionRequest) String() string { +func (x *StopImpersonationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RevokeSessionRequest) ProtoMessage() {} +func (*StopImpersonationRequest) ProtoMessage() {} -func (x *RevokeSessionRequest) ProtoReflect() protoreflect.Message { +func (x *StopImpersonationRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -721,46 +822,43 @@ func (x *RevokeSessionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RevokeSessionRequest.ProtoReflect.Descriptor instead. -func (*RevokeSessionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use StopImpersonationRequest.ProtoReflect.Descriptor instead. +func (*StopImpersonationRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{11} } -func (x *RevokeSessionRequest) GetSessionId() string { - if x != nil { - return x.SessionId - } - return "" -} - -func (x *RevokeSessionRequest) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -type GetOrgEntitlementsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` +type StopImpersonationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Seconds the impersonation window was open. 0 when it was already closed. + DurationSeconds int64 `protobuf:"varint,1,opt,name=duration_seconds,json=durationSeconds,proto3" json:"duration_seconds,omitempty"` + // Whether the window's outstanding access token was actually invalidated. + // False means the window is closed durably but its token keeps working until + // it expires on its own, which happens when no revocation store is wired or + // the marker could not be written — a caller that reports "stopped" without + // saying so would overstate what the stop achieved. + AccessTokenRevoked bool `protobuf:"varint,2,opt,name=access_token_revoked,json=accessTokenRevoked,proto3" json:"access_token_revoked,omitempty"` + // Whether the window had already been closed before this call, so a retry or + // a second tab reports the outcome without recording a second end of the same + // window. + AlreadyClosed bool `protobuf:"varint,3,opt,name=already_closed,json=alreadyClosed,proto3" json:"already_closed,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GetOrgEntitlementsRequest) Reset() { - *x = GetOrgEntitlementsRequest{} +func (x *StopImpersonationResponse) Reset() { + *x = StopImpersonationResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetOrgEntitlementsRequest) String() string { +func (x *StopImpersonationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetOrgEntitlementsRequest) ProtoMessage() {} +func (*StopImpersonationResponse) ProtoMessage() {} -func (x *GetOrgEntitlementsRequest) ProtoReflect() protoreflect.Message { +func (x *StopImpersonationResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -772,40 +870,55 @@ func (x *GetOrgEntitlementsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetOrgEntitlementsRequest.ProtoReflect.Descriptor instead. -func (*GetOrgEntitlementsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use StopImpersonationResponse.ProtoReflect.Descriptor instead. +func (*StopImpersonationResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{12} } -func (x *GetOrgEntitlementsRequest) GetOrgId() string { +func (x *StopImpersonationResponse) GetDurationSeconds() int64 { if x != nil { - return x.OrgId + return x.DurationSeconds } - return "" + return 0 } -type GetOrgEntitlementsResponse struct { +func (x *StopImpersonationResponse) GetAccessTokenRevoked() bool { + if x != nil { + return x.AccessTokenRevoked + } + return false +} + +func (x *StopImpersonationResponse) GetAlreadyClosed() bool { + if x != nil { + return x.AlreadyClosed + } + return false +} + +type ListActiveSessionsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - PlanName string `protobuf:"bytes,1,opt,name=plan_name,json=planName,proto3" json:"plan_name,omitempty"` - Entitlements []*EntitlementInfo `protobuf:"bytes,2,rep,name=entitlements,proto3" json:"entitlements,omitempty"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,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 *GetOrgEntitlementsResponse) Reset() { - *x = GetOrgEntitlementsResponse{} +func (x *ListActiveSessionsRequest) Reset() { + *x = ListActiveSessionsRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetOrgEntitlementsResponse) String() string { +func (x *ListActiveSessionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetOrgEntitlementsResponse) ProtoMessage() {} +func (*ListActiveSessionsRequest) ProtoMessage() {} -func (x *GetOrgEntitlementsResponse) ProtoReflect() protoreflect.Message { +func (x *ListActiveSessionsRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -817,49 +930,66 @@ func (x *GetOrgEntitlementsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetOrgEntitlementsResponse.ProtoReflect.Descriptor instead. -func (*GetOrgEntitlementsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ListActiveSessionsRequest.ProtoReflect.Descriptor instead. +func (*ListActiveSessionsRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{13} } -func (x *GetOrgEntitlementsResponse) GetPlanName() string { +func (x *ListActiveSessionsRequest) GetUserId() string { if x != nil { - return x.PlanName + return x.UserId } return "" } -func (x *GetOrgEntitlementsResponse) GetEntitlements() []*EntitlementInfo { +func (x *ListActiveSessionsRequest) GetPageSize() int32 { if x != nil { - return x.Entitlements + return x.PageSize } - return nil + return 0 } -type EntitlementInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Feature string `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"` - Limit int64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // -1 = unlimited, 0 = disabled - Used int64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` - HasOverride bool `protobuf:"varint,4,opt,name=has_override,json=hasOverride,proto3" json:"has_override,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (x *ListActiveSessionsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" } -func (x *EntitlementInfo) Reset() { - *x = EntitlementInfo{} +type SessionInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Stable refresh-family identifier for one device login. Unlike the JWT sid, + // it does not change when the refresh token rotates. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + IpAddress string `protobuf:"bytes,3,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` + DeviceInfo map[string]string `protobuf:"bytes,4,rep,name=device_info,json=deviceInfo,proto3" json:"device_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + LastActiveAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_active_at,json=lastActiveAt,proto3" json:"last_active_at,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + IdleExpiresAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=idle_expires_at,json=idleExpiresAt,proto3" json:"idle_expires_at,omitempty"` + // Set only on an impersonation window, naming the user being viewed. An + // ordinary login leaves it empty, so a client can tell the two apart rather + // than presenting an admin's support session as a device they signed in on. + ActingAsUserId string `protobuf:"bytes,9,opt,name=acting_as_user_id,json=actingAsUserId,proto3" json:"acting_as_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SessionInfo) Reset() { + *x = SessionInfo{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EntitlementInfo) String() string { +func (x *SessionInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EntitlementInfo) ProtoMessage() {} +func (*SessionInfo) ProtoMessage() {} -func (x *EntitlementInfo) ProtoReflect() protoreflect.Message { +func (x *SessionInfo) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -871,63 +1001,96 @@ func (x *EntitlementInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EntitlementInfo.ProtoReflect.Descriptor instead. -func (*EntitlementInfo) Descriptor() ([]byte, []int) { +// Deprecated: Use SessionInfo.ProtoReflect.Descriptor instead. +func (*SessionInfo) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{14} } -func (x *EntitlementInfo) GetFeature() string { +func (x *SessionInfo) GetId() string { if x != nil { - return x.Feature + return x.Id } return "" } -func (x *EntitlementInfo) GetLimit() int64 { +func (x *SessionInfo) GetUserId() string { if x != nil { - return x.Limit + return x.UserId } - return 0 + return "" } -func (x *EntitlementInfo) GetUsed() int64 { +func (x *SessionInfo) GetIpAddress() string { if x != nil { - return x.Used + return x.IpAddress } - return 0 + return "" } -func (x *EntitlementInfo) GetHasOverride() bool { +func (x *SessionInfo) GetDeviceInfo() map[string]string { if x != nil { - return x.HasOverride + return x.DeviceInfo } - return false + return nil } -type OverrideEntitlementRequest struct { +func (x *SessionInfo) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SessionInfo) GetLastActiveAt() *timestamppb.Timestamp { + if x != nil { + return x.LastActiveAt + } + return nil +} + +func (x *SessionInfo) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *SessionInfo) GetIdleExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.IdleExpiresAt + } + return nil +} + +func (x *SessionInfo) GetActingAsUserId() string { + if x != nil { + return x.ActingAsUserId + } + return "" +} + +type ListActiveSessionsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` - Feature string `protobuf:"bytes,2,opt,name=feature,proto3" json:"feature,omitempty"` - LimitValue int64 `protobuf:"varint,3,opt,name=limit_value,json=limitValue,proto3" json:"limit_value,omitempty"` - Reason string `protobuf:"bytes,4,opt,name=reason,proto3" json:"reason,omitempty"` + Sessions []*SessionInfo `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,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 *OverrideEntitlementRequest) Reset() { - *x = OverrideEntitlementRequest{} +func (x *ListActiveSessionsResponse) Reset() { + *x = ListActiveSessionsResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *OverrideEntitlementRequest) String() string { +func (x *ListActiveSessionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OverrideEntitlementRequest) ProtoMessage() {} +func (*ListActiveSessionsResponse) ProtoMessage() {} -func (x *OverrideEntitlementRequest) ProtoReflect() protoreflect.Message { +func (x *ListActiveSessionsResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -939,60 +1102,48 @@ func (x *OverrideEntitlementRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OverrideEntitlementRequest.ProtoReflect.Descriptor instead. -func (*OverrideEntitlementRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListActiveSessionsResponse.ProtoReflect.Descriptor instead. +func (*ListActiveSessionsResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{15} } -func (x *OverrideEntitlementRequest) GetOrgId() string { - if x != nil { - return x.OrgId - } - return "" -} - -func (x *OverrideEntitlementRequest) GetFeature() string { - if x != nil { - return x.Feature - } - return "" -} - -func (x *OverrideEntitlementRequest) GetLimitValue() int64 { +func (x *ListActiveSessionsResponse) GetSessions() []*SessionInfo { if x != nil { - return x.LimitValue + return x.Sessions } - return 0 + return nil } -func (x *OverrideEntitlementRequest) GetReason() string { +func (x *ListActiveSessionsResponse) GetNextPageToken() string { if x != nil { - return x.Reason + return x.NextPageToken } return "" } -type OverrideEntitlementResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +type RevokeSessionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // SessionInfo.id: the stable device refresh-family identifier. + SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *OverrideEntitlementResponse) Reset() { - *x = OverrideEntitlementResponse{} +func (x *RevokeSessionRequest) Reset() { + *x = RevokeSessionRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *OverrideEntitlementResponse) String() string { +func (x *RevokeSessionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OverrideEntitlementResponse) ProtoMessage() {} +func (*RevokeSessionRequest) ProtoMessage() {} -func (x *OverrideEntitlementResponse) ProtoReflect() protoreflect.Message { +func (x *RevokeSessionRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1004,40 +1155,46 @@ func (x *OverrideEntitlementResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OverrideEntitlementResponse.ProtoReflect.Descriptor instead. -func (*OverrideEntitlementResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use RevokeSessionRequest.ProtoReflect.Descriptor instead. +func (*RevokeSessionRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{16} } -func (x *OverrideEntitlementResponse) GetId() string { +func (x *RevokeSessionRequest) GetSessionId() string { if x != nil { - return x.Id + return x.SessionId } return "" } -type GrantPlatformRoleRequest struct { +func (x *RevokeSessionRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type GetOrgEntitlementsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - PlatformRole string `protobuf:"bytes,2,opt,name=platform_role,json=platformRole,proto3" json:"platform_role,omitempty"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GrantPlatformRoleRequest) Reset() { - *x = GrantPlatformRoleRequest{} +func (x *GetOrgEntitlementsRequest) Reset() { + *x = GetOrgEntitlementsRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GrantPlatformRoleRequest) String() string { +func (x *GetOrgEntitlementsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GrantPlatformRoleRequest) ProtoMessage() {} +func (*GetOrgEntitlementsRequest) ProtoMessage() {} -func (x *GrantPlatformRoleRequest) ProtoReflect() protoreflect.Message { +func (x *GetOrgEntitlementsRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1049,46 +1206,40 @@ func (x *GrantPlatformRoleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GrantPlatformRoleRequest.ProtoReflect.Descriptor instead. -func (*GrantPlatformRoleRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetOrgEntitlementsRequest.ProtoReflect.Descriptor instead. +func (*GetOrgEntitlementsRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{17} } -func (x *GrantPlatformRoleRequest) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *GrantPlatformRoleRequest) GetPlatformRole() string { +func (x *GetOrgEntitlementsRequest) GetOrgId() string { if x != nil { - return x.PlatformRole + return x.OrgId } return "" } -type RevokePlatformRoleRequest struct { +type GetOrgEntitlementsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + PlanName string `protobuf:"bytes,1,opt,name=plan_name,json=planName,proto3" json:"plan_name,omitempty"` + Entitlements []*EntitlementInfo `protobuf:"bytes,2,rep,name=entitlements,proto3" json:"entitlements,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RevokePlatformRoleRequest) Reset() { - *x = RevokePlatformRoleRequest{} +func (x *GetOrgEntitlementsResponse) Reset() { + *x = GetOrgEntitlementsResponse{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RevokePlatformRoleRequest) String() string { +func (x *GetOrgEntitlementsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RevokePlatformRoleRequest) ProtoMessage() {} +func (*GetOrgEntitlementsResponse) ProtoMessage() {} -func (x *RevokePlatformRoleRequest) ProtoReflect() protoreflect.Message { +func (x *GetOrgEntitlementsResponse) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1100,38 +1251,49 @@ func (x *RevokePlatformRoleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RevokePlatformRoleRequest.ProtoReflect.Descriptor instead. -func (*RevokePlatformRoleRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetOrgEntitlementsResponse.ProtoReflect.Descriptor instead. +func (*GetOrgEntitlementsResponse) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{18} } -func (x *RevokePlatformRoleRequest) GetUserId() string { +func (x *GetOrgEntitlementsResponse) GetPlanName() string { if x != nil { - return x.UserId + return x.PlanName } return "" } -type ListPlatformAdminsRequest struct { +func (x *GetOrgEntitlementsResponse) GetEntitlements() []*EntitlementInfo { + if x != nil { + return x.Entitlements + } + return nil +} + +type EntitlementInfo struct { state protoimpl.MessageState `protogen:"open.v1"` + Feature string `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"` + Limit int64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // -1 = unlimited, 0 = disabled + Used int64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` + HasOverride bool `protobuf:"varint,4,opt,name=has_override,json=hasOverride,proto3" json:"has_override,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListPlatformAdminsRequest) Reset() { - *x = ListPlatformAdminsRequest{} +func (x *EntitlementInfo) Reset() { + *x = EntitlementInfo{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListPlatformAdminsRequest) String() string { +func (x *EntitlementInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPlatformAdminsRequest) ProtoMessage() {} +func (*EntitlementInfo) ProtoMessage() {} -func (x *ListPlatformAdminsRequest) ProtoReflect() protoreflect.Message { +func (x *EntitlementInfo) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1143,35 +1305,63 @@ func (x *ListPlatformAdminsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListPlatformAdminsRequest.ProtoReflect.Descriptor instead. -func (*ListPlatformAdminsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use EntitlementInfo.ProtoReflect.Descriptor instead. +func (*EntitlementInfo) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{19} } -type PlatformAdminEntry struct { +func (x *EntitlementInfo) GetFeature() string { + if x != nil { + return x.Feature + } + return "" +} + +func (x *EntitlementInfo) GetLimit() int64 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *EntitlementInfo) GetUsed() int64 { + if x != nil { + return x.Used + } + return 0 +} + +func (x *EntitlementInfo) GetHasOverride() bool { + if x != nil { + return x.HasOverride + } + return false +} + +type OverrideEntitlementRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - PlatformRole string `protobuf:"bytes,2,opt,name=platform_role,json=platformRole,proto3" json:"platform_role,omitempty"` - GrantedBy string `protobuf:"bytes,3,opt,name=granted_by,json=grantedBy,proto3" json:"granted_by,omitempty"` - GrantedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=granted_at,json=grantedAt,proto3" json:"granted_at,omitempty"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + Feature string `protobuf:"bytes,2,opt,name=feature,proto3" json:"feature,omitempty"` + LimitValue int64 `protobuf:"varint,3,opt,name=limit_value,json=limitValue,proto3" json:"limit_value,omitempty"` + Reason string `protobuf:"bytes,4,opt,name=reason,proto3" json:"reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *PlatformAdminEntry) Reset() { - *x = PlatformAdminEntry{} +func (x *OverrideEntitlementRequest) Reset() { + *x = OverrideEntitlementRequest{} mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PlatformAdminEntry) String() string { +func (x *OverrideEntitlementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PlatformAdminEntry) ProtoMessage() {} +func (*OverrideEntitlementRequest) ProtoMessage() {} -func (x *PlatformAdminEntry) ProtoReflect() protoreflect.Message { +func (x *OverrideEntitlementRequest) ProtoReflect() protoreflect.Message { mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1183,145 +1373,1855 @@ func (x *PlatformAdminEntry) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PlatformAdminEntry.ProtoReflect.Descriptor instead. -func (*PlatformAdminEntry) Descriptor() ([]byte, []int) { +// Deprecated: Use OverrideEntitlementRequest.ProtoReflect.Descriptor instead. +func (*OverrideEntitlementRequest) Descriptor() ([]byte, []int) { return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{20} } -func (x *PlatformAdminEntry) GetUserId() string { +func (x *OverrideEntitlementRequest) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *OverrideEntitlementRequest) GetFeature() string { + if x != nil { + return x.Feature + } + return "" +} + +func (x *OverrideEntitlementRequest) GetLimitValue() int64 { + if x != nil { + return x.LimitValue + } + return 0 +} + +func (x *OverrideEntitlementRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type OverrideEntitlementResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OverrideEntitlementResponse) Reset() { + *x = OverrideEntitlementResponse{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OverrideEntitlementResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OverrideEntitlementResponse) ProtoMessage() {} + +func (x *OverrideEntitlementResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 OverrideEntitlementResponse.ProtoReflect.Descriptor instead. +func (*OverrideEntitlementResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{21} +} + +func (x *OverrideEntitlementResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GrantPlatformRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + PlatformRole string `protobuf:"bytes,2,opt,name=platform_role,json=platformRole,proto3" json:"platform_role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GrantPlatformRoleRequest) Reset() { + *x = GrantPlatformRoleRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GrantPlatformRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrantPlatformRoleRequest) ProtoMessage() {} + +func (x *GrantPlatformRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 GrantPlatformRoleRequest.ProtoReflect.Descriptor instead. +func (*GrantPlatformRoleRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{22} +} + +func (x *GrantPlatformRoleRequest) GetUserId() string { if x != nil { return x.UserId } return "" } -func (x *PlatformAdminEntry) GetPlatformRole() string { +func (x *GrantPlatformRoleRequest) GetPlatformRole() string { if x != nil { return x.PlatformRole } return "" } -func (x *PlatformAdminEntry) GetGrantedBy() string { +type RevokePlatformRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokePlatformRoleRequest) Reset() { + *x = RevokePlatformRoleRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokePlatformRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokePlatformRoleRequest) ProtoMessage() {} + +func (x *RevokePlatformRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[23] if x != nil { - return x.GrantedBy + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *PlatformAdminEntry) GetGrantedAt() *timestamppb.Timestamp { +// Deprecated: Use RevokePlatformRoleRequest.ProtoReflect.Descriptor instead. +func (*RevokePlatformRoleRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{23} +} + +func (x *RevokePlatformRoleRequest) GetUserId() string { if x != nil { - return x.GrantedAt + return x.UserId } - return nil + return "" } -type ListPlatformAdminsResponse struct { +type ListPlatformAdminsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Admins []*PlatformAdminEntry `protobuf:"bytes,1,rep,name=admins,proto3" json:"admins,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListPlatformAdminsResponse) Reset() { - *x = ListPlatformAdminsResponse{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[21] +func (x *ListPlatformAdminsRequest) Reset() { + *x = ListPlatformAdminsRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListPlatformAdminsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ListPlatformAdminsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPlatformAdminsRequest) ProtoMessage() {} + +func (x *ListPlatformAdminsRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 ListPlatformAdminsRequest.ProtoReflect.Descriptor instead. +func (*ListPlatformAdminsRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{24} +} + +type PlatformAdminEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + PlatformRole string `protobuf:"bytes,2,opt,name=platform_role,json=platformRole,proto3" json:"platform_role,omitempty"` + GrantedBy string `protobuf:"bytes,3,opt,name=granted_by,json=grantedBy,proto3" json:"granted_by,omitempty"` + GrantedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=granted_at,json=grantedAt,proto3" json:"granted_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlatformAdminEntry) Reset() { + *x = PlatformAdminEntry{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlatformAdminEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlatformAdminEntry) ProtoMessage() {} + +func (x *PlatformAdminEntry) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 PlatformAdminEntry.ProtoReflect.Descriptor instead. +func (*PlatformAdminEntry) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{25} +} + +func (x *PlatformAdminEntry) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *PlatformAdminEntry) GetPlatformRole() string { + if x != nil { + return x.PlatformRole + } + return "" +} + +func (x *PlatformAdminEntry) GetGrantedBy() string { + if x != nil { + return x.GrantedBy + } + return "" +} + +func (x *PlatformAdminEntry) GetGrantedAt() *timestamppb.Timestamp { + if x != nil { + return x.GrantedAt + } + return nil +} + +type ListPlatformAdminsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Admins []*PlatformAdminEntry `protobuf:"bytes,1,rep,name=admins,proto3" json:"admins,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPlatformAdminsResponse) Reset() { + *x = ListPlatformAdminsResponse{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListPlatformAdminsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPlatformAdminsResponse) ProtoMessage() {} + +func (x *ListPlatformAdminsResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 ListPlatformAdminsResponse.ProtoReflect.Descriptor instead. +func (*ListPlatformAdminsResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{26} +} + +func (x *ListPlatformAdminsResponse) GetAdmins() []*PlatformAdminEntry { + if x != nil { + return x.Admins + } + return nil +} + +type ListFeatureFlagsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListFeatureFlagsRequest) Reset() { + *x = ListFeatureFlagsRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListFeatureFlagsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFeatureFlagsRequest) ProtoMessage() {} + +func (x *ListFeatureFlagsRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 ListFeatureFlagsRequest.ProtoReflect.Descriptor instead. +func (*ListFeatureFlagsRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{27} +} + +type FeatureFlagEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` + RolloutPercent int32 `protobuf:"varint,4,opt,name=rollout_percent,json=rolloutPercent,proto3" json:"rollout_percent,omitempty"` + TargetOrgIds []string `protobuf:"bytes,5,rep,name=target_org_ids,json=targetOrgIds,proto3" json:"target_org_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FeatureFlagEntry) Reset() { + *x = FeatureFlagEntry{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FeatureFlagEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FeatureFlagEntry) ProtoMessage() {} + +func (x *FeatureFlagEntry) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_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 FeatureFlagEntry.ProtoReflect.Descriptor instead. +func (*FeatureFlagEntry) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{28} +} + +func (x *FeatureFlagEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FeatureFlagEntry) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *FeatureFlagEntry) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *FeatureFlagEntry) GetRolloutPercent() int32 { + if x != nil { + return x.RolloutPercent + } + return 0 +} + +func (x *FeatureFlagEntry) GetTargetOrgIds() []string { + if x != nil { + return x.TargetOrgIds + } + return nil +} + +type ListFeatureFlagsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Flags []*FeatureFlagEntry `protobuf:"bytes,1,rep,name=flags,proto3" json:"flags,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListFeatureFlagsResponse) Reset() { + *x = ListFeatureFlagsResponse{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListFeatureFlagsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFeatureFlagsResponse) ProtoMessage() {} + +func (x *ListFeatureFlagsResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFeatureFlagsResponse.ProtoReflect.Descriptor instead. +func (*ListFeatureFlagsResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{29} +} + +func (x *ListFeatureFlagsResponse) GetFlags() []*FeatureFlagEntry { + if x != nil { + return x.Flags + } + return nil +} + +// Deprecated: the database-backed flag inventory is read-only while consumers +// migrate to the provider-neutral feature-flags@1 capability. +// +// Deprecated: Marked as deprecated in saas/accounts/v1/platform_admin.proto. +type UpsertFeatureFlagRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` + RolloutPercent int32 `protobuf:"varint,4,opt,name=rollout_percent,json=rolloutPercent,proto3" json:"rollout_percent,omitempty"` + TargetOrgIds []string `protobuf:"bytes,5,rep,name=target_org_ids,json=targetOrgIds,proto3" json:"target_org_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpsertFeatureFlagRequest) Reset() { + *x = UpsertFeatureFlagRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpsertFeatureFlagRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertFeatureFlagRequest) ProtoMessage() {} + +func (x *UpsertFeatureFlagRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertFeatureFlagRequest.ProtoReflect.Descriptor instead. +func (*UpsertFeatureFlagRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{30} +} + +func (x *UpsertFeatureFlagRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpsertFeatureFlagRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *UpsertFeatureFlagRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *UpsertFeatureFlagRequest) GetRolloutPercent() int32 { + if x != nil { + return x.RolloutPercent + } + return 0 +} + +func (x *UpsertFeatureFlagRequest) GetTargetOrgIds() []string { + if x != nil { + return x.TargetOrgIds + } + return nil +} + +// Deprecated: UpsertFeatureFlag always fails closed and returns no response. +// +// Deprecated: Marked as deprecated in saas/accounts/v1/platform_admin.proto. +type UpsertFeatureFlagResponse 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 *UpsertFeatureFlagResponse) Reset() { + *x = UpsertFeatureFlagResponse{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpsertFeatureFlagResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertFeatureFlagResponse) ProtoMessage() {} + +func (x *UpsertFeatureFlagResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertFeatureFlagResponse.ProtoReflect.Descriptor instead. +func (*UpsertFeatureFlagResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{31} +} + +func (x *UpsertFeatureFlagResponse) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// CatalogueGap is a Catalogue fact this host cannot state, with the reason. +type CatalogueGap struct { + state protoimpl.MessageState `protogen:"open.v1"` + Reason CatalogueGapReason `protobuf:"varint,1,opt,name=reason,proto3,enum=saas.accounts.v1.CatalogueGapReason" json:"reason,omitempty"` + // Operator-facing: names the record or producer that would supply the fact. + Detail string `protobuf:"bytes,2,opt,name=detail,proto3" json:"detail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueGap) Reset() { + *x = CatalogueGap{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueGap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueGap) ProtoMessage() {} + +func (x *CatalogueGap) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueGap.ProtoReflect.Descriptor instead. +func (*CatalogueGap) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{32} +} + +func (x *CatalogueGap) GetReason() CatalogueGapReason { + if x != nil { + return x.Reason + } + return CatalogueGapReason_CATALOGUE_GAP_REASON_UNSPECIFIED +} + +func (x *CatalogueGap) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +// CatalogueRelease is a release, publisher/name@version. +type CatalogueRelease struct { + state protoimpl.MessageState `protogen:"open.v1"` + Publisher string `protobuf:"bytes,1,opt,name=publisher,proto3" json:"publisher,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueRelease) Reset() { + *x = CatalogueRelease{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueRelease) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueRelease) ProtoMessage() {} + +func (x *CatalogueRelease) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueRelease.ProtoReflect.Descriptor instead. +func (*CatalogueRelease) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{33} +} + +func (x *CatalogueRelease) GetPublisher() string { + if x != nil { + return x.Publisher + } + return "" +} + +func (x *CatalogueRelease) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CatalogueRelease) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +// CatalogueDesired is what the composition declares. +type CatalogueDesired struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to DeclaredRevisionValue: + // + // *CatalogueDesired_DeclaredRevision + // *CatalogueDesired_DeclaredRevisionGap + DeclaredRevisionValue isCatalogueDesired_DeclaredRevisionValue `protobuf_oneof:"declared_revision_value"` + // Types that are valid to be assigned to DeclaredReleaseValue: + // + // *CatalogueDesired_DeclaredRelease + // *CatalogueDesired_DeclaredReleaseGap + DeclaredReleaseValue isCatalogueDesired_DeclaredReleaseValue `protobuf_oneof:"declared_release_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueDesired) Reset() { + *x = CatalogueDesired{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueDesired) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueDesired) ProtoMessage() {} + +func (x *CatalogueDesired) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueDesired.ProtoReflect.Descriptor instead. +func (*CatalogueDesired) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{34} +} + +func (x *CatalogueDesired) GetDeclaredRevisionValue() isCatalogueDesired_DeclaredRevisionValue { + if x != nil { + return x.DeclaredRevisionValue + } + return nil +} + +func (x *CatalogueDesired) GetDeclaredRevision() int64 { + if x != nil { + if x, ok := x.DeclaredRevisionValue.(*CatalogueDesired_DeclaredRevision); ok { + return x.DeclaredRevision + } + } + return 0 +} + +func (x *CatalogueDesired) GetDeclaredRevisionGap() *CatalogueGap { + if x != nil { + if x, ok := x.DeclaredRevisionValue.(*CatalogueDesired_DeclaredRevisionGap); ok { + return x.DeclaredRevisionGap + } + } + return nil +} + +func (x *CatalogueDesired) GetDeclaredReleaseValue() isCatalogueDesired_DeclaredReleaseValue { + if x != nil { + return x.DeclaredReleaseValue + } + return nil +} + +func (x *CatalogueDesired) GetDeclaredRelease() *CatalogueRelease { + if x != nil { + if x, ok := x.DeclaredReleaseValue.(*CatalogueDesired_DeclaredRelease); ok { + return x.DeclaredRelease + } + } + return nil +} + +func (x *CatalogueDesired) GetDeclaredReleaseGap() *CatalogueGap { + if x != nil { + if x, ok := x.DeclaredReleaseValue.(*CatalogueDesired_DeclaredReleaseGap); ok { + return x.DeclaredReleaseGap + } + } + return nil +} + +type isCatalogueDesired_DeclaredRevisionValue interface { + isCatalogueDesired_DeclaredRevisionValue() +} + +type CatalogueDesired_DeclaredRevision struct { + DeclaredRevision int64 `protobuf:"varint,1,opt,name=declared_revision,json=declaredRevision,proto3,oneof"` +} + +type CatalogueDesired_DeclaredRevisionGap struct { + DeclaredRevisionGap *CatalogueGap `protobuf:"bytes,2,opt,name=declared_revision_gap,json=declaredRevisionGap,proto3,oneof"` +} + +func (*CatalogueDesired_DeclaredRevision) isCatalogueDesired_DeclaredRevisionValue() {} + +func (*CatalogueDesired_DeclaredRevisionGap) isCatalogueDesired_DeclaredRevisionValue() {} + +type isCatalogueDesired_DeclaredReleaseValue interface { + isCatalogueDesired_DeclaredReleaseValue() +} + +type CatalogueDesired_DeclaredRelease struct { + DeclaredRelease *CatalogueRelease `protobuf:"bytes,3,opt,name=declared_release,json=declaredRelease,proto3,oneof"` +} + +type CatalogueDesired_DeclaredReleaseGap struct { + DeclaredReleaseGap *CatalogueGap `protobuf:"bytes,4,opt,name=declared_release_gap,json=declaredReleaseGap,proto3,oneof"` +} + +func (*CatalogueDesired_DeclaredRelease) isCatalogueDesired_DeclaredReleaseValue() {} + +func (*CatalogueDesired_DeclaredReleaseGap) isCatalogueDesired_DeclaredReleaseValue() {} + +// CatalogueAuthorization is a current platform approval. What it approves is an +// execution inventory, `codefly/execution-inventory/v1`, whose one definition is +// the deployment contract module (github.com/codefly-dev/cli/contracts/deployment). +// The host does not re-describe that document: it names the approved inventory +// by the digest approval signs, carries the inventory's canonical bytes once per +// response (ListPlatformCatalogueResponse.approved_inventories), and reads them +// only through the contract. +type CatalogueAuthorization struct { + state protoimpl.MessageState `protogen:"open.v1"` + AuthorizedRevision int64 `protobuf:"varint,1,opt,name=authorized_revision,json=authorizedRevision,proto3" json:"authorized_revision,omitempty"` + // The approved inventory's digest, as the contract computes it over its + // canonical bytes. + InventoryDigest string `protobuf:"bytes,2,opt,name=inventory_digest,json=inventoryDigest,proto3" json:"inventory_digest,omitempty"` + // Which member of that inventory's delivery aggregate this entry is. + MemberBinding string `protobuf:"bytes,3,opt,name=member_binding,json=memberBinding,proto3" json:"member_binding,omitempty"` + // The build incarnation this host assigned to the approved execution. Not an + // inventory field: this host, and only this host, assigns it — advancing it + // whenever the approved execution changes — and a Work Context seals it beside + // the image digest. The verdict compares it with an observation's + // incarnation, which is the same host-assigned value as presented by the + // running workload; an incarnation from any other assigner would make that + // comparison meaningless, not merely wrong. + // + // Assigned from one, so zero is an approval that carries no incarnation + // rather than one approving incarnation zero. An approval at zero cannot + // produce an affirmative verdict: left uncompared, it would match any + // observation that also carries none. + BuildIncarnation uint64 `protobuf:"varint,4,opt,name=build_incarnation,json=buildIncarnation,proto3" json:"build_incarnation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueAuthorization) Reset() { + *x = CatalogueAuthorization{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueAuthorization) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueAuthorization) ProtoMessage() {} + +func (x *CatalogueAuthorization) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[35] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueAuthorization.ProtoReflect.Descriptor instead. +func (*CatalogueAuthorization) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{35} +} + +func (x *CatalogueAuthorization) GetAuthorizedRevision() int64 { + if x != nil { + return x.AuthorizedRevision + } + return 0 +} + +func (x *CatalogueAuthorization) GetInventoryDigest() string { + if x != nil { + return x.InventoryDigest + } + return "" +} + +func (x *CatalogueAuthorization) GetMemberBinding() string { + if x != nil { + return x.MemberBinding + } + return "" +} + +func (x *CatalogueAuthorization) GetBuildIncarnation() uint64 { + if x != nil { + return x.BuildIncarnation + } + return 0 +} + +// CatalogueNotAuthorized is a known absence of current authorization — +// never approved, or approval withdrawn. It is a statement the approval record +// makes, distinct from a CatalogueGap, where the host cannot tell. +type CatalogueNotAuthorized struct { + state protoimpl.MessageState `protogen:"open.v1"` + Detail string `protobuf:"bytes,1,opt,name=detail,proto3" json:"detail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueNotAuthorized) Reset() { + *x = CatalogueNotAuthorized{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueNotAuthorized) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueNotAuthorized) ProtoMessage() {} + +func (x *CatalogueNotAuthorized) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueNotAuthorized.ProtoReflect.Descriptor instead. +func (*CatalogueNotAuthorized) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{36} +} + +func (x *CatalogueNotAuthorized) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +// CatalogueAuthorized is what the platform has approved to execute. +type CatalogueAuthorized struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to AuthorizationValue: + // + // *CatalogueAuthorized_Authorization + // *CatalogueAuthorized_NotAuthorized + // *CatalogueAuthorized_AuthorizationGap + AuthorizationValue isCatalogueAuthorized_AuthorizationValue `protobuf_oneof:"authorization_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueAuthorized) Reset() { + *x = CatalogueAuthorized{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueAuthorized) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueAuthorized) ProtoMessage() {} + +func (x *CatalogueAuthorized) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueAuthorized.ProtoReflect.Descriptor instead. +func (*CatalogueAuthorized) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{37} +} + +func (x *CatalogueAuthorized) GetAuthorizationValue() isCatalogueAuthorized_AuthorizationValue { + if x != nil { + return x.AuthorizationValue + } + return nil +} + +func (x *CatalogueAuthorized) GetAuthorization() *CatalogueAuthorization { + if x != nil { + if x, ok := x.AuthorizationValue.(*CatalogueAuthorized_Authorization); ok { + return x.Authorization + } + } + return nil +} + +func (x *CatalogueAuthorized) GetNotAuthorized() *CatalogueNotAuthorized { + if x != nil { + if x, ok := x.AuthorizationValue.(*CatalogueAuthorized_NotAuthorized); ok { + return x.NotAuthorized + } + } + return nil +} + +func (x *CatalogueAuthorized) GetAuthorizationGap() *CatalogueGap { + if x != nil { + if x, ok := x.AuthorizationValue.(*CatalogueAuthorized_AuthorizationGap); ok { + return x.AuthorizationGap + } + } + return nil +} + +type isCatalogueAuthorized_AuthorizationValue interface { + isCatalogueAuthorized_AuthorizationValue() +} + +type CatalogueAuthorized_Authorization struct { + Authorization *CatalogueAuthorization `protobuf:"bytes,1,opt,name=authorization,proto3,oneof"` +} + +type CatalogueAuthorized_NotAuthorized struct { + NotAuthorized *CatalogueNotAuthorized `protobuf:"bytes,2,opt,name=not_authorized,json=notAuthorized,proto3,oneof"` +} + +type CatalogueAuthorized_AuthorizationGap struct { + AuthorizationGap *CatalogueGap `protobuf:"bytes,3,opt,name=authorization_gap,json=authorizationGap,proto3,oneof"` +} + +func (*CatalogueAuthorized_Authorization) isCatalogueAuthorized_AuthorizationValue() {} + +func (*CatalogueAuthorized_NotAuthorized) isCatalogueAuthorized_AuthorizationValue() {} + +func (*CatalogueAuthorized_AuthorizationGap) isCatalogueAuthorized_AuthorizationValue() {} + +// CatalogueApplied is what delivery actually wrote. +type CatalogueApplied struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to AppliedRevisionValue: + // + // *CatalogueApplied_AppliedRevision + // *CatalogueApplied_AppliedRevisionGap + AppliedRevisionValue isCatalogueApplied_AppliedRevisionValue `protobuf_oneof:"applied_revision_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueApplied) Reset() { + *x = CatalogueApplied{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueApplied) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueApplied) ProtoMessage() {} + +func (x *CatalogueApplied) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueApplied.ProtoReflect.Descriptor instead. +func (*CatalogueApplied) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{38} +} + +func (x *CatalogueApplied) GetAppliedRevisionValue() isCatalogueApplied_AppliedRevisionValue { + if x != nil { + return x.AppliedRevisionValue + } + return nil +} + +func (x *CatalogueApplied) GetAppliedRevision() int64 { + if x != nil { + if x, ok := x.AppliedRevisionValue.(*CatalogueApplied_AppliedRevision); ok { + return x.AppliedRevision + } + } + return 0 +} + +func (x *CatalogueApplied) GetAppliedRevisionGap() *CatalogueGap { + if x != nil { + if x, ok := x.AppliedRevisionValue.(*CatalogueApplied_AppliedRevisionGap); ok { + return x.AppliedRevisionGap + } + } + return nil +} + +type isCatalogueApplied_AppliedRevisionValue interface { + isCatalogueApplied_AppliedRevisionValue() +} + +type CatalogueApplied_AppliedRevision struct { + AppliedRevision int64 `protobuf:"varint,1,opt,name=applied_revision,json=appliedRevision,proto3,oneof"` +} + +type CatalogueApplied_AppliedRevisionGap struct { + AppliedRevisionGap *CatalogueGap `protobuf:"bytes,2,opt,name=applied_revision_gap,json=appliedRevisionGap,proto3,oneof"` +} + +func (*CatalogueApplied_AppliedRevision) isCatalogueApplied_AppliedRevisionValue() {} + +func (*CatalogueApplied_AppliedRevisionGap) isCatalogueApplied_AppliedRevisionValue() {} + +// CatalogueObservedExecution is what an observation found running for an entry: +// each container's image manifest digest, keyed "/" in the approved inventory's own names, and the build incarnation the +// running workload presents — the incarnation this host assigned, sealed into +// its Work Context, never one the workload or another party chose. +// Observation is the observing consumer's record, not the inventory's, so its +// shape is the host's. +type CatalogueObservedExecution struct { + state protoimpl.MessageState `protogen:"open.v1"` + ContainerImageDigests map[string]string `protobuf:"bytes,1,rep,name=container_image_digests,json=containerImageDigests,proto3" json:"container_image_digests,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + BuildIncarnation uint64 `protobuf:"varint,2,opt,name=build_incarnation,json=buildIncarnation,proto3" json:"build_incarnation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueObservedExecution) Reset() { + *x = CatalogueObservedExecution{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueObservedExecution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueObservedExecution) ProtoMessage() {} + +func (x *CatalogueObservedExecution) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueObservedExecution.ProtoReflect.Descriptor instead. +func (*CatalogueObservedExecution) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{39} +} + +func (x *CatalogueObservedExecution) GetContainerImageDigests() map[string]string { + if x != nil { + return x.ContainerImageDigests + } + return nil +} + +func (x *CatalogueObservedExecution) GetBuildIncarnation() uint64 { + if x != nil { + return x.BuildIncarnation + } + return 0 +} + +// CatalogueObserved is what is actually running. +type CatalogueObserved struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to ObservedRevisionValue: + // + // *CatalogueObserved_ObservedRevision + // *CatalogueObserved_ObservedRevisionGap + ObservedRevisionValue isCatalogueObserved_ObservedRevisionValue `protobuf_oneof:"observed_revision_value"` + // When the observation was made; a stale observation is never current. + // + // Types that are valid to be assigned to ObservationFreshnessValue: + // + // *CatalogueObserved_ObservedAt + // *CatalogueObserved_ObservationFreshnessGap + ObservationFreshnessValue isCatalogueObserved_ObservationFreshnessValue `protobuf_oneof:"observation_freshness_value"` + // Types that are valid to be assigned to ObservedExecutionValue: + // + // *CatalogueObserved_ObservedExecution + // *CatalogueObserved_ObservedExecutionGap + ObservedExecutionValue isCatalogueObserved_ObservedExecutionValue `protobuf_oneof:"observed_execution_value"` + // A verdict exists only when both a complete observation and a readable + // authorization do; anything less is a gap, and an unobserved or + // incompletely observed entry is never a match. + // + // RUNNING_AUTHORIZED is constructible only from an approval complete enough + // to judge against (an inventory this host holds at the digest approval + // signed, and a non-zero build_incarnation) and an observation that is + // complete, carries observed_at, and is within the validity this host treats + // as current. Any of those missing leaves a gap. The two verdicts that report + // trouble carry no such burden: a partly evidenced report of something wrong + // is still worth showing, while "Running authorized" beside "Not observed" is + // worse than nothing, because a reader sees it and stops looking. + // + // The rule is enforced where the verdict is made and again at the read + // boundary that serves it, so a reader of this response never has to re-derive + // it from the fields beside it. + // + // Types that are valid to be assigned to VerdictValue: + // + // *CatalogueObserved_Verdict + // *CatalogueObserved_VerdictGap + VerdictValue isCatalogueObserved_VerdictValue `protobuf_oneof:"verdict_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueObserved) Reset() { + *x = CatalogueObserved{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueObserved) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueObserved) ProtoMessage() {} + +func (x *CatalogueObserved) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[40] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueObserved.ProtoReflect.Descriptor instead. +func (*CatalogueObserved) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{40} +} + +func (x *CatalogueObserved) GetObservedRevisionValue() isCatalogueObserved_ObservedRevisionValue { + if x != nil { + return x.ObservedRevisionValue + } + return nil +} + +func (x *CatalogueObserved) GetObservedRevision() int64 { + if x != nil { + if x, ok := x.ObservedRevisionValue.(*CatalogueObserved_ObservedRevision); ok { + return x.ObservedRevision + } + } + return 0 +} + +func (x *CatalogueObserved) GetObservedRevisionGap() *CatalogueGap { + if x != nil { + if x, ok := x.ObservedRevisionValue.(*CatalogueObserved_ObservedRevisionGap); ok { + return x.ObservedRevisionGap + } + } + return nil +} + +func (x *CatalogueObserved) GetObservationFreshnessValue() isCatalogueObserved_ObservationFreshnessValue { + if x != nil { + return x.ObservationFreshnessValue + } + return nil +} + +func (x *CatalogueObserved) GetObservedAt() *timestamppb.Timestamp { + if x != nil { + if x, ok := x.ObservationFreshnessValue.(*CatalogueObserved_ObservedAt); ok { + return x.ObservedAt + } + } + return nil +} + +func (x *CatalogueObserved) GetObservationFreshnessGap() *CatalogueGap { + if x != nil { + if x, ok := x.ObservationFreshnessValue.(*CatalogueObserved_ObservationFreshnessGap); ok { + return x.ObservationFreshnessGap + } + } + return nil +} + +func (x *CatalogueObserved) GetObservedExecutionValue() isCatalogueObserved_ObservedExecutionValue { + if x != nil { + return x.ObservedExecutionValue + } + return nil +} + +func (x *CatalogueObserved) GetObservedExecution() *CatalogueObservedExecution { + if x != nil { + if x, ok := x.ObservedExecutionValue.(*CatalogueObserved_ObservedExecution); ok { + return x.ObservedExecution + } + } + return nil +} + +func (x *CatalogueObserved) GetObservedExecutionGap() *CatalogueGap { + if x != nil { + if x, ok := x.ObservedExecutionValue.(*CatalogueObserved_ObservedExecutionGap); ok { + return x.ObservedExecutionGap + } + } + return nil +} + +func (x *CatalogueObserved) GetVerdictValue() isCatalogueObserved_VerdictValue { + if x != nil { + return x.VerdictValue + } + return nil +} + +func (x *CatalogueObserved) GetVerdict() CatalogueObservedVerdict { + if x != nil { + if x, ok := x.VerdictValue.(*CatalogueObserved_Verdict); ok { + return x.Verdict + } + } + return CatalogueObservedVerdict_CATALOGUE_OBSERVED_VERDICT_UNSPECIFIED +} + +func (x *CatalogueObserved) GetVerdictGap() *CatalogueGap { + if x != nil { + if x, ok := x.VerdictValue.(*CatalogueObserved_VerdictGap); ok { + return x.VerdictGap + } + } + return nil +} + +type isCatalogueObserved_ObservedRevisionValue interface { + isCatalogueObserved_ObservedRevisionValue() +} + +type CatalogueObserved_ObservedRevision struct { + ObservedRevision int64 `protobuf:"varint,1,opt,name=observed_revision,json=observedRevision,proto3,oneof"` +} + +type CatalogueObserved_ObservedRevisionGap struct { + ObservedRevisionGap *CatalogueGap `protobuf:"bytes,2,opt,name=observed_revision_gap,json=observedRevisionGap,proto3,oneof"` +} + +func (*CatalogueObserved_ObservedRevision) isCatalogueObserved_ObservedRevisionValue() {} + +func (*CatalogueObserved_ObservedRevisionGap) isCatalogueObserved_ObservedRevisionValue() {} + +type isCatalogueObserved_ObservationFreshnessValue interface { + isCatalogueObserved_ObservationFreshnessValue() +} + +type CatalogueObserved_ObservedAt struct { + ObservedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=observed_at,json=observedAt,proto3,oneof"` +} + +type CatalogueObserved_ObservationFreshnessGap struct { + ObservationFreshnessGap *CatalogueGap `protobuf:"bytes,4,opt,name=observation_freshness_gap,json=observationFreshnessGap,proto3,oneof"` +} + +func (*CatalogueObserved_ObservedAt) isCatalogueObserved_ObservationFreshnessValue() {} + +func (*CatalogueObserved_ObservationFreshnessGap) isCatalogueObserved_ObservationFreshnessValue() {} + +type isCatalogueObserved_ObservedExecutionValue interface { + isCatalogueObserved_ObservedExecutionValue() +} + +type CatalogueObserved_ObservedExecution struct { + ObservedExecution *CatalogueObservedExecution `protobuf:"bytes,5,opt,name=observed_execution,json=observedExecution,proto3,oneof"` +} + +type CatalogueObserved_ObservedExecutionGap struct { + ObservedExecutionGap *CatalogueGap `protobuf:"bytes,6,opt,name=observed_execution_gap,json=observedExecutionGap,proto3,oneof"` +} + +func (*CatalogueObserved_ObservedExecution) isCatalogueObserved_ObservedExecutionValue() {} + +func (*CatalogueObserved_ObservedExecutionGap) isCatalogueObserved_ObservedExecutionValue() {} + +type isCatalogueObserved_VerdictValue interface { + isCatalogueObserved_VerdictValue() +} + +type CatalogueObserved_Verdict struct { + Verdict CatalogueObservedVerdict `protobuf:"varint,7,opt,name=verdict,proto3,enum=saas.accounts.v1.CatalogueObservedVerdict,oneof"` +} + +type CatalogueObserved_VerdictGap struct { + VerdictGap *CatalogueGap `protobuf:"bytes,8,opt,name=verdict_gap,json=verdictGap,proto3,oneof"` +} + +func (*CatalogueObserved_Verdict) isCatalogueObserved_VerdictValue() {} + +func (*CatalogueObserved_VerdictGap) isCatalogueObserved_VerdictValue() {} + +// CatalogueWithdrawing is approval withdrawn and retirement not yet complete, +// acknowledged separately from retirement itself. The value cases are the +// deployment contract's withdrawal and revocation records; until they exist +// each field holds only its gap. +type CatalogueWithdrawing struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to WithdrawalStateValue: + // + // *CatalogueWithdrawing_WithdrawalStateGap + WithdrawalStateValue isCatalogueWithdrawing_WithdrawalStateValue `protobuf_oneof:"withdrawal_state_value"` + // Types that are valid to be assigned to CredentialRevocationStateValue: + // + // *CatalogueWithdrawing_CredentialRevocationStateGap + CredentialRevocationStateValue isCatalogueWithdrawing_CredentialRevocationStateValue `protobuf_oneof:"credential_revocation_state_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueWithdrawing) Reset() { + *x = CatalogueWithdrawing{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueWithdrawing) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueWithdrawing) ProtoMessage() {} + +func (x *CatalogueWithdrawing) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueWithdrawing.ProtoReflect.Descriptor instead. +func (*CatalogueWithdrawing) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{41} +} + +func (x *CatalogueWithdrawing) GetWithdrawalStateValue() isCatalogueWithdrawing_WithdrawalStateValue { + if x != nil { + return x.WithdrawalStateValue + } + return nil +} + +func (x *CatalogueWithdrawing) GetWithdrawalStateGap() *CatalogueGap { + if x != nil { + if x, ok := x.WithdrawalStateValue.(*CatalogueWithdrawing_WithdrawalStateGap); ok { + return x.WithdrawalStateGap + } + } + return nil +} + +func (x *CatalogueWithdrawing) GetCredentialRevocationStateValue() isCatalogueWithdrawing_CredentialRevocationStateValue { + if x != nil { + return x.CredentialRevocationStateValue + } + return nil +} + +func (x *CatalogueWithdrawing) GetCredentialRevocationStateGap() *CatalogueGap { + if x != nil { + if x, ok := x.CredentialRevocationStateValue.(*CatalogueWithdrawing_CredentialRevocationStateGap); ok { + return x.CredentialRevocationStateGap + } + } + return nil +} + +type isCatalogueWithdrawing_WithdrawalStateValue interface { + isCatalogueWithdrawing_WithdrawalStateValue() +} + +type CatalogueWithdrawing_WithdrawalStateGap struct { + WithdrawalStateGap *CatalogueGap `protobuf:"bytes,1,opt,name=withdrawal_state_gap,json=withdrawalStateGap,proto3,oneof"` +} + +func (*CatalogueWithdrawing_WithdrawalStateGap) isCatalogueWithdrawing_WithdrawalStateValue() {} + +type isCatalogueWithdrawing_CredentialRevocationStateValue interface { + isCatalogueWithdrawing_CredentialRevocationStateValue() +} + +type CatalogueWithdrawing_CredentialRevocationStateGap struct { + CredentialRevocationStateGap *CatalogueGap `protobuf:"bytes,2,opt,name=credential_revocation_state_gap,json=credentialRevocationStateGap,proto3,oneof"` +} + +func (*CatalogueWithdrawing_CredentialRevocationStateGap) isCatalogueWithdrawing_CredentialRevocationStateValue() { +} + +// CatalogueRetired is whether the workload is physically stopped. Retired +// requires stop or fence evidence; until a retirement controller reports to +// this host, the field holds only its gap and nothing reads as retired. +type CatalogueRetired struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to RetirementStateValue: + // + // *CatalogueRetired_RetirementStateGap + RetirementStateValue isCatalogueRetired_RetirementStateValue `protobuf_oneof:"retirement_state_value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueRetired) Reset() { + *x = CatalogueRetired{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueRetired) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueRetired) ProtoMessage() {} + +func (x *CatalogueRetired) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueRetired.ProtoReflect.Descriptor instead. +func (*CatalogueRetired) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{42} +} + +func (x *CatalogueRetired) GetRetirementStateValue() isCatalogueRetired_RetirementStateValue { + if x != nil { + return x.RetirementStateValue + } + return nil +} + +func (x *CatalogueRetired) GetRetirementStateGap() *CatalogueGap { + if x != nil { + if x, ok := x.RetirementStateValue.(*CatalogueRetired_RetirementStateGap); ok { + return x.RetirementStateGap + } + } + return nil +} + +type isCatalogueRetired_RetirementStateValue interface { + isCatalogueRetired_RetirementStateValue() +} + +type CatalogueRetired_RetirementStateGap struct { + RetirementStateGap *CatalogueGap `protobuf:"bytes,1,opt,name=retirement_state_gap,json=retirementStateGap,proto3,oneof"` +} + +func (*CatalogueRetired_RetirementStateGap) isCatalogueRetired_RetirementStateValue() {} + +// CatalogueInstallation is one organization's installation of a solution. +type CatalogueInstallation struct { + state protoimpl.MessageState `protogen:"open.v1"` + Installation *Installation `protobuf:"bytes,1,opt,name=installation,proto3" json:"installation,omitempty"` + OrgName string `protobuf:"bytes,2,opt,name=org_name,json=orgName,proto3" json:"org_name,omitempty"` + // The release the installation's agent principal was created for, read from + // its canonical publisher/name:version identifier. + // + // Types that are valid to be assigned to AgentReleaseValue: + // + // *CatalogueInstallation_AgentRelease + // *CatalogueInstallation_AgentReleaseGap + AgentReleaseValue isCatalogueInstallation_AgentReleaseValue `protobuf_oneof:"agent_release_value"` + // The installation's own revision, independent of the deployment's. + // + // Types that are valid to be assigned to RevisionValue: + // + // *CatalogueInstallation_RevisionGap + RevisionValue isCatalogueInstallation_RevisionValue `protobuf_oneof:"revision_value"` + // Every team an active grant reaches inside this installation, in two kinds + // that are never merged: granted at this installation's authority root, and + // inherited from a grant above it. Both reach; only the first is exposure + // granted to this installation, so a reader is never shown inherited reach + // as if it had been granted here. + GrantedTeams []*CollectionReadGrant `protobuf:"bytes,6,rep,name=granted_teams,json=grantedTeams,proto3" json:"granted_teams,omitempty"` + InheritedTeams []*CollectionReadGrant `protobuf:"bytes,7,rep,name=inherited_teams,json=inheritedTeams,proto3" json:"inherited_teams,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CatalogueInstallation) Reset() { + *x = CatalogueInstallation{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CatalogueInstallation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CatalogueInstallation) ProtoMessage() {} + +func (x *CatalogueInstallation) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[43] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CatalogueInstallation.ProtoReflect.Descriptor instead. +func (*CatalogueInstallation) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{43} +} + +func (x *CatalogueInstallation) GetInstallation() *Installation { + if x != nil { + return x.Installation + } + return nil +} + +func (x *CatalogueInstallation) GetOrgName() string { + if x != nil { + return x.OrgName + } + return "" +} + +func (x *CatalogueInstallation) GetAgentReleaseValue() isCatalogueInstallation_AgentReleaseValue { + if x != nil { + return x.AgentReleaseValue + } + return nil +} + +func (x *CatalogueInstallation) GetAgentRelease() *CatalogueRelease { + if x != nil { + if x, ok := x.AgentReleaseValue.(*CatalogueInstallation_AgentRelease); ok { + return x.AgentRelease + } + } + return nil +} + +func (x *CatalogueInstallation) GetAgentReleaseGap() *CatalogueGap { + if x != nil { + if x, ok := x.AgentReleaseValue.(*CatalogueInstallation_AgentReleaseGap); ok { + return x.AgentReleaseGap + } + } + return nil } -func (*ListPlatformAdminsResponse) ProtoMessage() {} +func (x *CatalogueInstallation) GetRevisionValue() isCatalogueInstallation_RevisionValue { + if x != nil { + return x.RevisionValue + } + return nil +} -func (x *ListPlatformAdminsResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[21] +func (x *CatalogueInstallation) GetRevisionGap() *CatalogueGap { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) + if x, ok := x.RevisionValue.(*CatalogueInstallation_RevisionGap); ok { + return x.RevisionGap } - return ms } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListPlatformAdminsResponse.ProtoReflect.Descriptor instead. -func (*ListPlatformAdminsResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{21} +func (x *CatalogueInstallation) GetGrantedTeams() []*CollectionReadGrant { + if x != nil { + return x.GrantedTeams + } + return nil } -func (x *ListPlatformAdminsResponse) GetAdmins() []*PlatformAdminEntry { +func (x *CatalogueInstallation) GetInheritedTeams() []*CollectionReadGrant { if x != nil { - return x.Admins + return x.InheritedTeams } return nil } -type ListFeatureFlagsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type isCatalogueInstallation_AgentReleaseValue interface { + isCatalogueInstallation_AgentReleaseValue() } -func (x *ListFeatureFlagsRequest) Reset() { - *x = ListFeatureFlagsRequest{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +type CatalogueInstallation_AgentRelease struct { + AgentRelease *CatalogueRelease `protobuf:"bytes,3,opt,name=agent_release,json=agentRelease,proto3,oneof"` } -func (x *ListFeatureFlagsRequest) String() string { - return protoimpl.X.MessageStringOf(x) +type CatalogueInstallation_AgentReleaseGap struct { + AgentReleaseGap *CatalogueGap `protobuf:"bytes,4,opt,name=agent_release_gap,json=agentReleaseGap,proto3,oneof"` } -func (*ListFeatureFlagsRequest) ProtoMessage() {} +func (*CatalogueInstallation_AgentRelease) isCatalogueInstallation_AgentReleaseValue() {} -func (x *ListFeatureFlagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_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) +func (*CatalogueInstallation_AgentReleaseGap) isCatalogueInstallation_AgentReleaseValue() {} + +type isCatalogueInstallation_RevisionValue interface { + isCatalogueInstallation_RevisionValue() } -// Deprecated: Use ListFeatureFlagsRequest.ProtoReflect.Descriptor instead. -func (*ListFeatureFlagsRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{22} +type CatalogueInstallation_RevisionGap struct { + RevisionGap *CatalogueGap `protobuf:"bytes,5,opt,name=revision_gap,json=revisionGap,proto3,oneof"` } -type FeatureFlagEntry struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` - RolloutPercent int32 `protobuf:"varint,4,opt,name=rollout_percent,json=rolloutPercent,proto3" json:"rollout_percent,omitempty"` - TargetOrgIds []string `protobuf:"bytes,5,rep,name=target_org_ids,json=targetOrgIds,proto3" json:"target_org_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (*CatalogueInstallation_RevisionGap) isCatalogueInstallation_RevisionValue() {} + +// CatalogueEntry is one module or solution, placed in the registry's state +// model: desired, authorized, applied, observed, withdrawing and physically +// retired are distinct, and a row shows each separately, so an entry desired +// but not authorized, or observed but no longer authorized, reads as exactly +// that. +type CatalogueEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + Kind CatalogueEntryKind `protobuf:"varint,1,opt,name=kind,proto3,enum=saas.accounts.v1.CatalogueEntryKind" json:"kind,omitempty"` + // A module's principal prefix, or a solution's registry id — the identifier + // its installations name. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // The owner of record: a solution registration's publisher. + // + // Types that are valid to be assigned to PublisherValue: + // + // *CatalogueEntry_Publisher + // *CatalogueEntry_PublisherGap + PublisherValue isCatalogueEntry_PublisherValue `protobuf_oneof:"publisher_value"` + Desired *CatalogueDesired `protobuf:"bytes,5,opt,name=desired,proto3" json:"desired,omitempty"` + Authorized *CatalogueAuthorized `protobuf:"bytes,6,opt,name=authorized,proto3" json:"authorized,omitempty"` + Applied *CatalogueApplied `protobuf:"bytes,7,opt,name=applied,proto3" json:"applied,omitempty"` + Observed *CatalogueObserved `protobuf:"bytes,8,opt,name=observed,proto3" json:"observed,omitempty"` + Withdrawing *CatalogueWithdrawing `protobuf:"bytes,9,opt,name=withdrawing,proto3" json:"withdrawing,omitempty"` + Retired *CatalogueRetired `protobuf:"bytes,10,opt,name=retired,proto3" json:"retired,omitempty"` + // Lines of code, backend and frontend, vendored paths excluded. The value + // case is the presence document's build_size section (codefly-dev/core#708) + // as delivered; this host counts nothing itself. + // + // Types that are valid to be assigned to BuildSizeValue: + // + // *CatalogueEntry_BuildSizeGap + BuildSizeValue isCatalogueEntry_BuildSizeValue `protobuf_oneof:"build_size_value"` + // The solution's self-registration, with deployment topology withheld: the + // frontend manifest, backend upstream and service alias are always empty + // here, as on every browser-facing projection of the registry. Absent for a + // module, which does not self-register, and for a solution known only from + // its installations. + Registration *SolutionRegistration `protobuf:"bytes,12,opt,name=registration,proto3,oneof" json:"registration,omitempty"` + Installations []*CatalogueInstallation `protobuf:"bytes,13,rep,name=installations,proto3" json:"installations,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *FeatureFlagEntry) Reset() { - *x = FeatureFlagEntry{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[23] +func (x *CatalogueEntry) Reset() { + *x = CatalogueEntry{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *FeatureFlagEntry) String() string { +func (x *CatalogueEntry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FeatureFlagEntry) ProtoMessage() {} +func (*CatalogueEntry) ProtoMessage() {} -func (x *FeatureFlagEntry) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[23] +func (x *CatalogueEntry) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1332,120 +3232,171 @@ func (x *FeatureFlagEntry) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FeatureFlagEntry.ProtoReflect.Descriptor instead. -func (*FeatureFlagEntry) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{23} +// Deprecated: Use CatalogueEntry.ProtoReflect.Descriptor instead. +func (*CatalogueEntry) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{44} } -func (x *FeatureFlagEntry) GetName() string { +func (x *CatalogueEntry) GetKind() CatalogueEntryKind { + if x != nil { + return x.Kind + } + return CatalogueEntryKind_CATALOGUE_ENTRY_KIND_UNSPECIFIED +} + +func (x *CatalogueEntry) GetName() string { if x != nil { return x.Name } return "" } -func (x *FeatureFlagEntry) GetDescription() string { +func (x *CatalogueEntry) GetPublisherValue() isCatalogueEntry_PublisherValue { if x != nil { - return x.Description + return x.PublisherValue + } + return nil +} + +func (x *CatalogueEntry) GetPublisher() string { + if x != nil { + if x, ok := x.PublisherValue.(*CatalogueEntry_Publisher); ok { + return x.Publisher + } } return "" } -func (x *FeatureFlagEntry) GetEnabled() bool { +func (x *CatalogueEntry) GetPublisherGap() *CatalogueGap { if x != nil { - return x.Enabled + if x, ok := x.PublisherValue.(*CatalogueEntry_PublisherGap); ok { + return x.PublisherGap + } } - return false + return nil } -func (x *FeatureFlagEntry) GetRolloutPercent() int32 { +func (x *CatalogueEntry) GetDesired() *CatalogueDesired { if x != nil { - return x.RolloutPercent + return x.Desired } - return 0 + return nil } -func (x *FeatureFlagEntry) GetTargetOrgIds() []string { +func (x *CatalogueEntry) GetAuthorized() *CatalogueAuthorized { if x != nil { - return x.TargetOrgIds + return x.Authorized } return nil } -type ListFeatureFlagsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Flags []*FeatureFlagEntry `protobuf:"bytes,1,rep,name=flags,proto3" json:"flags,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (x *CatalogueEntry) GetApplied() *CatalogueApplied { + if x != nil { + return x.Applied + } + return nil } -func (x *ListFeatureFlagsResponse) Reset() { - *x = ListFeatureFlagsResponse{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *CatalogueEntry) GetObserved() *CatalogueObserved { + if x != nil { + return x.Observed + } + return nil } -func (x *ListFeatureFlagsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *CatalogueEntry) GetWithdrawing() *CatalogueWithdrawing { + if x != nil { + return x.Withdrawing + } + return nil } -func (*ListFeatureFlagsResponse) ProtoMessage() {} +func (x *CatalogueEntry) GetRetired() *CatalogueRetired { + if x != nil { + return x.Retired + } + return nil +} -func (x *ListFeatureFlagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[24] +func (x *CatalogueEntry) GetBuildSizeValue() isCatalogueEntry_BuildSizeValue { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) + return x.BuildSizeValue + } + return nil +} + +func (x *CatalogueEntry) GetBuildSizeGap() *CatalogueGap { + if x != nil { + if x, ok := x.BuildSizeValue.(*CatalogueEntry_BuildSizeGap); ok { + return x.BuildSizeGap } - return ms } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListFeatureFlagsResponse.ProtoReflect.Descriptor instead. -func (*ListFeatureFlagsResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{24} +func (x *CatalogueEntry) GetRegistration() *SolutionRegistration { + if x != nil { + return x.Registration + } + return nil } -func (x *ListFeatureFlagsResponse) GetFlags() []*FeatureFlagEntry { +func (x *CatalogueEntry) GetInstallations() []*CatalogueInstallation { if x != nil { - return x.Flags + return x.Installations } return nil } -// Deprecated: the database-backed flag inventory is read-only while consumers -// migrate to the provider-neutral feature-flags@1 capability. -// -// Deprecated: Marked as deprecated in saas/accounts/v1/platform_admin.proto. -type UpsertFeatureFlagRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` - RolloutPercent int32 `protobuf:"varint,4,opt,name=rollout_percent,json=rolloutPercent,proto3" json:"rollout_percent,omitempty"` - TargetOrgIds []string `protobuf:"bytes,5,rep,name=target_org_ids,json=targetOrgIds,proto3" json:"target_org_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type isCatalogueEntry_PublisherValue interface { + isCatalogueEntry_PublisherValue() } -func (x *UpsertFeatureFlagRequest) Reset() { - *x = UpsertFeatureFlagRequest{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[25] +type CatalogueEntry_Publisher struct { + Publisher string `protobuf:"bytes,3,opt,name=publisher,proto3,oneof"` +} + +type CatalogueEntry_PublisherGap struct { + PublisherGap *CatalogueGap `protobuf:"bytes,4,opt,name=publisher_gap,json=publisherGap,proto3,oneof"` +} + +func (*CatalogueEntry_Publisher) isCatalogueEntry_PublisherValue() {} + +func (*CatalogueEntry_PublisherGap) isCatalogueEntry_PublisherValue() {} + +type isCatalogueEntry_BuildSizeValue interface { + isCatalogueEntry_BuildSizeValue() +} + +type CatalogueEntry_BuildSizeGap struct { + BuildSizeGap *CatalogueGap `protobuf:"bytes,11,opt,name=build_size_gap,json=buildSizeGap,proto3,oneof"` +} + +func (*CatalogueEntry_BuildSizeGap) isCatalogueEntry_BuildSizeValue() {} + +type ListPlatformCatalogueRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Include deregistered solutions. Their installations are listed either way. + IncludeTombstoned bool `protobuf:"varint,1,opt,name=include_tombstoned,json=includeTombstoned,proto3" json:"include_tombstoned,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPlatformCatalogueRequest) Reset() { + *x = ListPlatformCatalogueRequest{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpsertFeatureFlagRequest) String() string { +func (x *ListPlatformCatalogueRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertFeatureFlagRequest) ProtoMessage() {} +func (*ListPlatformCatalogueRequest) ProtoMessage() {} -func (x *UpsertFeatureFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[25] +func (x *ListPlatformCatalogueRequest) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1456,71 +3407,48 @@ func (x *UpsertFeatureFlagRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertFeatureFlagRequest.ProtoReflect.Descriptor instead. -func (*UpsertFeatureFlagRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{25} -} - -func (x *UpsertFeatureFlagRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *UpsertFeatureFlagRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use ListPlatformCatalogueRequest.ProtoReflect.Descriptor instead. +func (*ListPlatformCatalogueRequest) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{45} } -func (x *UpsertFeatureFlagRequest) GetEnabled() bool { +func (x *ListPlatformCatalogueRequest) GetIncludeTombstoned() bool { if x != nil { - return x.Enabled + return x.IncludeTombstoned } return false } -func (x *UpsertFeatureFlagRequest) GetRolloutPercent() int32 { - if x != nil { - return x.RolloutPercent - } - return 0 -} - -func (x *UpsertFeatureFlagRequest) GetTargetOrgIds() []string { - if x != nil { - return x.TargetOrgIds - } - return nil -} - -// Deprecated: UpsertFeatureFlag always fails closed and returns no response. -// -// Deprecated: Marked as deprecated in saas/accounts/v1/platform_admin.proto. -type UpsertFeatureFlagResponse 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 *UpsertFeatureFlagResponse) Reset() { - *x = UpsertFeatureFlagResponse{} - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[26] +type ListPlatformCatalogueResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Modules first, then solutions, each ordered by name. + Entries []*CatalogueEntry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + // The registry revision the solution entries were read at. + RegistryRevision int64 `protobuf:"varint,2,opt,name=registry_revision,json=registryRevision,proto3" json:"registry_revision,omitempty"` + // Every approved execution inventory an entry's authorization names, keyed by + // its digest, in the deployment contract's canonical bytes (codefly-json-v1). + // Carried once per response because one delivery aggregate is approved as a + // whole and several entries can be members of it. + ApprovedInventories map[string][]byte `protobuf:"bytes,3,rep,name=approved_inventories,json=approvedInventories,proto3" json:"approved_inventories,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListPlatformCatalogueResponse) Reset() { + *x = ListPlatformCatalogueResponse{} + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpsertFeatureFlagResponse) String() string { +func (x *ListPlatformCatalogueResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertFeatureFlagResponse) ProtoMessage() {} +func (*ListPlatformCatalogueResponse) ProtoMessage() {} -func (x *UpsertFeatureFlagResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[26] +func (x *ListPlatformCatalogueResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_platform_admin_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1531,23 +3459,37 @@ func (x *UpsertFeatureFlagResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertFeatureFlagResponse.ProtoReflect.Descriptor instead. -func (*UpsertFeatureFlagResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{26} +// Deprecated: Use ListPlatformCatalogueResponse.ProtoReflect.Descriptor instead. +func (*ListPlatformCatalogueResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_platform_admin_proto_rawDescGZIP(), []int{46} } -func (x *UpsertFeatureFlagResponse) GetName() string { +func (x *ListPlatformCatalogueResponse) GetEntries() []*CatalogueEntry { if x != nil { - return x.Name + return x.Entries } - return "" + return nil +} + +func (x *ListPlatformCatalogueResponse) GetRegistryRevision() int64 { + if x != nil { + return x.RegistryRevision + } + return 0 +} + +func (x *ListPlatformCatalogueResponse) GetApprovedInventories() map[string][]byte { + if x != nil { + return x.ApprovedInventories + } + return nil } var File_saas_accounts_v1_platform_admin_proto protoreflect.FileDescriptor const file_saas_accounts_v1_platform_admin_proto_rawDesc = "" + "\n" + - "%saas/accounts/v1/platform_admin.proto\x12\x10saas.accounts.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1dsaas/accounts/v1/common.proto\x1a\x1fsaas/events/v1/operations.proto\x1a\x17saas/jobs/v1/jobs.proto\x1a\x1csaas/policy/v1/options.proto\"q\n" + + "%saas/accounts/v1/platform_admin.proto\x12\x10saas.accounts.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$saas/accounts/v1/authorization.proto\x1a\x1dsaas/accounts/v1/common.proto\x1a$saas/accounts/v1/installations.proto\x1a(saas/accounts/v1/solution_registry.proto\x1a\x1fsaas/events/v1/operations.proto\x1a\x17saas/jobs/v1/jobs.proto\x1a\x1csaas/policy/v1/options.proto\"q\n" + "\x12SearchUsersRequest\x12\x14\n" + "\x05query\x18\x01 \x01(\tR\x05query\x12&\n" + "\tpage_size\x18\x02 \x01(\x05B\t\xbaH\x06\x1a\x04\x18d \x00R\bpageSize\x12\x1d\n" + @@ -1557,7 +3499,23 @@ const file_saas_accounts_v1_platform_admin_proto_rawDesc = "" + "\x05users\x18\x01 \x03(\v2\x16.saas.accounts.v1.UserR\x05users\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x12\x1f\n" + "\vtotal_count\x18\x03 \x01(\x05R\n" + - "totalCount\"O\n" + + "totalCount\"\xa5\x01\n" + + "\x1bListAllOrganizationsRequest\x12\x14\n" + + "\x05query\x18\x01 \x01(\tR\x05query\x12&\n" + + "\tpage_size\x18\x02 \x01(\x05B\t\xbaH\x06\x1a\x04\x18d \x00R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\x12)\n" + + "\x10include_archived\x18\x04 \x01(\bR\x0fincludeArchived\"}\n" + + "\x14PlatformOrganization\x12B\n" + + "\forganization\x18\x01 \x01(\v2\x1e.saas.accounts.v1.OrganizationR\forganization\x12!\n" + + "\fmember_count\x18\x02 \x01(\x05R\vmemberCount\"\x94\x01\n" + + "\x1cListAllOrganizationsResponse\x12L\n" + + "\rorganizations\x18\x01 \x03(\v2&.saas.accounts.v1.PlatformOrganizationR\rorganizations\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"?\n" + + "\x1cGetOrganizationRosterRequest\x12\x1f\n" + + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\"Z\n" + + "\x1dGetOrganizationRosterResponse\x129\n" + + "\amembers\x18\x01 \x03(\v2\x1f.saas.accounts.v1.OrgMembershipR\amembers\"O\n" + "\x12SuspendUserRequest\x12!\n" + "\auser_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06userId\x12\x16\n" + "\x06reason\x18\x02 \x01(\tR\x06reason\"9\n" + @@ -1655,7 +3613,119 @@ const file_saas_accounts_v1_platform_admin_proto_rawDesc = "" + "\x0frollout_percent\x18\x04 \x01(\x05R\x0erolloutPercent\x12$\n" + "\x0etarget_org_ids\x18\x05 \x03(\tR\ftargetOrgIds:\x02\x18\x01\"3\n" + "\x19UpsertFeatureFlagResponse\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name:\x02\x18\x012\x95\x1c\n" + + "\x04name\x18\x01 \x01(\tR\x04name:\x02\x18\x01\"d\n" + + "\fCatalogueGap\x12<\n" + + "\x06reason\x18\x01 \x01(\x0e2$.saas.accounts.v1.CatalogueGapReasonR\x06reason\x12\x16\n" + + "\x06detail\x18\x02 \x01(\tR\x06detail\"^\n" + + "\x10CatalogueRelease\x12\x1c\n" + + "\tpublisher\x18\x01 \x01(\tR\tpublisher\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\aversion\x18\x03 \x01(\tR\aversion\"\xf1\x02\n" + + "\x10CatalogueDesired\x12-\n" + + "\x11declared_revision\x18\x01 \x01(\x03H\x00R\x10declaredRevision\x12T\n" + + "\x15declared_revision_gap\x18\x02 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x13declaredRevisionGap\x12O\n" + + "\x10declared_release\x18\x03 \x01(\v2\".saas.accounts.v1.CatalogueReleaseH\x01R\x0fdeclaredRelease\x12R\n" + + "\x14declared_release_gap\x18\x04 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x01R\x12declaredReleaseGapB\x19\n" + + "\x17declared_revision_valueB\x18\n" + + "\x16declared_release_value\"\xc8\x01\n" + + "\x16CatalogueAuthorization\x12/\n" + + "\x13authorized_revision\x18\x01 \x01(\x03R\x12authorizedRevision\x12)\n" + + "\x10inventory_digest\x18\x02 \x01(\tR\x0finventoryDigest\x12%\n" + + "\x0emember_binding\x18\x03 \x01(\tR\rmemberBinding\x12+\n" + + "\x11build_incarnation\x18\x04 \x01(\x04R\x10buildIncarnation\"0\n" + + "\x16CatalogueNotAuthorized\x12\x16\n" + + "\x06detail\x18\x01 \x01(\tR\x06detail\"\xa0\x02\n" + + "\x13CatalogueAuthorized\x12P\n" + + "\rauthorization\x18\x01 \x01(\v2(.saas.accounts.v1.CatalogueAuthorizationH\x00R\rauthorization\x12Q\n" + + "\x0enot_authorized\x18\x02 \x01(\v2(.saas.accounts.v1.CatalogueNotAuthorizedH\x00R\rnotAuthorized\x12M\n" + + "\x11authorization_gap\x18\x03 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x10authorizationGapB\x15\n" + + "\x13authorization_value\"\xad\x01\n" + + "\x10CatalogueApplied\x12+\n" + + "\x10applied_revision\x18\x01 \x01(\x03H\x00R\x0fappliedRevision\x12R\n" + + "\x14applied_revision_gap\x18\x02 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x12appliedRevisionGapB\x18\n" + + "\x16applied_revision_value\"\x94\x02\n" + + "\x1aCatalogueObservedExecution\x12\x7f\n" + + "\x17container_image_digests\x18\x01 \x03(\v2G.saas.accounts.v1.CatalogueObservedExecution.ContainerImageDigestsEntryR\x15containerImageDigests\x12+\n" + + "\x11build_incarnation\x18\x02 \x01(\x04R\x10buildIncarnation\x1aH\n" + + "\x1aContainerImageDigestsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xde\x05\n" + + "\x11CatalogueObserved\x12-\n" + + "\x11observed_revision\x18\x01 \x01(\x03H\x00R\x10observedRevision\x12T\n" + + "\x15observed_revision_gap\x18\x02 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x13observedRevisionGap\x12=\n" + + "\vobserved_at\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampH\x01R\n" + + "observedAt\x12\\\n" + + "\x19observation_freshness_gap\x18\x04 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x01R\x17observationFreshnessGap\x12]\n" + + "\x12observed_execution\x18\x05 \x01(\v2,.saas.accounts.v1.CatalogueObservedExecutionH\x02R\x11observedExecution\x12V\n" + + "\x16observed_execution_gap\x18\x06 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x02R\x14observedExecutionGap\x12F\n" + + "\averdict\x18\a \x01(\x0e2*.saas.accounts.v1.CatalogueObservedVerdictH\x03R\averdict\x12A\n" + + "\vverdict_gap\x18\b \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x03R\n" + + "verdictGapB\x19\n" + + "\x17observed_revision_valueB\x1d\n" + + "\x1bobservation_freshness_valueB\x1a\n" + + "\x18observed_execution_valueB\x0f\n" + + "\rverdict_value\"\x92\x02\n" + + "\x14CatalogueWithdrawing\x12R\n" + + "\x14withdrawal_state_gap\x18\x01 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x12withdrawalStateGap\x12g\n" + + "\x1fcredential_revocation_state_gap\x18\x02 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x01R\x1ccredentialRevocationStateGapB\x18\n" + + "\x16withdrawal_state_valueB#\n" + + "!credential_revocation_state_value\"\x80\x01\n" + + "\x10CatalogueRetired\x12R\n" + + "\x14retirement_state_gap\x18\x01 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x12retirementStateGapB\x18\n" + + "\x16retirement_state_value\"\x99\x04\n" + + "\x15CatalogueInstallation\x12B\n" + + "\finstallation\x18\x01 \x01(\v2\x1e.saas.accounts.v1.InstallationR\finstallation\x12\x19\n" + + "\borg_name\x18\x02 \x01(\tR\aorgName\x12I\n" + + "\ragent_release\x18\x03 \x01(\v2\".saas.accounts.v1.CatalogueReleaseH\x00R\fagentRelease\x12L\n" + + "\x11agent_release_gap\x18\x04 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\x0fagentReleaseGap\x12C\n" + + "\frevision_gap\x18\x05 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x01R\vrevisionGap\x12J\n" + + "\rgranted_teams\x18\x06 \x03(\v2%.saas.accounts.v1.CollectionReadGrantR\fgrantedTeams\x12N\n" + + "\x0finherited_teams\x18\a \x03(\v2%.saas.accounts.v1.CollectionReadGrantR\x0einheritedTeamsB\x15\n" + + "\x13agent_release_valueB\x10\n" + + "\x0erevision_value\"\xf1\x06\n" + + "\x0eCatalogueEntry\x128\n" + + "\x04kind\x18\x01 \x01(\x0e2$.saas.accounts.v1.CatalogueEntryKindR\x04kind\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1e\n" + + "\tpublisher\x18\x03 \x01(\tH\x00R\tpublisher\x12E\n" + + "\rpublisher_gap\x18\x04 \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x00R\fpublisherGap\x12<\n" + + "\adesired\x18\x05 \x01(\v2\".saas.accounts.v1.CatalogueDesiredR\adesired\x12E\n" + + "\n" + + "authorized\x18\x06 \x01(\v2%.saas.accounts.v1.CatalogueAuthorizedR\n" + + "authorized\x12<\n" + + "\aapplied\x18\a \x01(\v2\".saas.accounts.v1.CatalogueAppliedR\aapplied\x12?\n" + + "\bobserved\x18\b \x01(\v2#.saas.accounts.v1.CatalogueObservedR\bobserved\x12H\n" + + "\vwithdrawing\x18\t \x01(\v2&.saas.accounts.v1.CatalogueWithdrawingR\vwithdrawing\x12<\n" + + "\aretired\x18\n" + + " \x01(\v2\".saas.accounts.v1.CatalogueRetiredR\aretired\x12F\n" + + "\x0ebuild_size_gap\x18\v \x01(\v2\x1e.saas.accounts.v1.CatalogueGapH\x01R\fbuildSizeGap\x12O\n" + + "\fregistration\x18\f \x01(\v2&.saas.accounts.v1.SolutionRegistrationH\x02R\fregistration\x88\x01\x01\x12M\n" + + "\rinstallations\x18\r \x03(\v2'.saas.accounts.v1.CatalogueInstallationR\rinstallationsB\x11\n" + + "\x0fpublisher_valueB\x12\n" + + "\x10build_size_valueB\x0f\n" + + "\r_registration\"M\n" + + "\x1cListPlatformCatalogueRequest\x12-\n" + + "\x12include_tombstoned\x18\x01 \x01(\bR\x11includeTombstoned\"\xcd\x02\n" + + "\x1dListPlatformCatalogueResponse\x12:\n" + + "\aentries\x18\x01 \x03(\v2 .saas.accounts.v1.CatalogueEntryR\aentries\x12+\n" + + "\x11registry_revision\x18\x02 \x01(\x03R\x10registryRevision\x12{\n" + + "\x14approved_inventories\x18\x03 \x03(\v2H.saas.accounts.v1.ListPlatformCatalogueResponse.ApprovedInventoriesEntryR\x13approvedInventories\x1aF\n" + + "\x18ApprovedInventoriesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\fR\x05value:\x028\x01*~\n" + + "\x12CatalogueEntryKind\x12$\n" + + " CATALOGUE_ENTRY_KIND_UNSPECIFIED\x10\x00\x12\x1f\n" + + "\x1bCATALOGUE_ENTRY_KIND_MODULE\x10\x01\x12!\n" + + "\x1dCATALOGUE_ENTRY_KIND_SOLUTION\x10\x02*\xaf\x01\n" + + "\x12CatalogueGapReason\x12$\n" + + " CATALOGUE_GAP_REASON_UNSPECIFIED\x10\x00\x12%\n" + + "!CATALOGUE_GAP_REASON_NOT_RECORDED\x10\x01\x12%\n" + + "!CATALOGUE_GAP_REASON_NOT_REPORTED\x10\x02\x12%\n" + + "!CATALOGUE_GAP_REASON_NOT_OBSERVED\x10\x03*\xde\x01\n" + + "\x18CatalogueObservedVerdict\x12*\n" + + "&CATALOGUE_OBSERVED_VERDICT_UNSPECIFIED\x10\x00\x121\n" + + "-CATALOGUE_OBSERVED_VERDICT_RUNNING_AUTHORIZED\x10\x01\x12.\n" + + "*CATALOGUE_OBSERVED_VERDICT_RUNNING_DIFFERS\x10\x02\x123\n" + + "/CATALOGUE_OBSERVED_VERDICT_RUNNING_UNAUTHORIZED\x10\x032\xef\x1f\n" + "\x14PlatformAdminService\x12\x8e\x01\n" + "\vSearchUsers\x12$.saas.accounts.v1.SearchUsersRequest\x1a%.saas.accounts.v1.SearchUsersResponse\"2\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x03\x82\xd3\xe4\x93\x02\x14\x12\x12/v1/platform/users\x12\xab\x01\n" + "\vSuspendUser\x12$.saas.accounts.v1.SuspendUserRequest\x1a\x16.google.protobuf.Empty\"^\xc2\xf3\x18+\b\x02\x10\x010\x01:\x17\n" + @@ -1677,7 +3747,9 @@ const file_saas_accounts_v1_platform_admin_proto_rawDesc = "" + "\x1asaas.platform.role_granted\x10\x02@\x01H\x05P\x03X\x03`\x05x\x02\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/v1/platform/admins\x12\xb6\x01\n" + "\x12RevokePlatformRole\x12+.saas.accounts.v1.RevokePlatformRoleRequest\x1a\x16.google.protobuf.Empty\"[\xc2\xf3\x182\b\x02\x10\x010\x04:\x1e\n" + "\x1asaas.platform.role_revoked\x10\x02@\x01H\x05P\x03X\x03`\x05x\x02\x82\xd3\xe4\x93\x02\x1f*\x1d/v1/platform/admins/{user_id}\x12\xa4\x01\n" + - "\x12ListPlatformAdmins\x12+.saas.accounts.v1.ListPlatformAdminsRequest\x1a,.saas.accounts.v1.ListPlatformAdminsResponse\"3\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02\x15\x12\x13/v1/platform/admins\x12\xa5\x01\n" + + "\x12ListPlatformAdmins\x12+.saas.accounts.v1.ListPlatformAdminsRequest\x1a,.saas.accounts.v1.ListPlatformAdminsResponse\"3\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02\x15\x12\x13/v1/platform/admins\x12\x8f\x01\n" + + "\x14ListAllOrganizations\x12-.saas.accounts.v1.ListAllOrganizationsRequest\x1a..saas.accounts.v1.ListAllOrganizationsResponse\"\x18\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x03\x12\x92\x01\n" + + "\x15GetOrganizationRoster\x12..saas.accounts.v1.GetOrganizationRosterRequest\x1a/.saas.accounts.v1.GetOrganizationRosterResponse\"\x18\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x03\x12\xa5\x01\n" + "\x10ListFeatureFlags\x12).saas.accounts.v1.ListFeatureFlagsRequest\x1a*.saas.accounts.v1.ListFeatureFlagsResponse\":\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02\x1c\x12\x1a/v1/platform/feature-flags\x12\xd2\x01\n" + "\x11UpsertFeatureFlag\x12*.saas.accounts.v1.UpsertFeatureFlagRequest\x1a+.saas.accounts.v1.UpsertFeatureFlagResponse\"d\xc2\xf3\x181\b\x02\x10\x010\x01:\x1d\n" + "\x19saas.feature_flag.updated\x10\x02@\x01H\x05P\x03X\x03`\x05x\x02\x82\xd3\xe4\x93\x02&:\x01*\x1a!/v1/platform/feature-flags/{name}\x88\x02\x01\x12\x9f\x01\n" + @@ -1687,7 +3759,8 @@ const file_saas_accounts_v1_platform_admin_proto_rawDesc = "" + "\tReplayJob\x12\x1e.saas.jobs.v1.ReplayJobRequest\x1a\x1f.saas.jobs.v1.ReplayJobResponse\"^\xc2\xf3\x18'\b\x02\x10\x010\x03:\x15\n" + "\x11saas.job.replayed\x10\x02@\x03H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02-:\x01*\"(/v1/platform/jobs/{source_job_id}:replay\x12\xab\x01\n" + "\x12GetEventOperations\x12).saas.events.v1.GetEventOperationsRequest\x1a*.saas.events.v1.GetEventOperationsResponse\">\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02 \x12\x1e/v1/platform/events/operations\x12\xba\x01\n" + - "\x16ListEventSubscriptions\x12-.saas.events.v1.ListEventSubscriptionsRequest\x1a..saas.events.v1.ListEventSubscriptionsResponse\"A\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02#\x12!/v1/platform/events/subscriptionsB\xd0\x01\n" + + "\x16ListEventSubscriptions\x12-.saas.events.v1.ListEventSubscriptionsRequest\x1a..saas.events.v1.ListEventSubscriptionsResponse\"A\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02#\x12!/v1/platform/events/subscriptions\x12\xb0\x01\n" + + "\x15ListPlatformCatalogue\x12..saas.accounts.v1.ListPlatformCatalogueRequest\x1a/.saas.accounts.v1.ListPlatformCatalogueResponse\"6\xc2\xf3\x18\x14\b\x02\x10\x010\x01:\x02\x10\x01@\x01H\x05P\x03X\x03`\x05\x82\xd3\xe4\x93\x02\x18\x12\x16/v1/platform/catalogueB\xd0\x01\n" + "\x14com.saas.accounts.v1B\x12PlatformAdminProtoP\x01ZBgithub.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1;accountsv1\xa2\x02\x03SAX\xaa\x02\x10Saas.Accounts.V1\xca\x02\x10Saas\\Accounts\\V1\xe2\x02\x1cSaas\\Accounts\\V1\\GPBMetadata\xea\x02\x12Saas::Accounts::V1b\x06proto3" var ( @@ -1702,109 +3775,187 @@ func file_saas_accounts_v1_platform_admin_proto_rawDescGZIP() []byte { return file_saas_accounts_v1_platform_admin_proto_rawDescData } -var file_saas_accounts_v1_platform_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_saas_accounts_v1_platform_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_saas_accounts_v1_platform_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 50) var file_saas_accounts_v1_platform_admin_proto_goTypes = []any{ - (*SearchUsersRequest)(nil), // 0: saas.accounts.v1.SearchUsersRequest - (*SearchUsersResponse)(nil), // 1: saas.accounts.v1.SearchUsersResponse - (*SuspendUserRequest)(nil), // 2: saas.accounts.v1.SuspendUserRequest - (*UnsuspendUserRequest)(nil), // 3: saas.accounts.v1.UnsuspendUserRequest - (*ImpersonateUserRequest)(nil), // 4: saas.accounts.v1.ImpersonateUserRequest - (*ImpersonateUserResponse)(nil), // 5: saas.accounts.v1.ImpersonateUserResponse - (*StopImpersonationRequest)(nil), // 6: saas.accounts.v1.StopImpersonationRequest - (*StopImpersonationResponse)(nil), // 7: saas.accounts.v1.StopImpersonationResponse - (*ListActiveSessionsRequest)(nil), // 8: saas.accounts.v1.ListActiveSessionsRequest - (*SessionInfo)(nil), // 9: saas.accounts.v1.SessionInfo - (*ListActiveSessionsResponse)(nil), // 10: saas.accounts.v1.ListActiveSessionsResponse - (*RevokeSessionRequest)(nil), // 11: saas.accounts.v1.RevokeSessionRequest - (*GetOrgEntitlementsRequest)(nil), // 12: saas.accounts.v1.GetOrgEntitlementsRequest - (*GetOrgEntitlementsResponse)(nil), // 13: saas.accounts.v1.GetOrgEntitlementsResponse - (*EntitlementInfo)(nil), // 14: saas.accounts.v1.EntitlementInfo - (*OverrideEntitlementRequest)(nil), // 15: saas.accounts.v1.OverrideEntitlementRequest - (*OverrideEntitlementResponse)(nil), // 16: saas.accounts.v1.OverrideEntitlementResponse - (*GrantPlatformRoleRequest)(nil), // 17: saas.accounts.v1.GrantPlatformRoleRequest - (*RevokePlatformRoleRequest)(nil), // 18: saas.accounts.v1.RevokePlatformRoleRequest - (*ListPlatformAdminsRequest)(nil), // 19: saas.accounts.v1.ListPlatformAdminsRequest - (*PlatformAdminEntry)(nil), // 20: saas.accounts.v1.PlatformAdminEntry - (*ListPlatformAdminsResponse)(nil), // 21: saas.accounts.v1.ListPlatformAdminsResponse - (*ListFeatureFlagsRequest)(nil), // 22: saas.accounts.v1.ListFeatureFlagsRequest - (*FeatureFlagEntry)(nil), // 23: saas.accounts.v1.FeatureFlagEntry - (*ListFeatureFlagsResponse)(nil), // 24: saas.accounts.v1.ListFeatureFlagsResponse - (*UpsertFeatureFlagRequest)(nil), // 25: saas.accounts.v1.UpsertFeatureFlagRequest - (*UpsertFeatureFlagResponse)(nil), // 26: saas.accounts.v1.UpsertFeatureFlagResponse - nil, // 27: saas.accounts.v1.SessionInfo.DeviceInfoEntry - (*User)(nil), // 28: saas.accounts.v1.User - (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp - (*v1.GetJobOperationsRequest)(nil), // 30: saas.jobs.v1.GetJobOperationsRequest - (*v1.ListJobsRequest)(nil), // 31: saas.jobs.v1.ListJobsRequest - (*v1.GetJobRequest)(nil), // 32: saas.jobs.v1.GetJobRequest - (*v1.ReplayJobRequest)(nil), // 33: saas.jobs.v1.ReplayJobRequest - (*v11.GetEventOperationsRequest)(nil), // 34: saas.events.v1.GetEventOperationsRequest - (*v11.ListEventSubscriptionsRequest)(nil), // 35: saas.events.v1.ListEventSubscriptionsRequest - (*emptypb.Empty)(nil), // 36: google.protobuf.Empty - (*v1.GetJobOperationsResponse)(nil), // 37: saas.jobs.v1.GetJobOperationsResponse - (*v1.ListJobsResponse)(nil), // 38: saas.jobs.v1.ListJobsResponse - (*v1.GetJobResponse)(nil), // 39: saas.jobs.v1.GetJobResponse - (*v1.ReplayJobResponse)(nil), // 40: saas.jobs.v1.ReplayJobResponse - (*v11.GetEventOperationsResponse)(nil), // 41: saas.events.v1.GetEventOperationsResponse - (*v11.ListEventSubscriptionsResponse)(nil), // 42: saas.events.v1.ListEventSubscriptionsResponse + (CatalogueEntryKind)(0), // 0: saas.accounts.v1.CatalogueEntryKind + (CatalogueGapReason)(0), // 1: saas.accounts.v1.CatalogueGapReason + (CatalogueObservedVerdict)(0), // 2: saas.accounts.v1.CatalogueObservedVerdict + (*SearchUsersRequest)(nil), // 3: saas.accounts.v1.SearchUsersRequest + (*SearchUsersResponse)(nil), // 4: saas.accounts.v1.SearchUsersResponse + (*ListAllOrganizationsRequest)(nil), // 5: saas.accounts.v1.ListAllOrganizationsRequest + (*PlatformOrganization)(nil), // 6: saas.accounts.v1.PlatformOrganization + (*ListAllOrganizationsResponse)(nil), // 7: saas.accounts.v1.ListAllOrganizationsResponse + (*GetOrganizationRosterRequest)(nil), // 8: saas.accounts.v1.GetOrganizationRosterRequest + (*GetOrganizationRosterResponse)(nil), // 9: saas.accounts.v1.GetOrganizationRosterResponse + (*SuspendUserRequest)(nil), // 10: saas.accounts.v1.SuspendUserRequest + (*UnsuspendUserRequest)(nil), // 11: saas.accounts.v1.UnsuspendUserRequest + (*ImpersonateUserRequest)(nil), // 12: saas.accounts.v1.ImpersonateUserRequest + (*ImpersonateUserResponse)(nil), // 13: saas.accounts.v1.ImpersonateUserResponse + (*StopImpersonationRequest)(nil), // 14: saas.accounts.v1.StopImpersonationRequest + (*StopImpersonationResponse)(nil), // 15: saas.accounts.v1.StopImpersonationResponse + (*ListActiveSessionsRequest)(nil), // 16: saas.accounts.v1.ListActiveSessionsRequest + (*SessionInfo)(nil), // 17: saas.accounts.v1.SessionInfo + (*ListActiveSessionsResponse)(nil), // 18: saas.accounts.v1.ListActiveSessionsResponse + (*RevokeSessionRequest)(nil), // 19: saas.accounts.v1.RevokeSessionRequest + (*GetOrgEntitlementsRequest)(nil), // 20: saas.accounts.v1.GetOrgEntitlementsRequest + (*GetOrgEntitlementsResponse)(nil), // 21: saas.accounts.v1.GetOrgEntitlementsResponse + (*EntitlementInfo)(nil), // 22: saas.accounts.v1.EntitlementInfo + (*OverrideEntitlementRequest)(nil), // 23: saas.accounts.v1.OverrideEntitlementRequest + (*OverrideEntitlementResponse)(nil), // 24: saas.accounts.v1.OverrideEntitlementResponse + (*GrantPlatformRoleRequest)(nil), // 25: saas.accounts.v1.GrantPlatformRoleRequest + (*RevokePlatformRoleRequest)(nil), // 26: saas.accounts.v1.RevokePlatformRoleRequest + (*ListPlatformAdminsRequest)(nil), // 27: saas.accounts.v1.ListPlatformAdminsRequest + (*PlatformAdminEntry)(nil), // 28: saas.accounts.v1.PlatformAdminEntry + (*ListPlatformAdminsResponse)(nil), // 29: saas.accounts.v1.ListPlatformAdminsResponse + (*ListFeatureFlagsRequest)(nil), // 30: saas.accounts.v1.ListFeatureFlagsRequest + (*FeatureFlagEntry)(nil), // 31: saas.accounts.v1.FeatureFlagEntry + (*ListFeatureFlagsResponse)(nil), // 32: saas.accounts.v1.ListFeatureFlagsResponse + (*UpsertFeatureFlagRequest)(nil), // 33: saas.accounts.v1.UpsertFeatureFlagRequest + (*UpsertFeatureFlagResponse)(nil), // 34: saas.accounts.v1.UpsertFeatureFlagResponse + (*CatalogueGap)(nil), // 35: saas.accounts.v1.CatalogueGap + (*CatalogueRelease)(nil), // 36: saas.accounts.v1.CatalogueRelease + (*CatalogueDesired)(nil), // 37: saas.accounts.v1.CatalogueDesired + (*CatalogueAuthorization)(nil), // 38: saas.accounts.v1.CatalogueAuthorization + (*CatalogueNotAuthorized)(nil), // 39: saas.accounts.v1.CatalogueNotAuthorized + (*CatalogueAuthorized)(nil), // 40: saas.accounts.v1.CatalogueAuthorized + (*CatalogueApplied)(nil), // 41: saas.accounts.v1.CatalogueApplied + (*CatalogueObservedExecution)(nil), // 42: saas.accounts.v1.CatalogueObservedExecution + (*CatalogueObserved)(nil), // 43: saas.accounts.v1.CatalogueObserved + (*CatalogueWithdrawing)(nil), // 44: saas.accounts.v1.CatalogueWithdrawing + (*CatalogueRetired)(nil), // 45: saas.accounts.v1.CatalogueRetired + (*CatalogueInstallation)(nil), // 46: saas.accounts.v1.CatalogueInstallation + (*CatalogueEntry)(nil), // 47: saas.accounts.v1.CatalogueEntry + (*ListPlatformCatalogueRequest)(nil), // 48: saas.accounts.v1.ListPlatformCatalogueRequest + (*ListPlatformCatalogueResponse)(nil), // 49: saas.accounts.v1.ListPlatformCatalogueResponse + nil, // 50: saas.accounts.v1.SessionInfo.DeviceInfoEntry + nil, // 51: saas.accounts.v1.CatalogueObservedExecution.ContainerImageDigestsEntry + nil, // 52: saas.accounts.v1.ListPlatformCatalogueResponse.ApprovedInventoriesEntry + (*User)(nil), // 53: saas.accounts.v1.User + (*Organization)(nil), // 54: saas.accounts.v1.Organization + (*OrgMembership)(nil), // 55: saas.accounts.v1.OrgMembership + (*timestamppb.Timestamp)(nil), // 56: google.protobuf.Timestamp + (*Installation)(nil), // 57: saas.accounts.v1.Installation + (*CollectionReadGrant)(nil), // 58: saas.accounts.v1.CollectionReadGrant + (*SolutionRegistration)(nil), // 59: saas.accounts.v1.SolutionRegistration + (*v1.GetJobOperationsRequest)(nil), // 60: saas.jobs.v1.GetJobOperationsRequest + (*v1.ListJobsRequest)(nil), // 61: saas.jobs.v1.ListJobsRequest + (*v1.GetJobRequest)(nil), // 62: saas.jobs.v1.GetJobRequest + (*v1.ReplayJobRequest)(nil), // 63: saas.jobs.v1.ReplayJobRequest + (*v11.GetEventOperationsRequest)(nil), // 64: saas.events.v1.GetEventOperationsRequest + (*v11.ListEventSubscriptionsRequest)(nil), // 65: saas.events.v1.ListEventSubscriptionsRequest + (*emptypb.Empty)(nil), // 66: google.protobuf.Empty + (*v1.GetJobOperationsResponse)(nil), // 67: saas.jobs.v1.GetJobOperationsResponse + (*v1.ListJobsResponse)(nil), // 68: saas.jobs.v1.ListJobsResponse + (*v1.GetJobResponse)(nil), // 69: saas.jobs.v1.GetJobResponse + (*v1.ReplayJobResponse)(nil), // 70: saas.jobs.v1.ReplayJobResponse + (*v11.GetEventOperationsResponse)(nil), // 71: saas.events.v1.GetEventOperationsResponse + (*v11.ListEventSubscriptionsResponse)(nil), // 72: saas.events.v1.ListEventSubscriptionsResponse } var file_saas_accounts_v1_platform_admin_proto_depIdxs = []int32{ - 28, // 0: saas.accounts.v1.SearchUsersResponse.users:type_name -> saas.accounts.v1.User - 27, // 1: saas.accounts.v1.SessionInfo.device_info:type_name -> saas.accounts.v1.SessionInfo.DeviceInfoEntry - 29, // 2: saas.accounts.v1.SessionInfo.created_at:type_name -> google.protobuf.Timestamp - 29, // 3: saas.accounts.v1.SessionInfo.last_active_at:type_name -> google.protobuf.Timestamp - 29, // 4: saas.accounts.v1.SessionInfo.expires_at:type_name -> google.protobuf.Timestamp - 29, // 5: saas.accounts.v1.SessionInfo.idle_expires_at:type_name -> google.protobuf.Timestamp - 9, // 6: saas.accounts.v1.ListActiveSessionsResponse.sessions:type_name -> saas.accounts.v1.SessionInfo - 14, // 7: saas.accounts.v1.GetOrgEntitlementsResponse.entitlements:type_name -> saas.accounts.v1.EntitlementInfo - 29, // 8: saas.accounts.v1.PlatformAdminEntry.granted_at:type_name -> google.protobuf.Timestamp - 20, // 9: saas.accounts.v1.ListPlatformAdminsResponse.admins:type_name -> saas.accounts.v1.PlatformAdminEntry - 23, // 10: saas.accounts.v1.ListFeatureFlagsResponse.flags:type_name -> saas.accounts.v1.FeatureFlagEntry - 0, // 11: saas.accounts.v1.PlatformAdminService.SearchUsers:input_type -> saas.accounts.v1.SearchUsersRequest - 2, // 12: saas.accounts.v1.PlatformAdminService.SuspendUser:input_type -> saas.accounts.v1.SuspendUserRequest - 3, // 13: saas.accounts.v1.PlatformAdminService.UnsuspendUser:input_type -> saas.accounts.v1.UnsuspendUserRequest - 4, // 14: saas.accounts.v1.PlatformAdminService.ImpersonateUser:input_type -> saas.accounts.v1.ImpersonateUserRequest - 6, // 15: saas.accounts.v1.PlatformAdminService.StopImpersonation:input_type -> saas.accounts.v1.StopImpersonationRequest - 8, // 16: saas.accounts.v1.PlatformAdminService.ListActiveSessions:input_type -> saas.accounts.v1.ListActiveSessionsRequest - 11, // 17: saas.accounts.v1.PlatformAdminService.RevokeSession:input_type -> saas.accounts.v1.RevokeSessionRequest - 12, // 18: saas.accounts.v1.PlatformAdminService.GetOrgEntitlements:input_type -> saas.accounts.v1.GetOrgEntitlementsRequest - 15, // 19: saas.accounts.v1.PlatformAdminService.OverrideEntitlement:input_type -> saas.accounts.v1.OverrideEntitlementRequest - 17, // 20: saas.accounts.v1.PlatformAdminService.GrantPlatformRole:input_type -> saas.accounts.v1.GrantPlatformRoleRequest - 18, // 21: saas.accounts.v1.PlatformAdminService.RevokePlatformRole:input_type -> saas.accounts.v1.RevokePlatformRoleRequest - 19, // 22: saas.accounts.v1.PlatformAdminService.ListPlatformAdmins:input_type -> saas.accounts.v1.ListPlatformAdminsRequest - 22, // 23: saas.accounts.v1.PlatformAdminService.ListFeatureFlags:input_type -> saas.accounts.v1.ListFeatureFlagsRequest - 25, // 24: saas.accounts.v1.PlatformAdminService.UpsertFeatureFlag:input_type -> saas.accounts.v1.UpsertFeatureFlagRequest - 30, // 25: saas.accounts.v1.PlatformAdminService.GetJobOperations:input_type -> saas.jobs.v1.GetJobOperationsRequest - 31, // 26: saas.accounts.v1.PlatformAdminService.ListJobs:input_type -> saas.jobs.v1.ListJobsRequest - 32, // 27: saas.accounts.v1.PlatformAdminService.GetJob:input_type -> saas.jobs.v1.GetJobRequest - 33, // 28: saas.accounts.v1.PlatformAdminService.ReplayJob:input_type -> saas.jobs.v1.ReplayJobRequest - 34, // 29: saas.accounts.v1.PlatformAdminService.GetEventOperations:input_type -> saas.events.v1.GetEventOperationsRequest - 35, // 30: saas.accounts.v1.PlatformAdminService.ListEventSubscriptions:input_type -> saas.events.v1.ListEventSubscriptionsRequest - 1, // 31: saas.accounts.v1.PlatformAdminService.SearchUsers:output_type -> saas.accounts.v1.SearchUsersResponse - 36, // 32: saas.accounts.v1.PlatformAdminService.SuspendUser:output_type -> google.protobuf.Empty - 36, // 33: saas.accounts.v1.PlatformAdminService.UnsuspendUser:output_type -> google.protobuf.Empty - 5, // 34: saas.accounts.v1.PlatformAdminService.ImpersonateUser:output_type -> saas.accounts.v1.ImpersonateUserResponse - 7, // 35: saas.accounts.v1.PlatformAdminService.StopImpersonation:output_type -> saas.accounts.v1.StopImpersonationResponse - 10, // 36: saas.accounts.v1.PlatformAdminService.ListActiveSessions:output_type -> saas.accounts.v1.ListActiveSessionsResponse - 36, // 37: saas.accounts.v1.PlatformAdminService.RevokeSession:output_type -> google.protobuf.Empty - 13, // 38: saas.accounts.v1.PlatformAdminService.GetOrgEntitlements:output_type -> saas.accounts.v1.GetOrgEntitlementsResponse - 16, // 39: saas.accounts.v1.PlatformAdminService.OverrideEntitlement:output_type -> saas.accounts.v1.OverrideEntitlementResponse - 36, // 40: saas.accounts.v1.PlatformAdminService.GrantPlatformRole:output_type -> google.protobuf.Empty - 36, // 41: saas.accounts.v1.PlatformAdminService.RevokePlatformRole:output_type -> google.protobuf.Empty - 21, // 42: saas.accounts.v1.PlatformAdminService.ListPlatformAdmins:output_type -> saas.accounts.v1.ListPlatformAdminsResponse - 24, // 43: saas.accounts.v1.PlatformAdminService.ListFeatureFlags:output_type -> saas.accounts.v1.ListFeatureFlagsResponse - 26, // 44: saas.accounts.v1.PlatformAdminService.UpsertFeatureFlag:output_type -> saas.accounts.v1.UpsertFeatureFlagResponse - 37, // 45: saas.accounts.v1.PlatformAdminService.GetJobOperations:output_type -> saas.jobs.v1.GetJobOperationsResponse - 38, // 46: saas.accounts.v1.PlatformAdminService.ListJobs:output_type -> saas.jobs.v1.ListJobsResponse - 39, // 47: saas.accounts.v1.PlatformAdminService.GetJob:output_type -> saas.jobs.v1.GetJobResponse - 40, // 48: saas.accounts.v1.PlatformAdminService.ReplayJob:output_type -> saas.jobs.v1.ReplayJobResponse - 41, // 49: saas.accounts.v1.PlatformAdminService.GetEventOperations:output_type -> saas.events.v1.GetEventOperationsResponse - 42, // 50: saas.accounts.v1.PlatformAdminService.ListEventSubscriptions:output_type -> saas.events.v1.ListEventSubscriptionsResponse - 31, // [31:51] is the sub-list for method output_type - 11, // [11:31] 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 + 53, // 0: saas.accounts.v1.SearchUsersResponse.users:type_name -> saas.accounts.v1.User + 54, // 1: saas.accounts.v1.PlatformOrganization.organization:type_name -> saas.accounts.v1.Organization + 6, // 2: saas.accounts.v1.ListAllOrganizationsResponse.organizations:type_name -> saas.accounts.v1.PlatformOrganization + 55, // 3: saas.accounts.v1.GetOrganizationRosterResponse.members:type_name -> saas.accounts.v1.OrgMembership + 50, // 4: saas.accounts.v1.SessionInfo.device_info:type_name -> saas.accounts.v1.SessionInfo.DeviceInfoEntry + 56, // 5: saas.accounts.v1.SessionInfo.created_at:type_name -> google.protobuf.Timestamp + 56, // 6: saas.accounts.v1.SessionInfo.last_active_at:type_name -> google.protobuf.Timestamp + 56, // 7: saas.accounts.v1.SessionInfo.expires_at:type_name -> google.protobuf.Timestamp + 56, // 8: saas.accounts.v1.SessionInfo.idle_expires_at:type_name -> google.protobuf.Timestamp + 17, // 9: saas.accounts.v1.ListActiveSessionsResponse.sessions:type_name -> saas.accounts.v1.SessionInfo + 22, // 10: saas.accounts.v1.GetOrgEntitlementsResponse.entitlements:type_name -> saas.accounts.v1.EntitlementInfo + 56, // 11: saas.accounts.v1.PlatformAdminEntry.granted_at:type_name -> google.protobuf.Timestamp + 28, // 12: saas.accounts.v1.ListPlatformAdminsResponse.admins:type_name -> saas.accounts.v1.PlatformAdminEntry + 31, // 13: saas.accounts.v1.ListFeatureFlagsResponse.flags:type_name -> saas.accounts.v1.FeatureFlagEntry + 1, // 14: saas.accounts.v1.CatalogueGap.reason:type_name -> saas.accounts.v1.CatalogueGapReason + 35, // 15: saas.accounts.v1.CatalogueDesired.declared_revision_gap:type_name -> saas.accounts.v1.CatalogueGap + 36, // 16: saas.accounts.v1.CatalogueDesired.declared_release:type_name -> saas.accounts.v1.CatalogueRelease + 35, // 17: saas.accounts.v1.CatalogueDesired.declared_release_gap:type_name -> saas.accounts.v1.CatalogueGap + 38, // 18: saas.accounts.v1.CatalogueAuthorized.authorization:type_name -> saas.accounts.v1.CatalogueAuthorization + 39, // 19: saas.accounts.v1.CatalogueAuthorized.not_authorized:type_name -> saas.accounts.v1.CatalogueNotAuthorized + 35, // 20: saas.accounts.v1.CatalogueAuthorized.authorization_gap:type_name -> saas.accounts.v1.CatalogueGap + 35, // 21: saas.accounts.v1.CatalogueApplied.applied_revision_gap:type_name -> saas.accounts.v1.CatalogueGap + 51, // 22: saas.accounts.v1.CatalogueObservedExecution.container_image_digests:type_name -> saas.accounts.v1.CatalogueObservedExecution.ContainerImageDigestsEntry + 35, // 23: saas.accounts.v1.CatalogueObserved.observed_revision_gap:type_name -> saas.accounts.v1.CatalogueGap + 56, // 24: saas.accounts.v1.CatalogueObserved.observed_at:type_name -> google.protobuf.Timestamp + 35, // 25: saas.accounts.v1.CatalogueObserved.observation_freshness_gap:type_name -> saas.accounts.v1.CatalogueGap + 42, // 26: saas.accounts.v1.CatalogueObserved.observed_execution:type_name -> saas.accounts.v1.CatalogueObservedExecution + 35, // 27: saas.accounts.v1.CatalogueObserved.observed_execution_gap:type_name -> saas.accounts.v1.CatalogueGap + 2, // 28: saas.accounts.v1.CatalogueObserved.verdict:type_name -> saas.accounts.v1.CatalogueObservedVerdict + 35, // 29: saas.accounts.v1.CatalogueObserved.verdict_gap:type_name -> saas.accounts.v1.CatalogueGap + 35, // 30: saas.accounts.v1.CatalogueWithdrawing.withdrawal_state_gap:type_name -> saas.accounts.v1.CatalogueGap + 35, // 31: saas.accounts.v1.CatalogueWithdrawing.credential_revocation_state_gap:type_name -> saas.accounts.v1.CatalogueGap + 35, // 32: saas.accounts.v1.CatalogueRetired.retirement_state_gap:type_name -> saas.accounts.v1.CatalogueGap + 57, // 33: saas.accounts.v1.CatalogueInstallation.installation:type_name -> saas.accounts.v1.Installation + 36, // 34: saas.accounts.v1.CatalogueInstallation.agent_release:type_name -> saas.accounts.v1.CatalogueRelease + 35, // 35: saas.accounts.v1.CatalogueInstallation.agent_release_gap:type_name -> saas.accounts.v1.CatalogueGap + 35, // 36: saas.accounts.v1.CatalogueInstallation.revision_gap:type_name -> saas.accounts.v1.CatalogueGap + 58, // 37: saas.accounts.v1.CatalogueInstallation.granted_teams:type_name -> saas.accounts.v1.CollectionReadGrant + 58, // 38: saas.accounts.v1.CatalogueInstallation.inherited_teams:type_name -> saas.accounts.v1.CollectionReadGrant + 0, // 39: saas.accounts.v1.CatalogueEntry.kind:type_name -> saas.accounts.v1.CatalogueEntryKind + 35, // 40: saas.accounts.v1.CatalogueEntry.publisher_gap:type_name -> saas.accounts.v1.CatalogueGap + 37, // 41: saas.accounts.v1.CatalogueEntry.desired:type_name -> saas.accounts.v1.CatalogueDesired + 40, // 42: saas.accounts.v1.CatalogueEntry.authorized:type_name -> saas.accounts.v1.CatalogueAuthorized + 41, // 43: saas.accounts.v1.CatalogueEntry.applied:type_name -> saas.accounts.v1.CatalogueApplied + 43, // 44: saas.accounts.v1.CatalogueEntry.observed:type_name -> saas.accounts.v1.CatalogueObserved + 44, // 45: saas.accounts.v1.CatalogueEntry.withdrawing:type_name -> saas.accounts.v1.CatalogueWithdrawing + 45, // 46: saas.accounts.v1.CatalogueEntry.retired:type_name -> saas.accounts.v1.CatalogueRetired + 35, // 47: saas.accounts.v1.CatalogueEntry.build_size_gap:type_name -> saas.accounts.v1.CatalogueGap + 59, // 48: saas.accounts.v1.CatalogueEntry.registration:type_name -> saas.accounts.v1.SolutionRegistration + 46, // 49: saas.accounts.v1.CatalogueEntry.installations:type_name -> saas.accounts.v1.CatalogueInstallation + 47, // 50: saas.accounts.v1.ListPlatformCatalogueResponse.entries:type_name -> saas.accounts.v1.CatalogueEntry + 52, // 51: saas.accounts.v1.ListPlatformCatalogueResponse.approved_inventories:type_name -> saas.accounts.v1.ListPlatformCatalogueResponse.ApprovedInventoriesEntry + 3, // 52: saas.accounts.v1.PlatformAdminService.SearchUsers:input_type -> saas.accounts.v1.SearchUsersRequest + 10, // 53: saas.accounts.v1.PlatformAdminService.SuspendUser:input_type -> saas.accounts.v1.SuspendUserRequest + 11, // 54: saas.accounts.v1.PlatformAdminService.UnsuspendUser:input_type -> saas.accounts.v1.UnsuspendUserRequest + 12, // 55: saas.accounts.v1.PlatformAdminService.ImpersonateUser:input_type -> saas.accounts.v1.ImpersonateUserRequest + 14, // 56: saas.accounts.v1.PlatformAdminService.StopImpersonation:input_type -> saas.accounts.v1.StopImpersonationRequest + 16, // 57: saas.accounts.v1.PlatformAdminService.ListActiveSessions:input_type -> saas.accounts.v1.ListActiveSessionsRequest + 19, // 58: saas.accounts.v1.PlatformAdminService.RevokeSession:input_type -> saas.accounts.v1.RevokeSessionRequest + 20, // 59: saas.accounts.v1.PlatformAdminService.GetOrgEntitlements:input_type -> saas.accounts.v1.GetOrgEntitlementsRequest + 23, // 60: saas.accounts.v1.PlatformAdminService.OverrideEntitlement:input_type -> saas.accounts.v1.OverrideEntitlementRequest + 25, // 61: saas.accounts.v1.PlatformAdminService.GrantPlatformRole:input_type -> saas.accounts.v1.GrantPlatformRoleRequest + 26, // 62: saas.accounts.v1.PlatformAdminService.RevokePlatformRole:input_type -> saas.accounts.v1.RevokePlatformRoleRequest + 27, // 63: saas.accounts.v1.PlatformAdminService.ListPlatformAdmins:input_type -> saas.accounts.v1.ListPlatformAdminsRequest + 5, // 64: saas.accounts.v1.PlatformAdminService.ListAllOrganizations:input_type -> saas.accounts.v1.ListAllOrganizationsRequest + 8, // 65: saas.accounts.v1.PlatformAdminService.GetOrganizationRoster:input_type -> saas.accounts.v1.GetOrganizationRosterRequest + 30, // 66: saas.accounts.v1.PlatformAdminService.ListFeatureFlags:input_type -> saas.accounts.v1.ListFeatureFlagsRequest + 33, // 67: saas.accounts.v1.PlatformAdminService.UpsertFeatureFlag:input_type -> saas.accounts.v1.UpsertFeatureFlagRequest + 60, // 68: saas.accounts.v1.PlatformAdminService.GetJobOperations:input_type -> saas.jobs.v1.GetJobOperationsRequest + 61, // 69: saas.accounts.v1.PlatformAdminService.ListJobs:input_type -> saas.jobs.v1.ListJobsRequest + 62, // 70: saas.accounts.v1.PlatformAdminService.GetJob:input_type -> saas.jobs.v1.GetJobRequest + 63, // 71: saas.accounts.v1.PlatformAdminService.ReplayJob:input_type -> saas.jobs.v1.ReplayJobRequest + 64, // 72: saas.accounts.v1.PlatformAdminService.GetEventOperations:input_type -> saas.events.v1.GetEventOperationsRequest + 65, // 73: saas.accounts.v1.PlatformAdminService.ListEventSubscriptions:input_type -> saas.events.v1.ListEventSubscriptionsRequest + 48, // 74: saas.accounts.v1.PlatformAdminService.ListPlatformCatalogue:input_type -> saas.accounts.v1.ListPlatformCatalogueRequest + 4, // 75: saas.accounts.v1.PlatformAdminService.SearchUsers:output_type -> saas.accounts.v1.SearchUsersResponse + 66, // 76: saas.accounts.v1.PlatformAdminService.SuspendUser:output_type -> google.protobuf.Empty + 66, // 77: saas.accounts.v1.PlatformAdminService.UnsuspendUser:output_type -> google.protobuf.Empty + 13, // 78: saas.accounts.v1.PlatformAdminService.ImpersonateUser:output_type -> saas.accounts.v1.ImpersonateUserResponse + 15, // 79: saas.accounts.v1.PlatformAdminService.StopImpersonation:output_type -> saas.accounts.v1.StopImpersonationResponse + 18, // 80: saas.accounts.v1.PlatformAdminService.ListActiveSessions:output_type -> saas.accounts.v1.ListActiveSessionsResponse + 66, // 81: saas.accounts.v1.PlatformAdminService.RevokeSession:output_type -> google.protobuf.Empty + 21, // 82: saas.accounts.v1.PlatformAdminService.GetOrgEntitlements:output_type -> saas.accounts.v1.GetOrgEntitlementsResponse + 24, // 83: saas.accounts.v1.PlatformAdminService.OverrideEntitlement:output_type -> saas.accounts.v1.OverrideEntitlementResponse + 66, // 84: saas.accounts.v1.PlatformAdminService.GrantPlatformRole:output_type -> google.protobuf.Empty + 66, // 85: saas.accounts.v1.PlatformAdminService.RevokePlatformRole:output_type -> google.protobuf.Empty + 29, // 86: saas.accounts.v1.PlatformAdminService.ListPlatformAdmins:output_type -> saas.accounts.v1.ListPlatformAdminsResponse + 7, // 87: saas.accounts.v1.PlatformAdminService.ListAllOrganizations:output_type -> saas.accounts.v1.ListAllOrganizationsResponse + 9, // 88: saas.accounts.v1.PlatformAdminService.GetOrganizationRoster:output_type -> saas.accounts.v1.GetOrganizationRosterResponse + 32, // 89: saas.accounts.v1.PlatformAdminService.ListFeatureFlags:output_type -> saas.accounts.v1.ListFeatureFlagsResponse + 34, // 90: saas.accounts.v1.PlatformAdminService.UpsertFeatureFlag:output_type -> saas.accounts.v1.UpsertFeatureFlagResponse + 67, // 91: saas.accounts.v1.PlatformAdminService.GetJobOperations:output_type -> saas.jobs.v1.GetJobOperationsResponse + 68, // 92: saas.accounts.v1.PlatformAdminService.ListJobs:output_type -> saas.jobs.v1.ListJobsResponse + 69, // 93: saas.accounts.v1.PlatformAdminService.GetJob:output_type -> saas.jobs.v1.GetJobResponse + 70, // 94: saas.accounts.v1.PlatformAdminService.ReplayJob:output_type -> saas.jobs.v1.ReplayJobResponse + 71, // 95: saas.accounts.v1.PlatformAdminService.GetEventOperations:output_type -> saas.events.v1.GetEventOperationsResponse + 72, // 96: saas.accounts.v1.PlatformAdminService.ListEventSubscriptions:output_type -> saas.events.v1.ListEventSubscriptionsResponse + 49, // 97: saas.accounts.v1.PlatformAdminService.ListPlatformCatalogue:output_type -> saas.accounts.v1.ListPlatformCatalogueResponse + 75, // [75:98] is the sub-list for method output_type + 52, // [52:75] is the sub-list for method input_type + 52, // [52:52] is the sub-list for extension type_name + 52, // [52:52] is the sub-list for extension extendee + 0, // [0:52] is the sub-list for field type_name } func init() { file_saas_accounts_v1_platform_admin_proto_init() } @@ -1812,19 +3963,65 @@ func file_saas_accounts_v1_platform_admin_proto_init() { if File_saas_accounts_v1_platform_admin_proto != nil { return } + file_saas_accounts_v1_authorization_proto_init() file_saas_accounts_v1_common_proto_init() + file_saas_accounts_v1_installations_proto_init() + file_saas_accounts_v1_solution_registry_proto_init() + file_saas_accounts_v1_platform_admin_proto_msgTypes[34].OneofWrappers = []any{ + (*CatalogueDesired_DeclaredRevision)(nil), + (*CatalogueDesired_DeclaredRevisionGap)(nil), + (*CatalogueDesired_DeclaredRelease)(nil), + (*CatalogueDesired_DeclaredReleaseGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[37].OneofWrappers = []any{ + (*CatalogueAuthorized_Authorization)(nil), + (*CatalogueAuthorized_NotAuthorized)(nil), + (*CatalogueAuthorized_AuthorizationGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[38].OneofWrappers = []any{ + (*CatalogueApplied_AppliedRevision)(nil), + (*CatalogueApplied_AppliedRevisionGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[40].OneofWrappers = []any{ + (*CatalogueObserved_ObservedRevision)(nil), + (*CatalogueObserved_ObservedRevisionGap)(nil), + (*CatalogueObserved_ObservedAt)(nil), + (*CatalogueObserved_ObservationFreshnessGap)(nil), + (*CatalogueObserved_ObservedExecution)(nil), + (*CatalogueObserved_ObservedExecutionGap)(nil), + (*CatalogueObserved_Verdict)(nil), + (*CatalogueObserved_VerdictGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[41].OneofWrappers = []any{ + (*CatalogueWithdrawing_WithdrawalStateGap)(nil), + (*CatalogueWithdrawing_CredentialRevocationStateGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[42].OneofWrappers = []any{ + (*CatalogueRetired_RetirementStateGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[43].OneofWrappers = []any{ + (*CatalogueInstallation_AgentRelease)(nil), + (*CatalogueInstallation_AgentReleaseGap)(nil), + (*CatalogueInstallation_RevisionGap)(nil), + } + file_saas_accounts_v1_platform_admin_proto_msgTypes[44].OneofWrappers = []any{ + (*CatalogueEntry_Publisher)(nil), + (*CatalogueEntry_PublisherGap)(nil), + (*CatalogueEntry_BuildSizeGap)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_platform_admin_proto_rawDesc), len(file_saas_accounts_v1_platform_admin_proto_rawDesc)), - NumEnums: 0, - NumMessages: 28, + NumEnums: 3, + NumMessages: 50, NumExtensions: 0, NumServices: 1, }, GoTypes: file_saas_accounts_v1_platform_admin_proto_goTypes, DependencyIndexes: file_saas_accounts_v1_platform_admin_proto_depIdxs, + EnumInfos: file_saas_accounts_v1_platform_admin_proto_enumTypes, MessageInfos: file_saas_accounts_v1_platform_admin_proto_msgTypes, }.Build() File_saas_accounts_v1_platform_admin_proto = out.File diff --git a/gen/saas/accounts/v1/solution_registry.pb.go b/gen/saas/accounts/v1/solution_registry.pb.go index 4afe705..883b212 100644 --- a/gen/saas/accounts/v1/solution_registry.pb.go +++ b/gen/saas/accounts/v1/solution_registry.pb.go @@ -253,15 +253,27 @@ type SolutionRegistration struct { SolutionId string `protobuf:"bytes,1,opt,name=solution_id,json=solutionId,proto3" json:"solution_id,omitempty"` // Owner of record. First claim binds it; a registration naming a different // publisher is refused rather than overwriting. - Publisher string `protobuf:"bytes,2,opt,name=publisher,proto3" json:"publisher,omitempty"` - Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` - Status SolutionRegistrationStatus `protobuf:"varint,4,opt,name=status,proto3,enum=saas.accounts.v1.SolutionRegistrationStatus" json:"status,omitempty"` - Frontend *SolutionFrontendBinding `protobuf:"bytes,5,opt,name=frontend,proto3,oneof" json:"frontend,omitempty"` - Backend *SolutionBackendBinding `protobuf:"bytes,6,opt,name=backend,proto3,oneof" json:"backend,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - TombstonedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=tombstoned_at,json=tombstonedAt,proto3,oneof" json:"tombstoned_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Publisher string `protobuf:"bytes,2,opt,name=publisher,proto3" json:"publisher,omitempty"` + Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Status SolutionRegistrationStatus `protobuf:"varint,4,opt,name=status,proto3,enum=saas.accounts.v1.SolutionRegistrationStatus" json:"status,omitempty"` + Frontend *SolutionFrontendBinding `protobuf:"bytes,5,opt,name=frontend,proto3,oneof" json:"frontend,omitempty"` + Backend *SolutionBackendBinding `protobuf:"bytes,6,opt,name=backend,proto3,oneof" json:"backend,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + TombstonedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=tombstoned_at,json=tombstonedAt,proto3,oneof" json:"tombstoned_at,omitempty"` + // The seed a solution's runtime boundary is derived from (issue #1015). + // + // ALWAYS EMPTY on the wire, on every response, deliberately. The seed is + // assigned by this service when the record is created and never again, and it + // is the only input to the per-organization boundary every Work Context + // minted for that solution is sealed under — so it is what stands between one + // solution's runs and another's. No registrant needs it: accounts derives and + // seals the boundary from the credential the solution already presents. + // + // The field is kept rather than removed so this promise is testable: a change + // that starts populating it fails a test instead of shipping. + RuntimeBoundary string `protobuf:"bytes,9,opt,name=runtime_boundary,json=runtimeBoundary,proto3" json:"runtime_boundary,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SolutionRegistration) Reset() { @@ -350,6 +362,13 @@ func (x *SolutionRegistration) GetTombstonedAt() *timestamppb.Timestamp { return nil } +func (x *SolutionRegistration) GetRuntimeBoundary() string { + if x != nil { + return x.RuntimeBoundary + } + return "" +} + // SolutionFrontendRegistration is the caller-supplied frontend half. Revision // and lease are assigned by the server, never proposed by the registrant. type SolutionFrontendRegistration struct { @@ -768,7 +787,7 @@ const file_saas_accounts_v1_solution_registry_proto_rawDesc = "" + "\bupstream\x18\x02 \x01(\tR\bupstream\x12#\n" + "\rservice_alias\x18\x03 \x01(\tR\fserviceAlias\x12)\n" + "\x10contract_version\x18\x04 \x01(\tR\x0fcontractVersion\x12D\n" + - "\x10lease_expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\x0eleaseExpiresAt\"\xf8\x03\n" + + "\x10lease_expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\x0eleaseExpiresAt\"\xa3\x04\n" + "\x14SolutionRegistration\x12\x1f\n" + "\vsolution_id\x18\x01 \x01(\tR\n" + "solutionId\x12\x1c\n" + @@ -779,7 +798,8 @@ const file_saas_accounts_v1_solution_registry_proto_rawDesc = "" + "\abackend\x18\x06 \x01(\v2(.saas.accounts.v1.SolutionBackendBindingH\x01R\abackend\x88\x01\x01\x129\n" + "\n" + "updated_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12D\n" + - "\rtombstoned_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampH\x02R\ftombstonedAt\x88\x01\x01B\v\n" + + "\rtombstoned_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampH\x02R\ftombstonedAt\x88\x01\x01\x12)\n" + + "\x10runtime_boundary\x18\t \x01(\tR\x0fruntimeBoundaryB\v\n" + "\t_frontendB\n" + "\n" + "\b_backendB\x10\n" + diff --git a/gen/saas/accounts/v1/work_contexts.pb.go b/gen/saas/accounts/v1/work_contexts.pb.go index ebef993..e27ffb7 100644 --- a/gen/saas/accounts/v1/work_contexts.pb.go +++ b/gen/saas/accounts/v1/work_contexts.pb.go @@ -141,10 +141,21 @@ func (x *WorkContextScope) GetResourceIds() []string { } type StartTaskWorkContextRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` - TaskId string `protobuf:"bytes,2,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` - SessionId string `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + // The runtime boundary the capability is minted under. Required on an + // ordinary mint, where the caller owns the Task it names. + // + // FORBIDDEN on a solution-scoped mint. The host assigns each registered + // solution one opaque boundary at registration and seals that one, so a + // solution never chooses the boundary its runs are visible under and can + // never name another solution's (issue #1015). Which of the two a request is + // depends on the credential it carries, which no schema rule can see, so the + // rule here is only "a UUID when present" and the handler refuses the wrong + // shape on either path: an absent boundary on an ordinary mint, a named one + // on a solution-scoped mint. + TaskId string `protobuf:"bytes,2,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + SessionId string `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` // Empty means a direct human-owned Task. Otherwise this must name an active, // registered agent Principal in org_id. ActorPrincipalId string `protobuf:"bytes,4,opt,name=actor_principal_id,json=actorPrincipalId,proto3" json:"actor_principal_id,omitempty"` @@ -1163,10 +1174,10 @@ const file_saas_accounts_v1_work_contexts_proto_rawDesc = "" + "\rresource_kind\x18\x01 \x01(\tB\n" + "\xbaH\ar\x05\x10\x01\x18\x80\x01R\fresourceKind\x12/\n" + "\aactions\x18\x02 \x03(\tB\x15\xbaH\x12\x92\x01\x0f\b\x01\x10@\x18\x01\"\ar\x05\x10\x01\x18\x80\x01R\aactions\x127\n" + - "\fresource_ids\x18\x03 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\x10\x80\x02\x18\x01\"\ar\x05\x10\x01\x18\x80\x04R\vresourceIds\"\xbc\x04\n" + + "\fresource_ids\x18\x03 \x03(\tB\x14\xbaH\x11\x92\x01\x0e\x10\x80\x02\x18\x01\"\ar\x05\x10\x01\x18\x80\x04R\vresourceIds\"\xbf\x04\n" + "\x1bStartTaskWorkContextRequest\x12\x1f\n" + - "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12!\n" + - "\atask_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06taskId\x12'\n" + + "\x06org_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x05orgId\x12$\n" + + "\atask_id\x18\x02 \x01(\tB\v\xbaH\b\xd8\x01\x01r\x03\xb0\x01\x01R\x06taskId\x12'\n" + "\n" + "session_id\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\tsessionId\x12,\n" + "\x12actor_principal_id\x18\x04 \x01(\tR\x10actorPrincipalId\x12Y\n" + diff --git a/moduleauthority/host_fake_test.go b/moduleauthority/host_fake_test.go index c0e54b2..cf138e7 100644 --- a/moduleauthority/host_fake_test.go +++ b/moduleauthority/host_fake_test.go @@ -248,6 +248,8 @@ func (g *fakeGateway) snapshot() (calls, stray []string, bodies map[string][]map // authorityCall is one call the fake authority endpoint received. type authorityCall struct { + boundary *v1.VerifyWorkContextRuntimeBoundaryRequest + authorization []string method string internalToken []string workContext []string @@ -259,6 +261,7 @@ type authorityCall struct { // servedOnAuthority is the slice of business.ModuleAuthorityProcedures this // package calls; Mint* are never among them. var servedOnAuthority = map[string]bool{ + accountsv1connect.ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure: true, accountsv1connect.ModuleCapabilitiesServiceExchangeDelegatedOperationAudienceProcedure: true, accountsv1connect.ModuleCapabilitiesServiceExchangeDelegatedReadAudienceProcedure: true, accountsv1connect.ModuleCapabilitiesServiceNotifyOrgAdminsProcedure: true, @@ -294,12 +297,15 @@ func newFakeAuthority(t *testing.T, gateway *fakeGateway, creds credentials.Tran func (a *fakeAuthority) handle(_ any, stream grpc.ServerStream) error { method, _ := grpc.MethodFromServerStream(stream) md, _ := metadata.FromIncomingContext(stream.Context()) - call := authorityCall{method: method, internalToken: md.Get("x-codefly-internal-token"), workContext: md.Get(codefly.WorkContextHeaderName)} + call := authorityCall{method: method, authorization: md.Get("authorization"), internalToken: md.Get("x-codefly-internal-token"), workContext: md.Get(codefly.WorkContextHeaderName)} // Each procedure's own request message: decoding NotifyOrgAdmins as an // exchange request would read its fields as the wrong ones. request := &v1.ModuleExchangeDelegatedOperationAudienceRequest{} var recvErr error switch method { + case accountsv1connect.ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure: + call.boundary = &v1.VerifyWorkContextRuntimeBoundaryRequest{} + recvErr = stream.RecvMsg(call.boundary) case accountsv1connect.ModuleCapabilitiesServiceNotifyOrgAdminsProcedure: call.notice = &v1.ModuleNotifyOrgAdminsRequest{} recvErr = stream.RecvMsg(call.notice) @@ -330,6 +336,17 @@ func (a *fakeAuthority) handle(_ any, stream grpc.ServerStream) error { if !a.gateway.accepts(call.workContext[0]) { return status.Error(codes.Unauthenticated, "module work context is not a valid capability") } + if call.boundary != nil { + switch call.boundary.ForwardedWorkContextToken { + case "denied.token": + return status.Error(codes.PermissionDenied, "boundary refused") + case "missing-tenant.token": + return stream.SendMsg(&v1.VerifyWorkContextRuntimeBoundaryResponse{BoundaryId: exampleSource}) + case "missing-boundary.token": + return stream.SendMsg(&v1.VerifyWorkContextRuntimeBoundaryResponse{TenantId: testTenant}) + } + return stream.SendMsg(&v1.VerifyWorkContextRuntimeBoundaryResponse{TenantId: testTenant, BoundaryId: exampleSource}) + } if call.notice != nil { // ModuleNotifyOrgAdmins: the host resolves the administrators and // answers only whether any received the notice. diff --git a/moduleauthority/runtime_boundary.go b/moduleauthority/runtime_boundary.go new file mode 100644 index 0000000..943f3f2 --- /dev/null +++ b/moduleauthority/runtime_boundary.go @@ -0,0 +1,39 @@ +package moduleauthority + +import ( + "context" + "errors" + "fmt" + "strings" + + v1 "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1" + "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1/accountsv1connect" + codefly "github.com/codefly-dev/sdk-go/workcontext" +) + +var ErrInvalidRuntimeBoundary = errors.New("module authority: invalid runtime boundary attestation") + +// RuntimeBoundary is a live host observation of a signed context. It is not a +// grant or durable liveness proof. Consumers must match both fields against +// their independently verified incoming context and authorize its scopes. +type RuntimeBoundary struct { + TenantID string + BoundaryID string +} + +// VerifyWorkContextRuntimeBoundary forwards the original viewer capability in +// the request while authenticating this module independently. It neither mints +// a viewer context nor supplies a caller-chosen tenant or boundary selector. +func (c *Client) VerifyWorkContextRuntimeBoundary(ctx context.Context, forwarded codefly.WorkContextToken) (RuntimeBoundary, error) { + if forwarded.Encoded() == "" { + return RuntimeBoundary{}, ErrInvalidRuntimeBoundary + } + out, err := callAsModule(ctx, c, accountsv1connect.ModuleCapabilitiesServiceClient.VerifyWorkContextRuntimeBoundary, &v1.VerifyWorkContextRuntimeBoundaryRequest{ForwardedWorkContextToken: forwarded.Encoded()}) + if err != nil { + return RuntimeBoundary{}, fmt.Errorf("module authority: runtime boundary: %w", err) + } + if out == nil || strings.TrimSpace(out.TenantId) == "" || strings.TrimSpace(out.BoundaryId) == "" { + return RuntimeBoundary{}, ErrInvalidRuntimeBoundary + } + return RuntimeBoundary{TenantID: out.TenantId, BoundaryID: out.BoundaryId}, nil +} diff --git a/moduleauthority/runtime_boundary_test.go b/moduleauthority/runtime_boundary_test.go new file mode 100644 index 0000000..c216aca --- /dev/null +++ b/moduleauthority/runtime_boundary_test.go @@ -0,0 +1,47 @@ +package moduleauthority + +import ( + "connectrpc.com/connect" + "errors" + codefly "github.com/codefly-dev/sdk-go/workcontext" + "testing" +) + +func TestRuntimeBoundaryIndependentModuleAuthority(t *testing.T) { + h := newHost(t) + client := h.client(t, moduleCredentials) + out, err := client.VerifyWorkContextRuntimeBoundary(t.Context(), token(t, "viewer.token")) + if err != nil { + t.Fatal(err) + } + if out.TenantID != testTenant || out.BoundaryID != exampleSource { + t.Fatal(out) + } + calls := h.authority.snapshot() + if len(calls) != 1 { + t.Fatal(calls) + } + call := calls[0] + if call.boundary == nil || call.boundary.ForwardedWorkContextToken != "viewer.token" || call.boundary.ProtoReflect().Descriptor().Fields().Len() != 1 { + t.Fatal("forwarded proof or contract changed") + } + if len(call.workContext) != 1 || call.workContext[0] != "module.token1" || len(call.internalToken) != 1 || call.internalToken[0] != testInternalToken || len(call.authorization) != 0 { + t.Fatal("module credentials not independent") + } + for _, parent := range []string{"missing-tenant.token", "missing-boundary.token"} { + _, err = client.VerifyWorkContextRuntimeBoundary(t.Context(), token(t, parent)) + if !errors.Is(err, ErrInvalidRuntimeBoundary) { + t.Fatal(err) + } + } + before := len(h.authority.snapshot()) + _, err = client.VerifyWorkContextRuntimeBoundary(t.Context(), token(t, "denied.token")) + if connect.CodeOf(err) != connect.CodePermissionDenied || len(h.authority.snapshot()) != before+1 { + t.Fatal("denial changed or retried", err) + } + _, err = client.VerifyWorkContextRuntimeBoundary(t.Context(), codefly.WorkContextToken{}) + if !errors.Is(err, ErrInvalidRuntimeBoundary) || len(h.authority.snapshot()) != before+1 { + t.Fatal("empty proof reached host", err) + } + h.assertNoStrayPaths(t) +} From 903f0256c94259b5b64613214424b03fac1d7b2b Mon Sep 17 00:00:00 2001 From: Gael Date: Thu, 8 Oct 2026 13:29:29 -0400 Subject: [PATCH 2/3] feat: add module audit emission and receipt facade --- CHANGELOG.md | 9 + README.md | 9 + SOURCE.txt | 2 +- .../module_capabilities.connect.go | 35 + .../accounts/v1/module_capabilities.pb.go | 609 ++++++++++-------- moduleauthority/audit.go | 71 ++ moduleauthority/audit_test.go | 81 +++ moduleauthority/host_fake_test.go | 23 + 8 files changed, 560 insertions(+), 279 deletions(-) create mode 100644 moduleauthority/audit.go create mode 100644 moduleauthority/audit_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 77f6ca1..4671a6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## Unreleased — audit effect receipts + +- Added `moduleauthority.Client.EmitAuditEvent` and `LookupAuditEvent` with + complete intent, current module authority and preserved host error codes. +- Empty receipts remain inconclusive; no automatic effect retry. +- Regenerated from the exact local host commit in `SOURCE.txt`. Module version + remains 0.1.0; these contracts are not a published release. + + ## Unreleased — runtime boundary attestation - Added `moduleauthority.Client.VerifyWorkContextRuntimeBoundary`, preserving the diff --git a/README.md b/README.md index 646340f..cdb7628 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,15 @@ The SDK surfaces are: with both halves live and compatible. This method requires the unreleased host contract recorded in `SOURCE.txt`. + `EmitAuditEvent(ctx, AuditEvent)` and `LookupAuditEvent(ctx, AuditEvent)` use + that authority seam for registered audit effects. Keep the complete event and + its stable key for recovery. A lookup returns `AuditReceipt.EventID` only for + matching intent under current host authority. An empty ID is inconclusive; + neither method automatically retries an uncertain effect. Host error codes + remain available through `connect.CodeOf(err)`, including failed preconditions + for changed intent or historical keys without a verifiable receipt. These + methods require the same unreleased host contract in `SOURCE.txt`. + - **`settings/`** — the schema-agnostic typed-settings library every module and product depends on instead of vendoring a copy. It has two parts: diff --git a/SOURCE.txt b/SOURCE.txt index 80ec227..f2dac73 100644 --- a/SOURCE.txt +++ b/SOURCE.txt @@ -1,4 +1,4 @@ -gen/ generated from codefly-dev/module-saas-starter@8b2fab2f6831a19db24d6ba760ee6e9c51c0a463 +gen/ generated from codefly-dev/module-saas-starter@cc7c530c9b09455bf00ac15f2558817363396c7b (accounts public proto: module/services/accounts/proto) module version: 0.1.0 (module/module.package.codefly.yaml) diff --git a/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go b/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go index 990742b..5f345b3 100644 --- a/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go +++ b/gen/saas/accounts/v1/accountsv1connect/module_capabilities.connect.go @@ -86,6 +86,9 @@ const ( // ModuleCapabilitiesServiceEmitAuditEventProcedure is the fully-qualified name of the // ModuleCapabilitiesService's EmitAuditEvent RPC. ModuleCapabilitiesServiceEmitAuditEventProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/EmitAuditEvent" + // ModuleCapabilitiesServiceLookupAuditEventProcedure is the fully-qualified name of the + // ModuleCapabilitiesService's LookupAuditEvent RPC. + ModuleCapabilitiesServiceLookupAuditEventProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/LookupAuditEvent" // ModuleCapabilitiesServiceDeclareAuditEventTypesProcedure is the fully-qualified name of the // ModuleCapabilitiesService's DeclareAuditEventTypes RPC. ModuleCapabilitiesServiceDeclareAuditEventTypesProcedure = "/saas.accounts.v1.ModuleCapabilitiesService/DeclareAuditEventTypes" @@ -178,6 +181,10 @@ type ModuleCapabilitiesServiceClient interface { CancelApproval(context.Context, *connect.Request[v1.ModuleCancelApprovalRequest]) (*connect.Response[emptypb.Empty], error) // EmitAuditEvent records a registered audit event on the tenant's spine. EmitAuditEvent(context.Context, *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[emptypb.Empty], error) + // Read-only recovery for the complete original intent. Requires a nonempty + // idempotency_key; same authority as EmitAuditEvent. No retry authorization is + // implied by an absent receipt. Old unbound keys return FAILED_PRECONDITION. + LookupAuditEvent(context.Context, *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[v1.ModuleLookupAuditEventResponse], error) // DeclareAuditEventTypes admits the audit event types a composed module owns, // into the namespaces the operator bound to it; see the request. DeclareAuditEventTypes(context.Context, *connect.Request[v1.ModuleDeclareAuditEventTypesRequest]) (*connect.Response[v1.ModuleDeclareAuditEventTypesResponse], error) @@ -358,6 +365,12 @@ func NewModuleCapabilitiesServiceClient(httpClient connect.HTTPClient, baseURL s connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("EmitAuditEvent")), connect.WithClientOptions(opts...), ), + lookupAuditEvent: connect.NewClient[v1.ModuleEmitAuditEventRequest, v1.ModuleLookupAuditEventResponse]( + httpClient, + baseURL+ModuleCapabilitiesServiceLookupAuditEventProcedure, + connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("LookupAuditEvent")), + connect.WithClientOptions(opts...), + ), declareAuditEventTypes: connect.NewClient[v1.ModuleDeclareAuditEventTypesRequest, v1.ModuleDeclareAuditEventTypesResponse]( httpClient, baseURL+ModuleCapabilitiesServiceDeclareAuditEventTypesProcedure, @@ -464,6 +477,7 @@ type moduleCapabilitiesServiceClient struct { getApproval *connect.Client[v1.ModuleGetApprovalRequest, v1.ModuleApproval] cancelApproval *connect.Client[v1.ModuleCancelApprovalRequest, emptypb.Empty] emitAuditEvent *connect.Client[v1.ModuleEmitAuditEventRequest, emptypb.Empty] + lookupAuditEvent *connect.Client[v1.ModuleEmitAuditEventRequest, v1.ModuleLookupAuditEventResponse] declareAuditEventTypes *connect.Client[v1.ModuleDeclareAuditEventTypesRequest, v1.ModuleDeclareAuditEventTypesResponse] listSubjectVisibility *connect.Client[v1.ModuleListSubjectVisibilityRequest, v1.ModuleListSubjectVisibilityResponse] fetchDatasourceBlob *connect.Client[v1.FetchDatasourceBlobRequest, v1.FetchDatasourceBlobChunk] @@ -570,6 +584,11 @@ func (c *moduleCapabilitiesServiceClient) EmitAuditEvent(ctx context.Context, re return c.emitAuditEvent.CallUnary(ctx, req) } +// LookupAuditEvent calls saas.accounts.v1.ModuleCapabilitiesService.LookupAuditEvent. +func (c *moduleCapabilitiesServiceClient) LookupAuditEvent(ctx context.Context, req *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[v1.ModuleLookupAuditEventResponse], error) { + return c.lookupAuditEvent.CallUnary(ctx, req) +} + // DeclareAuditEventTypes calls saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes. func (c *moduleCapabilitiesServiceClient) DeclareAuditEventTypes(ctx context.Context, req *connect.Request[v1.ModuleDeclareAuditEventTypesRequest]) (*connect.Response[v1.ModuleDeclareAuditEventTypesResponse], error) { return c.declareAuditEventTypes.CallUnary(ctx, req) @@ -693,6 +712,10 @@ type ModuleCapabilitiesServiceHandler interface { CancelApproval(context.Context, *connect.Request[v1.ModuleCancelApprovalRequest]) (*connect.Response[emptypb.Empty], error) // EmitAuditEvent records a registered audit event on the tenant's spine. EmitAuditEvent(context.Context, *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[emptypb.Empty], error) + // Read-only recovery for the complete original intent. Requires a nonempty + // idempotency_key; same authority as EmitAuditEvent. No retry authorization is + // implied by an absent receipt. Old unbound keys return FAILED_PRECONDITION. + LookupAuditEvent(context.Context, *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[v1.ModuleLookupAuditEventResponse], error) // DeclareAuditEventTypes admits the audit event types a composed module owns, // into the namespaces the operator bound to it; see the request. DeclareAuditEventTypes(context.Context, *connect.Request[v1.ModuleDeclareAuditEventTypesRequest]) (*connect.Response[v1.ModuleDeclareAuditEventTypesResponse], error) @@ -869,6 +892,12 @@ func NewModuleCapabilitiesServiceHandler(svc ModuleCapabilitiesServiceHandler, o connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("EmitAuditEvent")), connect.WithHandlerOptions(opts...), ) + moduleCapabilitiesServiceLookupAuditEventHandler := connect.NewUnaryHandler( + ModuleCapabilitiesServiceLookupAuditEventProcedure, + svc.LookupAuditEvent, + connect.WithSchema(moduleCapabilitiesServiceMethods.ByName("LookupAuditEvent")), + connect.WithHandlerOptions(opts...), + ) moduleCapabilitiesServiceDeclareAuditEventTypesHandler := connect.NewUnaryHandler( ModuleCapabilitiesServiceDeclareAuditEventTypesProcedure, svc.DeclareAuditEventTypes, @@ -989,6 +1018,8 @@ func NewModuleCapabilitiesServiceHandler(svc ModuleCapabilitiesServiceHandler, o moduleCapabilitiesServiceCancelApprovalHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceEmitAuditEventProcedure: moduleCapabilitiesServiceEmitAuditEventHandler.ServeHTTP(w, r) + case ModuleCapabilitiesServiceLookupAuditEventProcedure: + moduleCapabilitiesServiceLookupAuditEventHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceDeclareAuditEventTypesProcedure: moduleCapabilitiesServiceDeclareAuditEventTypesHandler.ServeHTTP(w, r) case ModuleCapabilitiesServiceListSubjectVisibilityProcedure: @@ -1094,6 +1125,10 @@ func (UnimplementedModuleCapabilitiesServiceHandler) EmitAuditEvent(context.Cont return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent is not implemented")) } +func (UnimplementedModuleCapabilitiesServiceHandler) LookupAuditEvent(context.Context, *connect.Request[v1.ModuleEmitAuditEventRequest]) (*connect.Response[v1.ModuleLookupAuditEventResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.LookupAuditEvent is not implemented")) +} + func (UnimplementedModuleCapabilitiesServiceHandler) DeclareAuditEventTypes(context.Context, *connect.Request[v1.ModuleDeclareAuditEventTypesRequest]) (*connect.Response[v1.ModuleDeclareAuditEventTypesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes is not implemented")) } diff --git a/gen/saas/accounts/v1/module_capabilities.pb.go b/gen/saas/accounts/v1/module_capabilities.pb.go index 029c27e..938cde5 100644 --- a/gen/saas/accounts/v1/module_capabilities.pb.go +++ b/gen/saas/accounts/v1/module_capabilities.pb.go @@ -1663,6 +1663,52 @@ func (x *ModuleCancelApprovalRequest) GetReason() string { return "" } +// Receipt for the exact requested audit intent, under current emission authority. +// Empty event_id means no receipt was visible, not proof that nothing happened. +type ModuleLookupAuditEventResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + EventId string `protobuf:"bytes,1,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ModuleLookupAuditEventResponse) Reset() { + *x = ModuleLookupAuditEventResponse{} + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ModuleLookupAuditEventResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ModuleLookupAuditEventResponse) ProtoMessage() {} + +func (x *ModuleLookupAuditEventResponse) ProtoReflect() protoreflect.Message { + mi := &file_saas_accounts_v1_module_capabilities_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 ModuleLookupAuditEventResponse.ProtoReflect.Descriptor instead. +func (*ModuleLookupAuditEventResponse) Descriptor() ([]byte, []int) { + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{19} +} + +func (x *ModuleLookupAuditEventResponse) GetEventId() string { + if x != nil { + return x.EventId + } + return "" +} + // ModuleEmitAuditEventRequest emits a registered audit event onto the tenant's // single audit spine. event_type must be registered in the code-owned catalog // (unregistered types are rejected, not stored free-form). solution names the @@ -1678,7 +1724,8 @@ type ModuleEmitAuditEventRequest struct { Fields *structpb.Struct `protobuf:"bytes,6,opt,name=fields,proto3" json:"fields,omitempty"` // idempotency_key deduplicates retried emits: two emits with the same // (tenant, event_type, idempotency_key) collapse to a single audit row, and - // the duplicate returns success without writing again. Empty disables + // an identical intent returns success without writing again. Changed intent or + // an older key without recorded intent returns FAILED_PRECONDITION. Empty disables // deduplication (every emit is a distinct event). Scoped by tenant so one // tenant's keys can never suppress another's events. IdempotencyKey string `protobuf:"bytes,7,opt,name=idempotency_key,json=idempotencyKey,proto3" json:"idempotency_key,omitempty"` @@ -1688,7 +1735,7 @@ type ModuleEmitAuditEventRequest struct { func (x *ModuleEmitAuditEventRequest) Reset() { *x = ModuleEmitAuditEventRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[19] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1700,7 +1747,7 @@ func (x *ModuleEmitAuditEventRequest) String() string { func (*ModuleEmitAuditEventRequest) ProtoMessage() {} func (x *ModuleEmitAuditEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[19] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1713,7 +1760,7 @@ func (x *ModuleEmitAuditEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleEmitAuditEventRequest.ProtoReflect.Descriptor instead. func (*ModuleEmitAuditEventRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{19} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{20} } func (x *ModuleEmitAuditEventRequest) GetTenant() string { @@ -1784,7 +1831,7 @@ type ModuleAuditFieldDeclaration struct { func (x *ModuleAuditFieldDeclaration) Reset() { *x = ModuleAuditFieldDeclaration{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[20] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +1843,7 @@ func (x *ModuleAuditFieldDeclaration) String() string { func (*ModuleAuditFieldDeclaration) ProtoMessage() {} func (x *ModuleAuditFieldDeclaration) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[20] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +1856,7 @@ func (x *ModuleAuditFieldDeclaration) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleAuditFieldDeclaration.ProtoReflect.Descriptor instead. func (*ModuleAuditFieldDeclaration) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{20} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{21} } func (x *ModuleAuditFieldDeclaration) GetName() string { @@ -1862,7 +1909,7 @@ type ModuleAuditEventTypeDeclaration struct { func (x *ModuleAuditEventTypeDeclaration) Reset() { *x = ModuleAuditEventTypeDeclaration{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[21] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1874,7 +1921,7 @@ func (x *ModuleAuditEventTypeDeclaration) String() string { func (*ModuleAuditEventTypeDeclaration) ProtoMessage() {} func (x *ModuleAuditEventTypeDeclaration) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[21] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1887,7 +1934,7 @@ func (x *ModuleAuditEventTypeDeclaration) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleAuditEventTypeDeclaration.ProtoReflect.Descriptor instead. func (*ModuleAuditEventTypeDeclaration) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{21} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{22} } func (x *ModuleAuditEventTypeDeclaration) GetType() string { @@ -1937,7 +1984,7 @@ type ModuleDeclareAuditEventTypesRequest struct { func (x *ModuleDeclareAuditEventTypesRequest) Reset() { *x = ModuleDeclareAuditEventTypesRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[22] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1949,7 +1996,7 @@ func (x *ModuleDeclareAuditEventTypesRequest) String() string { func (*ModuleDeclareAuditEventTypesRequest) ProtoMessage() {} func (x *ModuleDeclareAuditEventTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[22] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1962,7 +2009,7 @@ func (x *ModuleDeclareAuditEventTypesRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ModuleDeclareAuditEventTypesRequest.ProtoReflect.Descriptor instead. func (*ModuleDeclareAuditEventTypesRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{22} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{23} } func (x *ModuleDeclareAuditEventTypesRequest) GetPrefix() string { @@ -1992,7 +2039,7 @@ type ModuleDeclareAuditEventTypesResponse struct { func (x *ModuleDeclareAuditEventTypesResponse) Reset() { *x = ModuleDeclareAuditEventTypesResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[23] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2004,7 +2051,7 @@ func (x *ModuleDeclareAuditEventTypesResponse) String() string { func (*ModuleDeclareAuditEventTypesResponse) ProtoMessage() {} func (x *ModuleDeclareAuditEventTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[23] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2017,7 +2064,7 @@ func (x *ModuleDeclareAuditEventTypesResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ModuleDeclareAuditEventTypesResponse.ProtoReflect.Descriptor instead. func (*ModuleDeclareAuditEventTypesResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{23} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{24} } func (x *ModuleDeclareAuditEventTypesResponse) GetAdmittedTypes() []string { @@ -2051,7 +2098,7 @@ type SubjectVisibilityGrant struct { func (x *SubjectVisibilityGrant) Reset() { *x = SubjectVisibilityGrant{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[24] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2063,7 +2110,7 @@ func (x *SubjectVisibilityGrant) String() string { func (*SubjectVisibilityGrant) ProtoMessage() {} func (x *SubjectVisibilityGrant) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[24] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2076,7 +2123,7 @@ func (x *SubjectVisibilityGrant) ProtoReflect() protoreflect.Message { // Deprecated: Use SubjectVisibilityGrant.ProtoReflect.Descriptor instead. func (*SubjectVisibilityGrant) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{24} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{25} } func (x *SubjectVisibilityGrant) GetVisibleSubjectId() string { @@ -2114,7 +2161,7 @@ type ModuleListSubjectVisibilityRequest struct { func (x *ModuleListSubjectVisibilityRequest) Reset() { *x = ModuleListSubjectVisibilityRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[25] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2126,7 +2173,7 @@ func (x *ModuleListSubjectVisibilityRequest) String() string { func (*ModuleListSubjectVisibilityRequest) ProtoMessage() {} func (x *ModuleListSubjectVisibilityRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[25] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2139,7 +2186,7 @@ func (x *ModuleListSubjectVisibilityRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ModuleListSubjectVisibilityRequest.ProtoReflect.Descriptor instead. func (*ModuleListSubjectVisibilityRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{25} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{26} } func (x *ModuleListSubjectVisibilityRequest) GetTenant() string { @@ -2178,7 +2225,7 @@ type ModuleListSubjectVisibilityResponse struct { func (x *ModuleListSubjectVisibilityResponse) Reset() { *x = ModuleListSubjectVisibilityResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[26] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2190,7 +2237,7 @@ func (x *ModuleListSubjectVisibilityResponse) String() string { func (*ModuleListSubjectVisibilityResponse) ProtoMessage() {} func (x *ModuleListSubjectVisibilityResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[26] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2203,7 +2250,7 @@ func (x *ModuleListSubjectVisibilityResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ModuleListSubjectVisibilityResponse.ProtoReflect.Descriptor instead. func (*ModuleListSubjectVisibilityResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{26} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{27} } func (x *ModuleListSubjectVisibilityResponse) GetGrants() []*SubjectVisibilityGrant { @@ -2231,7 +2278,7 @@ type FetchDatasourceBlobRequest struct { func (x *FetchDatasourceBlobRequest) Reset() { *x = FetchDatasourceBlobRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[27] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2243,7 +2290,7 @@ func (x *FetchDatasourceBlobRequest) String() string { func (*FetchDatasourceBlobRequest) ProtoMessage() {} func (x *FetchDatasourceBlobRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[27] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2256,7 +2303,7 @@ func (x *FetchDatasourceBlobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchDatasourceBlobRequest.ProtoReflect.Descriptor instead. func (*FetchDatasourceBlobRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{27} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{28} } func (x *FetchDatasourceBlobRequest) GetSourceId() string { @@ -2288,7 +2335,7 @@ type FetchDatasourceBlobChunk struct { func (x *FetchDatasourceBlobChunk) Reset() { *x = FetchDatasourceBlobChunk{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[28] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2300,7 +2347,7 @@ func (x *FetchDatasourceBlobChunk) String() string { func (*FetchDatasourceBlobChunk) ProtoMessage() {} func (x *FetchDatasourceBlobChunk) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[28] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2313,7 +2360,7 @@ func (x *FetchDatasourceBlobChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchDatasourceBlobChunk.ProtoReflect.Descriptor instead. func (*FetchDatasourceBlobChunk) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{28} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{29} } func (x *FetchDatasourceBlobChunk) GetData() []byte { @@ -2351,7 +2398,7 @@ type DatasourceFileRef struct { func (x *DatasourceFileRef) Reset() { *x = DatasourceFileRef{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[29] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2363,7 +2410,7 @@ func (x *DatasourceFileRef) String() string { func (*DatasourceFileRef) ProtoMessage() {} func (x *DatasourceFileRef) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[29] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2376,7 +2423,7 @@ func (x *DatasourceFileRef) ProtoReflect() protoreflect.Message { // Deprecated: Use DatasourceFileRef.ProtoReflect.Descriptor instead. func (*DatasourceFileRef) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{29} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{30} } func (x *DatasourceFileRef) GetItemId() string { @@ -2412,7 +2459,7 @@ type FetchDatasourceFilesRequest struct { func (x *FetchDatasourceFilesRequest) Reset() { *x = FetchDatasourceFilesRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[30] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2424,7 +2471,7 @@ func (x *FetchDatasourceFilesRequest) String() string { func (*FetchDatasourceFilesRequest) ProtoMessage() {} func (x *FetchDatasourceFilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[30] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2437,7 +2484,7 @@ func (x *FetchDatasourceFilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchDatasourceFilesRequest.ProtoReflect.Descriptor instead. func (*FetchDatasourceFilesRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{30} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{31} } func (x *FetchDatasourceFilesRequest) GetSourceId() string { @@ -2479,7 +2526,7 @@ type DatasourceProvenance struct { func (x *DatasourceProvenance) Reset() { *x = DatasourceProvenance{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[31] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2491,7 +2538,7 @@ func (x *DatasourceProvenance) String() string { func (*DatasourceProvenance) ProtoMessage() {} func (x *DatasourceProvenance) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[31] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2504,7 +2551,7 @@ func (x *DatasourceProvenance) ProtoReflect() protoreflect.Message { // Deprecated: Use DatasourceProvenance.ProtoReflect.Descriptor instead. func (*DatasourceProvenance) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{31} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{32} } func (x *DatasourceProvenance) GetSourceId() string { @@ -2570,7 +2617,7 @@ type DatasourceItemReaders struct { func (x *DatasourceItemReaders) Reset() { *x = DatasourceItemReaders{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[32] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2582,7 +2629,7 @@ func (x *DatasourceItemReaders) String() string { func (*DatasourceItemReaders) ProtoMessage() {} func (x *DatasourceItemReaders) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[32] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2595,7 +2642,7 @@ func (x *DatasourceItemReaders) ProtoReflect() protoreflect.Message { // Deprecated: Use DatasourceItemReaders.ProtoReflect.Descriptor instead. func (*DatasourceItemReaders) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{32} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{33} } func (x *DatasourceItemReaders) GetBasis() DatasourceItemReadersBasis { @@ -2656,7 +2703,7 @@ type DatasourceFileHeader struct { func (x *DatasourceFileHeader) Reset() { *x = DatasourceFileHeader{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[33] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2668,7 +2715,7 @@ func (x *DatasourceFileHeader) String() string { func (*DatasourceFileHeader) ProtoMessage() {} func (x *DatasourceFileHeader) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[33] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2681,7 +2728,7 @@ func (x *DatasourceFileHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use DatasourceFileHeader.ProtoReflect.Descriptor instead. func (*DatasourceFileHeader) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{33} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{34} } func (x *DatasourceFileHeader) GetProvenance() *DatasourceProvenance { @@ -2735,7 +2782,7 @@ type FetchDatasourceFilesFrame struct { func (x *FetchDatasourceFilesFrame) Reset() { *x = FetchDatasourceFilesFrame{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[34] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2747,7 +2794,7 @@ func (x *FetchDatasourceFilesFrame) String() string { func (*FetchDatasourceFilesFrame) ProtoMessage() {} func (x *FetchDatasourceFilesFrame) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[34] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2760,7 +2807,7 @@ func (x *FetchDatasourceFilesFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchDatasourceFilesFrame.ProtoReflect.Descriptor instead. func (*FetchDatasourceFilesFrame) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{34} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{35} } func (x *FetchDatasourceFilesFrame) GetFrame() isFetchDatasourceFilesFrame_Frame { @@ -2819,7 +2866,7 @@ type ModulePublishEventRequest struct { func (x *ModulePublishEventRequest) Reset() { *x = ModulePublishEventRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[35] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2831,7 +2878,7 @@ func (x *ModulePublishEventRequest) String() string { func (*ModulePublishEventRequest) ProtoMessage() {} func (x *ModulePublishEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[35] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2844,7 +2891,7 @@ func (x *ModulePublishEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePublishEventRequest.ProtoReflect.Descriptor instead. func (*ModulePublishEventRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{35} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{36} } func (x *ModulePublishEventRequest) GetTenant() string { @@ -2874,7 +2921,7 @@ type ModulePublishEventResponse struct { func (x *ModulePublishEventResponse) Reset() { *x = ModulePublishEventResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[36] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2886,7 +2933,7 @@ func (x *ModulePublishEventResponse) String() string { func (*ModulePublishEventResponse) ProtoMessage() {} func (x *ModulePublishEventResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[36] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2899,7 +2946,7 @@ func (x *ModulePublishEventResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePublishEventResponse.ProtoReflect.Descriptor instead. func (*ModulePublishEventResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{36} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{37} } func (x *ModulePublishEventResponse) GetEventId() string { @@ -2925,7 +2972,7 @@ type ModuleSubscribeRequest struct { func (x *ModuleSubscribeRequest) Reset() { *x = ModuleSubscribeRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[37] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +2984,7 @@ func (x *ModuleSubscribeRequest) String() string { func (*ModuleSubscribeRequest) ProtoMessage() {} func (x *ModuleSubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[37] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2950,7 +2997,7 @@ func (x *ModuleSubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleSubscribeRequest.ProtoReflect.Descriptor instead. func (*ModuleSubscribeRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{37} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{38} } func (x *ModuleSubscribeRequest) GetTypePattern() string { @@ -2989,7 +3036,7 @@ type ModuleSubscription struct { func (x *ModuleSubscription) Reset() { *x = ModuleSubscription{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[38] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3001,7 +3048,7 @@ func (x *ModuleSubscription) String() string { func (*ModuleSubscription) ProtoMessage() {} func (x *ModuleSubscription) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[38] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3014,7 +3061,7 @@ func (x *ModuleSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleSubscription.ProtoReflect.Descriptor instead. func (*ModuleSubscription) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{38} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{39} } func (x *ModuleSubscription) GetId() string { @@ -3068,7 +3115,7 @@ type ModuleSubscribeResponse struct { func (x *ModuleSubscribeResponse) Reset() { *x = ModuleSubscribeResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[39] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3080,7 +3127,7 @@ func (x *ModuleSubscribeResponse) String() string { func (*ModuleSubscribeResponse) ProtoMessage() {} func (x *ModuleSubscribeResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[39] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3093,7 +3140,7 @@ func (x *ModuleSubscribeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleSubscribeResponse.ProtoReflect.Descriptor instead. func (*ModuleSubscribeResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{39} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{40} } func (x *ModuleSubscribeResponse) GetSubscription() *ModuleSubscription { @@ -3113,7 +3160,7 @@ type ModuleUnsubscribeRequest struct { func (x *ModuleUnsubscribeRequest) Reset() { *x = ModuleUnsubscribeRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[40] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3125,7 +3172,7 @@ func (x *ModuleUnsubscribeRequest) String() string { func (*ModuleUnsubscribeRequest) ProtoMessage() {} func (x *ModuleUnsubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[40] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3138,7 +3185,7 @@ func (x *ModuleUnsubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleUnsubscribeRequest.ProtoReflect.Descriptor instead. func (*ModuleUnsubscribeRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{40} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{41} } func (x *ModuleUnsubscribeRequest) GetSubscriptionId() string { @@ -3158,7 +3205,7 @@ type ModuleListSubscriptionsRequest struct { func (x *ModuleListSubscriptionsRequest) Reset() { *x = ModuleListSubscriptionsRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[41] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3170,7 +3217,7 @@ func (x *ModuleListSubscriptionsRequest) String() string { func (*ModuleListSubscriptionsRequest) ProtoMessage() {} func (x *ModuleListSubscriptionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[41] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3183,7 +3230,7 @@ func (x *ModuleListSubscriptionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleListSubscriptionsRequest.ProtoReflect.Descriptor instead. func (*ModuleListSubscriptionsRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{41} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{42} } type ModuleListSubscriptionsResponse struct { @@ -3195,7 +3242,7 @@ type ModuleListSubscriptionsResponse struct { func (x *ModuleListSubscriptionsResponse) Reset() { *x = ModuleListSubscriptionsResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[42] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3207,7 +3254,7 @@ func (x *ModuleListSubscriptionsResponse) String() string { func (*ModuleListSubscriptionsResponse) ProtoMessage() {} func (x *ModuleListSubscriptionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[42] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3220,7 +3267,7 @@ func (x *ModuleListSubscriptionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleListSubscriptionsResponse.ProtoReflect.Descriptor instead. func (*ModuleListSubscriptionsResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{42} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{43} } func (x *ModuleListSubscriptionsResponse) GetSubscriptions() []*ModuleSubscription { @@ -3245,7 +3292,7 @@ type ModuleReplayEventsRequest struct { func (x *ModuleReplayEventsRequest) Reset() { *x = ModuleReplayEventsRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[43] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3257,7 +3304,7 @@ func (x *ModuleReplayEventsRequest) String() string { func (*ModuleReplayEventsRequest) ProtoMessage() {} func (x *ModuleReplayEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[43] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3270,7 +3317,7 @@ func (x *ModuleReplayEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleReplayEventsRequest.ProtoReflect.Descriptor instead. func (*ModuleReplayEventsRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{43} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{44} } func (x *ModuleReplayEventsRequest) GetTenant() string { @@ -3305,7 +3352,7 @@ type ModuleReplayEventsResponse struct { func (x *ModuleReplayEventsResponse) Reset() { *x = ModuleReplayEventsResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[44] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3317,7 +3364,7 @@ func (x *ModuleReplayEventsResponse) String() string { func (*ModuleReplayEventsResponse) ProtoMessage() {} func (x *ModuleReplayEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[44] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3330,7 +3377,7 @@ func (x *ModuleReplayEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModuleReplayEventsResponse.ProtoReflect.Descriptor instead. func (*ModuleReplayEventsResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{44} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{45} } func (x *ModuleReplayEventsResponse) GetRedelivered() int32 { @@ -3374,7 +3421,7 @@ type ReadableSourceCollection struct { func (x *ReadableSourceCollection) Reset() { *x = ReadableSourceCollection{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[45] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3386,7 +3433,7 @@ func (x *ReadableSourceCollection) String() string { func (*ReadableSourceCollection) ProtoMessage() {} func (x *ReadableSourceCollection) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[45] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3399,7 +3446,7 @@ func (x *ReadableSourceCollection) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadableSourceCollection.ProtoReflect.Descriptor instead. func (*ReadableSourceCollection) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{45} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{46} } func (x *ReadableSourceCollection) GetSourceId() string { @@ -3493,7 +3540,7 @@ type ReadableCollectionGrant struct { func (x *ReadableCollectionGrant) Reset() { *x = ReadableCollectionGrant{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[46] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3505,7 +3552,7 @@ func (x *ReadableCollectionGrant) String() string { func (*ReadableCollectionGrant) ProtoMessage() {} func (x *ReadableCollectionGrant) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[46] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3518,7 +3565,7 @@ func (x *ReadableCollectionGrant) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadableCollectionGrant.ProtoReflect.Descriptor instead. func (*ReadableCollectionGrant) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{46} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{47} } func (x *ReadableCollectionGrant) GetSubjectLabel() string { @@ -3591,7 +3638,7 @@ type CollectionSyncProvenance struct { func (x *CollectionSyncProvenance) Reset() { *x = CollectionSyncProvenance{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[47] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3603,7 +3650,7 @@ func (x *CollectionSyncProvenance) String() string { func (*CollectionSyncProvenance) ProtoMessage() {} func (x *CollectionSyncProvenance) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[47] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3616,7 +3663,7 @@ func (x *CollectionSyncProvenance) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionSyncProvenance.ProtoReflect.Descriptor instead. func (*CollectionSyncProvenance) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{47} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{48} } func (x *CollectionSyncProvenance) GetStage() SourceSyncStage { @@ -3679,7 +3726,7 @@ type ListReadableSourceCollectionsRequest struct { func (x *ListReadableSourceCollectionsRequest) Reset() { *x = ListReadableSourceCollectionsRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[48] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3691,7 +3738,7 @@ func (x *ListReadableSourceCollectionsRequest) String() string { func (*ListReadableSourceCollectionsRequest) ProtoMessage() {} func (x *ListReadableSourceCollectionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[48] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3704,7 +3751,7 @@ func (x *ListReadableSourceCollectionsRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use ListReadableSourceCollectionsRequest.ProtoReflect.Descriptor instead. func (*ListReadableSourceCollectionsRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{48} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{49} } func (x *ListReadableSourceCollectionsRequest) GetPageSize() int32 { @@ -3731,7 +3778,7 @@ type ListReadableSourceCollectionsResponse struct { func (x *ListReadableSourceCollectionsResponse) Reset() { *x = ListReadableSourceCollectionsResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[49] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3743,7 +3790,7 @@ func (x *ListReadableSourceCollectionsResponse) String() string { func (*ListReadableSourceCollectionsResponse) ProtoMessage() {} func (x *ListReadableSourceCollectionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[49] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3756,7 +3803,7 @@ func (x *ListReadableSourceCollectionsResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use ListReadableSourceCollectionsResponse.ProtoReflect.Descriptor instead. func (*ListReadableSourceCollectionsResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{49} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{50} } func (x *ListReadableSourceCollectionsResponse) GetCollections() []*ReadableSourceCollection { @@ -3800,7 +3847,7 @@ type ModulePlaceRecordRequest struct { func (x *ModulePlaceRecordRequest) Reset() { *x = ModulePlaceRecordRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[50] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3812,7 +3859,7 @@ func (x *ModulePlaceRecordRequest) String() string { func (*ModulePlaceRecordRequest) ProtoMessage() {} func (x *ModulePlaceRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[50] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3825,7 +3872,7 @@ func (x *ModulePlaceRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePlaceRecordRequest.ProtoReflect.Descriptor instead. func (*ModulePlaceRecordRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{50} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{51} } func (x *ModulePlaceRecordRequest) GetTenant() string { @@ -3884,7 +3931,7 @@ type ModulePlaceRecordResponse struct { func (x *ModulePlaceRecordResponse) Reset() { *x = ModulePlaceRecordResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[51] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3896,7 +3943,7 @@ func (x *ModulePlaceRecordResponse) String() string { func (*ModulePlaceRecordResponse) ProtoMessage() {} func (x *ModulePlaceRecordResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[51] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3909,7 +3956,7 @@ func (x *ModulePlaceRecordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePlaceRecordResponse.ProtoReflect.Descriptor instead. func (*ModulePlaceRecordResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{51} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{52} } func (x *ModulePlaceRecordResponse) GetNodeId() string { @@ -3930,7 +3977,7 @@ type VerifyWorkContextRuntimeBoundaryRequest struct { func (x *VerifyWorkContextRuntimeBoundaryRequest) Reset() { *x = VerifyWorkContextRuntimeBoundaryRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3942,7 +3989,7 @@ func (x *VerifyWorkContextRuntimeBoundaryRequest) String() string { func (*VerifyWorkContextRuntimeBoundaryRequest) ProtoMessage() {} func (x *VerifyWorkContextRuntimeBoundaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[52] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3955,7 +4002,7 @@ func (x *VerifyWorkContextRuntimeBoundaryRequest) ProtoReflect() protoreflect.Me // Deprecated: Use VerifyWorkContextRuntimeBoundaryRequest.ProtoReflect.Descriptor instead. func (*VerifyWorkContextRuntimeBoundaryRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{52} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{53} } func (x *VerifyWorkContextRuntimeBoundaryRequest) GetForwardedWorkContextToken() string { @@ -3975,7 +4022,7 @@ type VerifyWorkContextRuntimeBoundaryResponse struct { func (x *VerifyWorkContextRuntimeBoundaryResponse) Reset() { *x = VerifyWorkContextRuntimeBoundaryResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3987,7 +4034,7 @@ func (x *VerifyWorkContextRuntimeBoundaryResponse) String() string { func (*VerifyWorkContextRuntimeBoundaryResponse) ProtoMessage() {} func (x *VerifyWorkContextRuntimeBoundaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[53] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4000,7 +4047,7 @@ func (x *VerifyWorkContextRuntimeBoundaryResponse) ProtoReflect() protoreflect.M // Deprecated: Use VerifyWorkContextRuntimeBoundaryResponse.ProtoReflect.Descriptor instead. func (*VerifyWorkContextRuntimeBoundaryResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{53} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{54} } func (x *VerifyWorkContextRuntimeBoundaryResponse) GetTenantId() string { @@ -4030,7 +4077,7 @@ type CheckWorkContextRecordAccessRequest struct { func (x *CheckWorkContextRecordAccessRequest) Reset() { *x = CheckWorkContextRecordAccessRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +4089,7 @@ func (x *CheckWorkContextRecordAccessRequest) String() string { func (*CheckWorkContextRecordAccessRequest) ProtoMessage() {} func (x *CheckWorkContextRecordAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[54] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +4102,7 @@ func (x *CheckWorkContextRecordAccessRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use CheckWorkContextRecordAccessRequest.ProtoReflect.Descriptor instead. func (*CheckWorkContextRecordAccessRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{54} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{55} } func (x *CheckWorkContextRecordAccessRequest) GetResourceType() string { @@ -4091,7 +4138,7 @@ type CheckWorkContextRecordAccessResponse struct { func (x *CheckWorkContextRecordAccessResponse) Reset() { *x = CheckWorkContextRecordAccessResponse{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4103,7 +4150,7 @@ func (x *CheckWorkContextRecordAccessResponse) String() string { func (*CheckWorkContextRecordAccessResponse) ProtoMessage() {} func (x *CheckWorkContextRecordAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[55] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4116,7 +4163,7 @@ func (x *CheckWorkContextRecordAccessResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use CheckWorkContextRecordAccessResponse.ProtoReflect.Descriptor instead. func (*CheckWorkContextRecordAccessResponse) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{55} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{56} } func (x *CheckWorkContextRecordAccessResponse) GetAllowed() bool { @@ -4145,7 +4192,7 @@ type ModuleExchangeDelegatedReadAudienceRequest struct { func (x *ModuleExchangeDelegatedReadAudienceRequest) Reset() { *x = ModuleExchangeDelegatedReadAudienceRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4157,7 +4204,7 @@ func (x *ModuleExchangeDelegatedReadAudienceRequest) String() string { func (*ModuleExchangeDelegatedReadAudienceRequest) ProtoMessage() {} func (x *ModuleExchangeDelegatedReadAudienceRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[56] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4170,7 +4217,7 @@ func (x *ModuleExchangeDelegatedReadAudienceRequest) ProtoReflect() protoreflect // Deprecated: Use ModuleExchangeDelegatedReadAudienceRequest.ProtoReflect.Descriptor instead. func (*ModuleExchangeDelegatedReadAudienceRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{56} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{57} } func (x *ModuleExchangeDelegatedReadAudienceRequest) GetBindingId() string { @@ -4226,7 +4273,7 @@ type ModuleExchangeDelegatedOperationAudienceRequest struct { func (x *ModuleExchangeDelegatedOperationAudienceRequest) Reset() { *x = ModuleExchangeDelegatedOperationAudienceRequest{} - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +4285,7 @@ func (x *ModuleExchangeDelegatedOperationAudienceRequest) String() string { func (*ModuleExchangeDelegatedOperationAudienceRequest) ProtoMessage() {} func (x *ModuleExchangeDelegatedOperationAudienceRequest) ProtoReflect() protoreflect.Message { - mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[57] + mi := &file_saas_accounts_v1_module_capabilities_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4251,7 +4298,7 @@ func (x *ModuleExchangeDelegatedOperationAudienceRequest) ProtoReflect() protore // Deprecated: Use ModuleExchangeDelegatedOperationAudienceRequest.ProtoReflect.Descriptor instead. func (*ModuleExchangeDelegatedOperationAudienceRequest) Descriptor() ([]byte, []int) { - return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{57} + return file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP(), []int{58} } func (x *ModuleExchangeDelegatedOperationAudienceRequest) GetBindingId() string { @@ -4395,7 +4442,9 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x06tenant\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06tenant\x12)\n" + "\vapproval_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\n" + "approvalId\x12 \n" + - "\x06reason\x18\x03 \x01(\tB\b\xbaH\x05r\x03\x18\x80\bR\x06reason\"\xb3\x02\n" + + "\x06reason\x18\x03 \x01(\tB\b\xbaH\x05r\x03\x18\x80\bR\x06reason\";\n" + + "\x1eModuleLookupAuditEventResponse\x12\x19\n" + + "\bevent_id\x18\x01 \x01(\tR\aeventId\"\xb3\x02\n" + "\x1bModuleEmitAuditEventRequest\x12\x16\n" + "\x06tenant\x18\x01 \x01(\tR\x06tenant\x12)\n" + "\n" + @@ -4625,7 +4674,7 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x1cMETADATA_DISCLOSURE_WITHHELD\x10\x02*\\\n" + "\x0fSourceSyncStage\x12!\n" + "\x1dSOURCE_SYNC_STAGE_UNSPECIFIED\x10\x00\x12&\n" + - "\"SOURCE_SYNC_STAGE_CHANGES_ENQUEUED\x10\x012\x87%\n" + + "\"SOURCE_SYNC_STAGE_CHANGES_ENQUEUED\x10\x012\x97&\n" + "\x19ModuleCapabilitiesService\x12\xc5\x01\n" + "\x1dExchangeDelegatedReadAudience\x12<.saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest\x1a#.saas.accounts.v1.IssuedWorkContext\"A\xc2\xf3\x18=\b\x03\x10\x010\x01:+\n" + "'saas.module.delegated_audience_exchange\x10\x04@\x01H\aP\x04X\x04`\x01\x12\xcf\x01\n" + @@ -4648,7 +4697,8 @@ const file_saas_accounts_v1_module_capabilities_proto_rawDesc = "" + "\x0fRequestApproval\x12..saas.accounts.v1.ModuleRequestApprovalRequest\x1a/.saas.accounts.v1.ModuleRequestApprovalResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12u\n" + "\vGetApproval\x12*.saas.accounts.v1.ModuleGetApprovalRequest\x1a .saas.accounts.v1.ModuleApproval\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12q\n" + "\x0eCancelApproval\x12-.saas.accounts.v1.ModuleCancelApprovalRequest\x1a\x16.google.protobuf.Empty\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12q\n" + - "\x0eEmitAuditEvent\x12-.saas.accounts.v1.ModuleEmitAuditEventRequest\x1a\x16.google.protobuf.Empty\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\xc3\x01\n" + + "\x0eEmitAuditEvent\x12-.saas.accounts.v1.ModuleEmitAuditEventRequest\x1a\x16.google.protobuf.Empty\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\x8d\x01\n" + + "\x10LookupAuditEvent\x12-.saas.accounts.v1.ModuleEmitAuditEventRequest\x1a0.saas.accounts.v1.ModuleLookupAuditEventResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\xc3\x01\n" + "\x16DeclareAuditEventTypes\x125.saas.accounts.v1.ModuleDeclareAuditEventTypesRequest\x1a6.saas.accounts.v1.ModuleDeclareAuditEventTypesResponse\":\xc2\xf3\x186\b\x03\x10\x010\x01:$\n" + " saas.module.audit_types_declared\x10\x02@\x01H\aP\x03X\x03`\x01\x12\x9e\x01\n" + "\x15ListSubjectVisibility\x124.saas.accounts.v1.ModuleListSubjectVisibilityRequest\x1a5.saas.accounts.v1.ModuleListSubjectVisibilityResponse\"\x18\xc2\xf3\x18\x14\b\x03\x10\x010\x01:\x02\x10\x01@\x01H\aP\x03X\x03`\x01\x12\x8e\x01\n" + @@ -4684,7 +4734,7 @@ func file_saas_accounts_v1_module_capabilities_proto_rawDescGZIP() []byte { } var file_saas_accounts_v1_module_capabilities_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_saas_accounts_v1_module_capabilities_proto_msgTypes = make([]protoimpl.MessageInfo, 58) +var file_saas_accounts_v1_module_capabilities_proto_msgTypes = make([]protoimpl.MessageInfo, 59) var file_saas_accounts_v1_module_capabilities_proto_goTypes = []any{ (ModuleAuditFieldKind)(0), // 0: saas.accounts.v1.ModuleAuditFieldKind (ModuleAuditEventVisibility)(0), // 1: saas.accounts.v1.ModuleAuditEventVisibility @@ -4711,125 +4761,126 @@ var file_saas_accounts_v1_module_capabilities_proto_goTypes = []any{ (*ModuleGetApprovalRequest)(nil), // 22: saas.accounts.v1.ModuleGetApprovalRequest (*ModuleApproval)(nil), // 23: saas.accounts.v1.ModuleApproval (*ModuleCancelApprovalRequest)(nil), // 24: saas.accounts.v1.ModuleCancelApprovalRequest - (*ModuleEmitAuditEventRequest)(nil), // 25: saas.accounts.v1.ModuleEmitAuditEventRequest - (*ModuleAuditFieldDeclaration)(nil), // 26: saas.accounts.v1.ModuleAuditFieldDeclaration - (*ModuleAuditEventTypeDeclaration)(nil), // 27: saas.accounts.v1.ModuleAuditEventTypeDeclaration - (*ModuleDeclareAuditEventTypesRequest)(nil), // 28: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest - (*ModuleDeclareAuditEventTypesResponse)(nil), // 29: saas.accounts.v1.ModuleDeclareAuditEventTypesResponse - (*SubjectVisibilityGrant)(nil), // 30: saas.accounts.v1.SubjectVisibilityGrant - (*ModuleListSubjectVisibilityRequest)(nil), // 31: saas.accounts.v1.ModuleListSubjectVisibilityRequest - (*ModuleListSubjectVisibilityResponse)(nil), // 32: saas.accounts.v1.ModuleListSubjectVisibilityResponse - (*FetchDatasourceBlobRequest)(nil), // 33: saas.accounts.v1.FetchDatasourceBlobRequest - (*FetchDatasourceBlobChunk)(nil), // 34: saas.accounts.v1.FetchDatasourceBlobChunk - (*DatasourceFileRef)(nil), // 35: saas.accounts.v1.DatasourceFileRef - (*FetchDatasourceFilesRequest)(nil), // 36: saas.accounts.v1.FetchDatasourceFilesRequest - (*DatasourceProvenance)(nil), // 37: saas.accounts.v1.DatasourceProvenance - (*DatasourceItemReaders)(nil), // 38: saas.accounts.v1.DatasourceItemReaders - (*DatasourceFileHeader)(nil), // 39: saas.accounts.v1.DatasourceFileHeader - (*FetchDatasourceFilesFrame)(nil), // 40: saas.accounts.v1.FetchDatasourceFilesFrame - (*ModulePublishEventRequest)(nil), // 41: saas.accounts.v1.ModulePublishEventRequest - (*ModulePublishEventResponse)(nil), // 42: saas.accounts.v1.ModulePublishEventResponse - (*ModuleSubscribeRequest)(nil), // 43: saas.accounts.v1.ModuleSubscribeRequest - (*ModuleSubscription)(nil), // 44: saas.accounts.v1.ModuleSubscription - (*ModuleSubscribeResponse)(nil), // 45: saas.accounts.v1.ModuleSubscribeResponse - (*ModuleUnsubscribeRequest)(nil), // 46: saas.accounts.v1.ModuleUnsubscribeRequest - (*ModuleListSubscriptionsRequest)(nil), // 47: saas.accounts.v1.ModuleListSubscriptionsRequest - (*ModuleListSubscriptionsResponse)(nil), // 48: saas.accounts.v1.ModuleListSubscriptionsResponse - (*ModuleReplayEventsRequest)(nil), // 49: saas.accounts.v1.ModuleReplayEventsRequest - (*ModuleReplayEventsResponse)(nil), // 50: saas.accounts.v1.ModuleReplayEventsResponse - (*ReadableSourceCollection)(nil), // 51: saas.accounts.v1.ReadableSourceCollection - (*ReadableCollectionGrant)(nil), // 52: saas.accounts.v1.ReadableCollectionGrant - (*CollectionSyncProvenance)(nil), // 53: saas.accounts.v1.CollectionSyncProvenance - (*ListReadableSourceCollectionsRequest)(nil), // 54: saas.accounts.v1.ListReadableSourceCollectionsRequest - (*ListReadableSourceCollectionsResponse)(nil), // 55: saas.accounts.v1.ListReadableSourceCollectionsResponse - (*ModulePlaceRecordRequest)(nil), // 56: saas.accounts.v1.ModulePlaceRecordRequest - (*ModulePlaceRecordResponse)(nil), // 57: saas.accounts.v1.ModulePlaceRecordResponse - (*VerifyWorkContextRuntimeBoundaryRequest)(nil), // 58: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest - (*VerifyWorkContextRuntimeBoundaryResponse)(nil), // 59: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse - (*CheckWorkContextRecordAccessRequest)(nil), // 60: saas.accounts.v1.CheckWorkContextRecordAccessRequest - (*CheckWorkContextRecordAccessResponse)(nil), // 61: saas.accounts.v1.CheckWorkContextRecordAccessResponse - (*ModuleExchangeDelegatedReadAudienceRequest)(nil), // 62: saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest - (*ModuleExchangeDelegatedOperationAudienceRequest)(nil), // 63: saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest - (*v1.NewJob)(nil), // 64: saas.jobs.v1.NewJob - (v1.JobEnqueueDisposition)(0), // 65: saas.jobs.v1.JobEnqueueDisposition - (*durationpb.Duration)(nil), // 66: google.protobuf.Duration - (*v1.JobEnvelope)(nil), // 67: saas.jobs.v1.JobEnvelope - (*v1.JobLeaseReference)(nil), // 68: saas.jobs.v1.JobLeaseReference - (*v1.JobLease)(nil), // 69: saas.jobs.v1.JobLease - (*v1.JobFailure)(nil), // 70: saas.jobs.v1.JobFailure - (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 72: google.protobuf.Struct - (*v11.EventEnvelope)(nil), // 73: saas.events.v1.EventEnvelope - (*ModuleMintRegistrationRequest)(nil), // 74: saas.accounts.v1.ModuleMintRegistrationRequest - (*SolutionMintRegistrationRequest)(nil), // 75: saas.accounts.v1.SolutionMintRegistrationRequest - (*ModuleMintWorkContextRequest)(nil), // 76: saas.accounts.v1.ModuleMintWorkContextRequest - (*ModuleMintOperationContextRequest)(nil), // 77: saas.accounts.v1.ModuleMintOperationContextRequest - (*ModuleMintSourceOperationContextRequest)(nil), // 78: saas.accounts.v1.ModuleMintSourceOperationContextRequest - (*IssuedWorkContext)(nil), // 79: saas.accounts.v1.IssuedWorkContext - (*emptypb.Empty)(nil), // 80: google.protobuf.Empty - (*ModuleMintRegistrationResponse)(nil), // 81: saas.accounts.v1.ModuleMintRegistrationResponse - (*SolutionMintRegistrationResponse)(nil), // 82: saas.accounts.v1.SolutionMintRegistrationResponse - (*ModuleMintWorkContextResponse)(nil), // 83: saas.accounts.v1.ModuleMintWorkContextResponse - (*ModuleMintOperationContextResponse)(nil), // 84: saas.accounts.v1.ModuleMintOperationContextResponse - (*ModuleMintSourceOperationContextResponse)(nil), // 85: saas.accounts.v1.ModuleMintSourceOperationContextResponse + (*ModuleLookupAuditEventResponse)(nil), // 25: saas.accounts.v1.ModuleLookupAuditEventResponse + (*ModuleEmitAuditEventRequest)(nil), // 26: saas.accounts.v1.ModuleEmitAuditEventRequest + (*ModuleAuditFieldDeclaration)(nil), // 27: saas.accounts.v1.ModuleAuditFieldDeclaration + (*ModuleAuditEventTypeDeclaration)(nil), // 28: saas.accounts.v1.ModuleAuditEventTypeDeclaration + (*ModuleDeclareAuditEventTypesRequest)(nil), // 29: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest + (*ModuleDeclareAuditEventTypesResponse)(nil), // 30: saas.accounts.v1.ModuleDeclareAuditEventTypesResponse + (*SubjectVisibilityGrant)(nil), // 31: saas.accounts.v1.SubjectVisibilityGrant + (*ModuleListSubjectVisibilityRequest)(nil), // 32: saas.accounts.v1.ModuleListSubjectVisibilityRequest + (*ModuleListSubjectVisibilityResponse)(nil), // 33: saas.accounts.v1.ModuleListSubjectVisibilityResponse + (*FetchDatasourceBlobRequest)(nil), // 34: saas.accounts.v1.FetchDatasourceBlobRequest + (*FetchDatasourceBlobChunk)(nil), // 35: saas.accounts.v1.FetchDatasourceBlobChunk + (*DatasourceFileRef)(nil), // 36: saas.accounts.v1.DatasourceFileRef + (*FetchDatasourceFilesRequest)(nil), // 37: saas.accounts.v1.FetchDatasourceFilesRequest + (*DatasourceProvenance)(nil), // 38: saas.accounts.v1.DatasourceProvenance + (*DatasourceItemReaders)(nil), // 39: saas.accounts.v1.DatasourceItemReaders + (*DatasourceFileHeader)(nil), // 40: saas.accounts.v1.DatasourceFileHeader + (*FetchDatasourceFilesFrame)(nil), // 41: saas.accounts.v1.FetchDatasourceFilesFrame + (*ModulePublishEventRequest)(nil), // 42: saas.accounts.v1.ModulePublishEventRequest + (*ModulePublishEventResponse)(nil), // 43: saas.accounts.v1.ModulePublishEventResponse + (*ModuleSubscribeRequest)(nil), // 44: saas.accounts.v1.ModuleSubscribeRequest + (*ModuleSubscription)(nil), // 45: saas.accounts.v1.ModuleSubscription + (*ModuleSubscribeResponse)(nil), // 46: saas.accounts.v1.ModuleSubscribeResponse + (*ModuleUnsubscribeRequest)(nil), // 47: saas.accounts.v1.ModuleUnsubscribeRequest + (*ModuleListSubscriptionsRequest)(nil), // 48: saas.accounts.v1.ModuleListSubscriptionsRequest + (*ModuleListSubscriptionsResponse)(nil), // 49: saas.accounts.v1.ModuleListSubscriptionsResponse + (*ModuleReplayEventsRequest)(nil), // 50: saas.accounts.v1.ModuleReplayEventsRequest + (*ModuleReplayEventsResponse)(nil), // 51: saas.accounts.v1.ModuleReplayEventsResponse + (*ReadableSourceCollection)(nil), // 52: saas.accounts.v1.ReadableSourceCollection + (*ReadableCollectionGrant)(nil), // 53: saas.accounts.v1.ReadableCollectionGrant + (*CollectionSyncProvenance)(nil), // 54: saas.accounts.v1.CollectionSyncProvenance + (*ListReadableSourceCollectionsRequest)(nil), // 55: saas.accounts.v1.ListReadableSourceCollectionsRequest + (*ListReadableSourceCollectionsResponse)(nil), // 56: saas.accounts.v1.ListReadableSourceCollectionsResponse + (*ModulePlaceRecordRequest)(nil), // 57: saas.accounts.v1.ModulePlaceRecordRequest + (*ModulePlaceRecordResponse)(nil), // 58: saas.accounts.v1.ModulePlaceRecordResponse + (*VerifyWorkContextRuntimeBoundaryRequest)(nil), // 59: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest + (*VerifyWorkContextRuntimeBoundaryResponse)(nil), // 60: saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse + (*CheckWorkContextRecordAccessRequest)(nil), // 61: saas.accounts.v1.CheckWorkContextRecordAccessRequest + (*CheckWorkContextRecordAccessResponse)(nil), // 62: saas.accounts.v1.CheckWorkContextRecordAccessResponse + (*ModuleExchangeDelegatedReadAudienceRequest)(nil), // 63: saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest + (*ModuleExchangeDelegatedOperationAudienceRequest)(nil), // 64: saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest + (*v1.NewJob)(nil), // 65: saas.jobs.v1.NewJob + (v1.JobEnqueueDisposition)(0), // 66: saas.jobs.v1.JobEnqueueDisposition + (*durationpb.Duration)(nil), // 67: google.protobuf.Duration + (*v1.JobEnvelope)(nil), // 68: saas.jobs.v1.JobEnvelope + (*v1.JobLeaseReference)(nil), // 69: saas.jobs.v1.JobLeaseReference + (*v1.JobLease)(nil), // 70: saas.jobs.v1.JobLease + (*v1.JobFailure)(nil), // 71: saas.jobs.v1.JobFailure + (*timestamppb.Timestamp)(nil), // 72: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 73: google.protobuf.Struct + (*v11.EventEnvelope)(nil), // 74: saas.events.v1.EventEnvelope + (*ModuleMintRegistrationRequest)(nil), // 75: saas.accounts.v1.ModuleMintRegistrationRequest + (*SolutionMintRegistrationRequest)(nil), // 76: saas.accounts.v1.SolutionMintRegistrationRequest + (*ModuleMintWorkContextRequest)(nil), // 77: saas.accounts.v1.ModuleMintWorkContextRequest + (*ModuleMintOperationContextRequest)(nil), // 78: saas.accounts.v1.ModuleMintOperationContextRequest + (*ModuleMintSourceOperationContextRequest)(nil), // 79: saas.accounts.v1.ModuleMintSourceOperationContextRequest + (*IssuedWorkContext)(nil), // 80: saas.accounts.v1.IssuedWorkContext + (*emptypb.Empty)(nil), // 81: google.protobuf.Empty + (*ModuleMintRegistrationResponse)(nil), // 82: saas.accounts.v1.ModuleMintRegistrationResponse + (*SolutionMintRegistrationResponse)(nil), // 83: saas.accounts.v1.SolutionMintRegistrationResponse + (*ModuleMintWorkContextResponse)(nil), // 84: saas.accounts.v1.ModuleMintWorkContextResponse + (*ModuleMintOperationContextResponse)(nil), // 85: saas.accounts.v1.ModuleMintOperationContextResponse + (*ModuleMintSourceOperationContextResponse)(nil), // 86: saas.accounts.v1.ModuleMintSourceOperationContextResponse } var file_saas_accounts_v1_module_capabilities_proto_depIdxs = []int32{ - 64, // 0: saas.accounts.v1.ModuleEnqueueJobRequest.job:type_name -> saas.jobs.v1.NewJob - 65, // 1: saas.accounts.v1.ModuleEnqueueJobResponse.disposition:type_name -> saas.jobs.v1.JobEnqueueDisposition - 66, // 2: saas.accounts.v1.ModuleClaimJobsRequest.lease_duration:type_name -> google.protobuf.Duration - 67, // 3: saas.accounts.v1.ModuleClaimJobsResponse.jobs:type_name -> saas.jobs.v1.JobEnvelope - 68, // 4: saas.accounts.v1.ModuleHeartbeatJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 66, // 5: saas.accounts.v1.ModuleHeartbeatJobRequest.extension:type_name -> google.protobuf.Duration - 69, // 6: saas.accounts.v1.ModuleHeartbeatJobResponse.lease:type_name -> saas.jobs.v1.JobLease - 68, // 7: saas.accounts.v1.ModuleAckJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 68, // 8: saas.accounts.v1.ModuleNackJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference - 70, // 9: saas.accounts.v1.ModuleNackJobRequest.failure:type_name -> saas.jobs.v1.JobFailure - 71, // 10: saas.accounts.v1.ModuleNackJobRequest.retry_at:type_name -> google.protobuf.Timestamp - 72, // 11: saas.accounts.v1.ModuleResumeRef.payload:type_name -> google.protobuf.Struct - 72, // 12: saas.accounts.v1.ModuleRequestApprovalRequest.subject:type_name -> google.protobuf.Struct + 65, // 0: saas.accounts.v1.ModuleEnqueueJobRequest.job:type_name -> saas.jobs.v1.NewJob + 66, // 1: saas.accounts.v1.ModuleEnqueueJobResponse.disposition:type_name -> saas.jobs.v1.JobEnqueueDisposition + 67, // 2: saas.accounts.v1.ModuleClaimJobsRequest.lease_duration:type_name -> google.protobuf.Duration + 68, // 3: saas.accounts.v1.ModuleClaimJobsResponse.jobs:type_name -> saas.jobs.v1.JobEnvelope + 69, // 4: saas.accounts.v1.ModuleHeartbeatJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 67, // 5: saas.accounts.v1.ModuleHeartbeatJobRequest.extension:type_name -> google.protobuf.Duration + 70, // 6: saas.accounts.v1.ModuleHeartbeatJobResponse.lease:type_name -> saas.jobs.v1.JobLease + 69, // 7: saas.accounts.v1.ModuleAckJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 69, // 8: saas.accounts.v1.ModuleNackJobRequest.lease:type_name -> saas.jobs.v1.JobLeaseReference + 71, // 9: saas.accounts.v1.ModuleNackJobRequest.failure:type_name -> saas.jobs.v1.JobFailure + 72, // 10: saas.accounts.v1.ModuleNackJobRequest.retry_at:type_name -> google.protobuf.Timestamp + 73, // 11: saas.accounts.v1.ModuleResumeRef.payload:type_name -> google.protobuf.Struct + 73, // 12: saas.accounts.v1.ModuleRequestApprovalRequest.subject:type_name -> google.protobuf.Struct 18, // 13: saas.accounts.v1.ModuleRequestApprovalRequest.policy:type_name -> saas.accounts.v1.ModuleApprovalPolicy 19, // 14: saas.accounts.v1.ModuleRequestApprovalRequest.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef - 71, // 15: saas.accounts.v1.ModuleRequestApprovalRequest.expires_at:type_name -> google.protobuf.Timestamp - 71, // 16: saas.accounts.v1.ModuleRequestApprovalRequest.escalate_at:type_name -> google.protobuf.Timestamp - 72, // 17: saas.accounts.v1.ModuleApproval.subject:type_name -> google.protobuf.Struct + 72, // 15: saas.accounts.v1.ModuleRequestApprovalRequest.expires_at:type_name -> google.protobuf.Timestamp + 72, // 16: saas.accounts.v1.ModuleRequestApprovalRequest.escalate_at:type_name -> google.protobuf.Timestamp + 73, // 17: saas.accounts.v1.ModuleApproval.subject:type_name -> google.protobuf.Struct 19, // 18: saas.accounts.v1.ModuleApproval.resume_ref:type_name -> saas.accounts.v1.ModuleResumeRef - 71, // 19: saas.accounts.v1.ModuleApproval.expires_at:type_name -> google.protobuf.Timestamp - 71, // 20: saas.accounts.v1.ModuleApproval.escalate_at:type_name -> google.protobuf.Timestamp - 71, // 21: saas.accounts.v1.ModuleApproval.created_at:type_name -> google.protobuf.Timestamp - 72, // 22: saas.accounts.v1.ModuleEmitAuditEventRequest.fields:type_name -> google.protobuf.Struct + 72, // 19: saas.accounts.v1.ModuleApproval.expires_at:type_name -> google.protobuf.Timestamp + 72, // 20: saas.accounts.v1.ModuleApproval.escalate_at:type_name -> google.protobuf.Timestamp + 72, // 21: saas.accounts.v1.ModuleApproval.created_at:type_name -> google.protobuf.Timestamp + 73, // 22: saas.accounts.v1.ModuleEmitAuditEventRequest.fields:type_name -> google.protobuf.Struct 0, // 23: saas.accounts.v1.ModuleAuditFieldDeclaration.kind:type_name -> saas.accounts.v1.ModuleAuditFieldKind - 26, // 24: saas.accounts.v1.ModuleAuditEventTypeDeclaration.fields:type_name -> saas.accounts.v1.ModuleAuditFieldDeclaration + 27, // 24: saas.accounts.v1.ModuleAuditEventTypeDeclaration.fields:type_name -> saas.accounts.v1.ModuleAuditFieldDeclaration 1, // 25: saas.accounts.v1.ModuleAuditEventTypeDeclaration.visibility:type_name -> saas.accounts.v1.ModuleAuditEventVisibility - 27, // 26: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest.types:type_name -> saas.accounts.v1.ModuleAuditEventTypeDeclaration - 71, // 27: saas.accounts.v1.SubjectVisibilityGrant.expires_at:type_name -> google.protobuf.Timestamp - 30, // 28: saas.accounts.v1.ModuleListSubjectVisibilityResponse.grants:type_name -> saas.accounts.v1.SubjectVisibilityGrant - 35, // 29: saas.accounts.v1.FetchDatasourceFilesRequest.files:type_name -> saas.accounts.v1.DatasourceFileRef + 28, // 26: saas.accounts.v1.ModuleDeclareAuditEventTypesRequest.types:type_name -> saas.accounts.v1.ModuleAuditEventTypeDeclaration + 72, // 27: saas.accounts.v1.SubjectVisibilityGrant.expires_at:type_name -> google.protobuf.Timestamp + 31, // 28: saas.accounts.v1.ModuleListSubjectVisibilityResponse.grants:type_name -> saas.accounts.v1.SubjectVisibilityGrant + 36, // 29: saas.accounts.v1.FetchDatasourceFilesRequest.files:type_name -> saas.accounts.v1.DatasourceFileRef 2, // 30: saas.accounts.v1.DatasourceItemReaders.basis:type_name -> saas.accounts.v1.DatasourceItemReadersBasis - 37, // 31: saas.accounts.v1.DatasourceFileHeader.provenance:type_name -> saas.accounts.v1.DatasourceProvenance - 38, // 32: saas.accounts.v1.DatasourceFileHeader.readers:type_name -> saas.accounts.v1.DatasourceItemReaders - 39, // 33: saas.accounts.v1.FetchDatasourceFilesFrame.header:type_name -> saas.accounts.v1.DatasourceFileHeader - 73, // 34: saas.accounts.v1.ModulePublishEventRequest.envelope:type_name -> saas.events.v1.EventEnvelope + 38, // 31: saas.accounts.v1.DatasourceFileHeader.provenance:type_name -> saas.accounts.v1.DatasourceProvenance + 39, // 32: saas.accounts.v1.DatasourceFileHeader.readers:type_name -> saas.accounts.v1.DatasourceItemReaders + 40, // 33: saas.accounts.v1.FetchDatasourceFilesFrame.header:type_name -> saas.accounts.v1.DatasourceFileHeader + 74, // 34: saas.accounts.v1.ModulePublishEventRequest.envelope:type_name -> saas.events.v1.EventEnvelope 3, // 35: saas.accounts.v1.ModuleSubscribeRequest.delivery:type_name -> saas.accounts.v1.EventDelivery 3, // 36: saas.accounts.v1.ModuleSubscription.delivery:type_name -> saas.accounts.v1.EventDelivery - 71, // 37: saas.accounts.v1.ModuleSubscription.created_at:type_name -> google.protobuf.Timestamp - 44, // 38: saas.accounts.v1.ModuleSubscribeResponse.subscription:type_name -> saas.accounts.v1.ModuleSubscription - 44, // 39: saas.accounts.v1.ModuleListSubscriptionsResponse.subscriptions:type_name -> saas.accounts.v1.ModuleSubscription - 71, // 40: saas.accounts.v1.ModuleReplayEventsRequest.since:type_name -> google.protobuf.Timestamp + 72, // 37: saas.accounts.v1.ModuleSubscription.created_at:type_name -> google.protobuf.Timestamp + 45, // 38: saas.accounts.v1.ModuleSubscribeResponse.subscription:type_name -> saas.accounts.v1.ModuleSubscription + 45, // 39: saas.accounts.v1.ModuleListSubscriptionsResponse.subscriptions:type_name -> saas.accounts.v1.ModuleSubscription + 72, // 40: saas.accounts.v1.ModuleReplayEventsRequest.since:type_name -> google.protobuf.Timestamp 4, // 41: saas.accounts.v1.ReadableSourceCollection.grant_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure - 52, // 42: saas.accounts.v1.ReadableSourceCollection.read_grants:type_name -> saas.accounts.v1.ReadableCollectionGrant - 53, // 43: saas.accounts.v1.ReadableSourceCollection.sync:type_name -> saas.accounts.v1.CollectionSyncProvenance - 71, // 44: saas.accounts.v1.ReadableCollectionGrant.expires_at:type_name -> google.protobuf.Timestamp + 53, // 42: saas.accounts.v1.ReadableSourceCollection.read_grants:type_name -> saas.accounts.v1.ReadableCollectionGrant + 54, // 43: saas.accounts.v1.ReadableSourceCollection.sync:type_name -> saas.accounts.v1.CollectionSyncProvenance + 72, // 44: saas.accounts.v1.ReadableCollectionGrant.expires_at:type_name -> google.protobuf.Timestamp 5, // 45: saas.accounts.v1.CollectionSyncProvenance.stage:type_name -> saas.accounts.v1.SourceSyncStage - 71, // 46: saas.accounts.v1.CollectionSyncProvenance.at:type_name -> google.protobuf.Timestamp + 72, // 46: saas.accounts.v1.CollectionSyncProvenance.at:type_name -> google.protobuf.Timestamp 4, // 47: saas.accounts.v1.CollectionSyncProvenance.requester_disclosure:type_name -> saas.accounts.v1.MetadataDisclosure - 71, // 48: saas.accounts.v1.CollectionSyncProvenance.requested_at:type_name -> google.protobuf.Timestamp - 51, // 49: saas.accounts.v1.ListReadableSourceCollectionsResponse.collections:type_name -> saas.accounts.v1.ReadableSourceCollection - 62, // 50: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest - 63, // 51: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest - 58, // 52: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:input_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest - 60, // 53: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:input_type -> saas.accounts.v1.CheckWorkContextRecordAccessRequest - 54, // 54: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:input_type -> saas.accounts.v1.ListReadableSourceCollectionsRequest - 56, // 55: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:input_type -> saas.accounts.v1.ModulePlaceRecordRequest + 72, // 48: saas.accounts.v1.CollectionSyncProvenance.requested_at:type_name -> google.protobuf.Timestamp + 52, // 49: saas.accounts.v1.ListReadableSourceCollectionsResponse.collections:type_name -> saas.accounts.v1.ReadableSourceCollection + 63, // 50: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedReadAudienceRequest + 64, // 51: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:input_type -> saas.accounts.v1.ModuleExchangeDelegatedOperationAudienceRequest + 59, // 52: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:input_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryRequest + 61, // 53: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:input_type -> saas.accounts.v1.CheckWorkContextRecordAccessRequest + 55, // 54: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:input_type -> saas.accounts.v1.ListReadableSourceCollectionsRequest + 57, // 55: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:input_type -> saas.accounts.v1.ModulePlaceRecordRequest 6, // 56: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:input_type -> saas.accounts.v1.ModuleEnqueueJobRequest 8, // 57: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:input_type -> saas.accounts.v1.ModuleClaimJobsRequest 10, // 58: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:input_type -> saas.accounts.v1.ModuleHeartbeatJobRequest @@ -4840,54 +4891,56 @@ var file_saas_accounts_v1_module_capabilities_proto_depIdxs = []int32{ 20, // 63: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:input_type -> saas.accounts.v1.ModuleRequestApprovalRequest 22, // 64: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:input_type -> saas.accounts.v1.ModuleGetApprovalRequest 24, // 65: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:input_type -> saas.accounts.v1.ModuleCancelApprovalRequest - 25, // 66: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:input_type -> saas.accounts.v1.ModuleEmitAuditEventRequest - 28, // 67: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:input_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesRequest - 31, // 68: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:input_type -> saas.accounts.v1.ModuleListSubjectVisibilityRequest - 33, // 69: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:input_type -> saas.accounts.v1.FetchDatasourceBlobRequest - 36, // 70: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:input_type -> saas.accounts.v1.FetchDatasourceFilesRequest - 74, // 71: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:input_type -> saas.accounts.v1.ModuleMintRegistrationRequest - 75, // 72: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:input_type -> saas.accounts.v1.SolutionMintRegistrationRequest - 76, // 73: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:input_type -> saas.accounts.v1.ModuleMintWorkContextRequest - 77, // 74: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:input_type -> saas.accounts.v1.ModuleMintOperationContextRequest - 78, // 75: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:input_type -> saas.accounts.v1.ModuleMintSourceOperationContextRequest - 41, // 76: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:input_type -> saas.accounts.v1.ModulePublishEventRequest - 43, // 77: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:input_type -> saas.accounts.v1.ModuleSubscribeRequest - 46, // 78: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:input_type -> saas.accounts.v1.ModuleUnsubscribeRequest - 47, // 79: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:input_type -> saas.accounts.v1.ModuleListSubscriptionsRequest - 49, // 80: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:input_type -> saas.accounts.v1.ModuleReplayEventsRequest - 79, // 81: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:output_type -> saas.accounts.v1.IssuedWorkContext - 79, // 82: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:output_type -> saas.accounts.v1.IssuedWorkContext - 59, // 83: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:output_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse - 61, // 84: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:output_type -> saas.accounts.v1.CheckWorkContextRecordAccessResponse - 55, // 85: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:output_type -> saas.accounts.v1.ListReadableSourceCollectionsResponse - 57, // 86: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:output_type -> saas.accounts.v1.ModulePlaceRecordResponse - 7, // 87: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:output_type -> saas.accounts.v1.ModuleEnqueueJobResponse - 9, // 88: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:output_type -> saas.accounts.v1.ModuleClaimJobsResponse - 11, // 89: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:output_type -> saas.accounts.v1.ModuleHeartbeatJobResponse - 80, // 90: saas.accounts.v1.ModuleCapabilitiesService.AckJob:output_type -> google.protobuf.Empty - 80, // 91: saas.accounts.v1.ModuleCapabilitiesService.NackJob:output_type -> google.protobuf.Empty - 15, // 92: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:output_type -> saas.accounts.v1.ModuleNotifyUserResponse - 17, // 93: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:output_type -> saas.accounts.v1.ModuleNotifyOrgAdminsResponse - 21, // 94: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:output_type -> saas.accounts.v1.ModuleRequestApprovalResponse - 23, // 95: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:output_type -> saas.accounts.v1.ModuleApproval - 80, // 96: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:output_type -> google.protobuf.Empty - 80, // 97: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:output_type -> google.protobuf.Empty - 29, // 98: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:output_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesResponse - 32, // 99: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:output_type -> saas.accounts.v1.ModuleListSubjectVisibilityResponse - 34, // 100: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:output_type -> saas.accounts.v1.FetchDatasourceBlobChunk - 40, // 101: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:output_type -> saas.accounts.v1.FetchDatasourceFilesFrame - 81, // 102: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:output_type -> saas.accounts.v1.ModuleMintRegistrationResponse - 82, // 103: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:output_type -> saas.accounts.v1.SolutionMintRegistrationResponse - 83, // 104: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:output_type -> saas.accounts.v1.ModuleMintWorkContextResponse - 84, // 105: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:output_type -> saas.accounts.v1.ModuleMintOperationContextResponse - 85, // 106: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:output_type -> saas.accounts.v1.ModuleMintSourceOperationContextResponse - 42, // 107: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:output_type -> saas.accounts.v1.ModulePublishEventResponse - 45, // 108: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:output_type -> saas.accounts.v1.ModuleSubscribeResponse - 80, // 109: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:output_type -> google.protobuf.Empty - 48, // 110: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:output_type -> saas.accounts.v1.ModuleListSubscriptionsResponse - 50, // 111: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:output_type -> saas.accounts.v1.ModuleReplayEventsResponse - 81, // [81:112] is the sub-list for method output_type - 50, // [50:81] is the sub-list for method input_type + 26, // 66: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:input_type -> saas.accounts.v1.ModuleEmitAuditEventRequest + 26, // 67: saas.accounts.v1.ModuleCapabilitiesService.LookupAuditEvent:input_type -> saas.accounts.v1.ModuleEmitAuditEventRequest + 29, // 68: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:input_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesRequest + 32, // 69: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:input_type -> saas.accounts.v1.ModuleListSubjectVisibilityRequest + 34, // 70: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:input_type -> saas.accounts.v1.FetchDatasourceBlobRequest + 37, // 71: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:input_type -> saas.accounts.v1.FetchDatasourceFilesRequest + 75, // 72: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:input_type -> saas.accounts.v1.ModuleMintRegistrationRequest + 76, // 73: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:input_type -> saas.accounts.v1.SolutionMintRegistrationRequest + 77, // 74: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:input_type -> saas.accounts.v1.ModuleMintWorkContextRequest + 78, // 75: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:input_type -> saas.accounts.v1.ModuleMintOperationContextRequest + 79, // 76: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:input_type -> saas.accounts.v1.ModuleMintSourceOperationContextRequest + 42, // 77: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:input_type -> saas.accounts.v1.ModulePublishEventRequest + 44, // 78: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:input_type -> saas.accounts.v1.ModuleSubscribeRequest + 47, // 79: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:input_type -> saas.accounts.v1.ModuleUnsubscribeRequest + 48, // 80: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:input_type -> saas.accounts.v1.ModuleListSubscriptionsRequest + 50, // 81: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:input_type -> saas.accounts.v1.ModuleReplayEventsRequest + 80, // 82: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedReadAudience:output_type -> saas.accounts.v1.IssuedWorkContext + 80, // 83: saas.accounts.v1.ModuleCapabilitiesService.ExchangeDelegatedOperationAudience:output_type -> saas.accounts.v1.IssuedWorkContext + 60, // 84: saas.accounts.v1.ModuleCapabilitiesService.VerifyWorkContextRuntimeBoundary:output_type -> saas.accounts.v1.VerifyWorkContextRuntimeBoundaryResponse + 62, // 85: saas.accounts.v1.ModuleCapabilitiesService.CheckWorkContextRecordAccess:output_type -> saas.accounts.v1.CheckWorkContextRecordAccessResponse + 56, // 86: saas.accounts.v1.ModuleCapabilitiesService.ListReadableSourceCollections:output_type -> saas.accounts.v1.ListReadableSourceCollectionsResponse + 58, // 87: saas.accounts.v1.ModuleCapabilitiesService.PlaceRecord:output_type -> saas.accounts.v1.ModulePlaceRecordResponse + 7, // 88: saas.accounts.v1.ModuleCapabilitiesService.EnqueueJob:output_type -> saas.accounts.v1.ModuleEnqueueJobResponse + 9, // 89: saas.accounts.v1.ModuleCapabilitiesService.ClaimJobs:output_type -> saas.accounts.v1.ModuleClaimJobsResponse + 11, // 90: saas.accounts.v1.ModuleCapabilitiesService.HeartbeatJob:output_type -> saas.accounts.v1.ModuleHeartbeatJobResponse + 81, // 91: saas.accounts.v1.ModuleCapabilitiesService.AckJob:output_type -> google.protobuf.Empty + 81, // 92: saas.accounts.v1.ModuleCapabilitiesService.NackJob:output_type -> google.protobuf.Empty + 15, // 93: saas.accounts.v1.ModuleCapabilitiesService.NotifyUser:output_type -> saas.accounts.v1.ModuleNotifyUserResponse + 17, // 94: saas.accounts.v1.ModuleCapabilitiesService.NotifyOrgAdmins:output_type -> saas.accounts.v1.ModuleNotifyOrgAdminsResponse + 21, // 95: saas.accounts.v1.ModuleCapabilitiesService.RequestApproval:output_type -> saas.accounts.v1.ModuleRequestApprovalResponse + 23, // 96: saas.accounts.v1.ModuleCapabilitiesService.GetApproval:output_type -> saas.accounts.v1.ModuleApproval + 81, // 97: saas.accounts.v1.ModuleCapabilitiesService.CancelApproval:output_type -> google.protobuf.Empty + 81, // 98: saas.accounts.v1.ModuleCapabilitiesService.EmitAuditEvent:output_type -> google.protobuf.Empty + 25, // 99: saas.accounts.v1.ModuleCapabilitiesService.LookupAuditEvent:output_type -> saas.accounts.v1.ModuleLookupAuditEventResponse + 30, // 100: saas.accounts.v1.ModuleCapabilitiesService.DeclareAuditEventTypes:output_type -> saas.accounts.v1.ModuleDeclareAuditEventTypesResponse + 33, // 101: saas.accounts.v1.ModuleCapabilitiesService.ListSubjectVisibility:output_type -> saas.accounts.v1.ModuleListSubjectVisibilityResponse + 35, // 102: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceBlob:output_type -> saas.accounts.v1.FetchDatasourceBlobChunk + 41, // 103: saas.accounts.v1.ModuleCapabilitiesService.FetchDatasourceFiles:output_type -> saas.accounts.v1.FetchDatasourceFilesFrame + 82, // 104: saas.accounts.v1.ModuleCapabilitiesService.MintModuleRegistration:output_type -> saas.accounts.v1.ModuleMintRegistrationResponse + 83, // 105: saas.accounts.v1.ModuleCapabilitiesService.MintSolutionRegistration:output_type -> saas.accounts.v1.SolutionMintRegistrationResponse + 84, // 106: saas.accounts.v1.ModuleCapabilitiesService.MintModuleWorkContext:output_type -> saas.accounts.v1.ModuleMintWorkContextResponse + 85, // 107: saas.accounts.v1.ModuleCapabilitiesService.MintModuleOperationContext:output_type -> saas.accounts.v1.ModuleMintOperationContextResponse + 86, // 108: saas.accounts.v1.ModuleCapabilitiesService.MintSourceOperationContext:output_type -> saas.accounts.v1.ModuleMintSourceOperationContextResponse + 43, // 109: saas.accounts.v1.ModuleCapabilitiesService.PublishEvent:output_type -> saas.accounts.v1.ModulePublishEventResponse + 46, // 110: saas.accounts.v1.ModuleCapabilitiesService.Subscribe:output_type -> saas.accounts.v1.ModuleSubscribeResponse + 81, // 111: saas.accounts.v1.ModuleCapabilitiesService.Unsubscribe:output_type -> google.protobuf.Empty + 49, // 112: saas.accounts.v1.ModuleCapabilitiesService.ListSubscriptions:output_type -> saas.accounts.v1.ModuleListSubscriptionsResponse + 51, // 113: saas.accounts.v1.ModuleCapabilitiesService.ReplayEvents:output_type -> saas.accounts.v1.ModuleReplayEventsResponse + 82, // [82:114] is the sub-list for method output_type + 50, // [50:82] is the sub-list for method input_type 50, // [50:50] is the sub-list for extension type_name 50, // [50:50] is the sub-list for extension extendee 0, // [0:50] is the sub-list for field type_name @@ -4900,7 +4953,7 @@ func file_saas_accounts_v1_module_capabilities_proto_init() { } file_saas_accounts_v1_work_contexts_proto_init() file_saas_accounts_v1_module_registration_proto_init() - file_saas_accounts_v1_module_capabilities_proto_msgTypes[34].OneofWrappers = []any{ + file_saas_accounts_v1_module_capabilities_proto_msgTypes[35].OneofWrappers = []any{ (*FetchDatasourceFilesFrame_Header)(nil), (*FetchDatasourceFilesFrame_Data)(nil), } @@ -4910,7 +4963,7 @@ func file_saas_accounts_v1_module_capabilities_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_saas_accounts_v1_module_capabilities_proto_rawDesc), len(file_saas_accounts_v1_module_capabilities_proto_rawDesc)), NumEnums: 6, - NumMessages: 58, + NumMessages: 59, NumExtensions: 0, NumServices: 1, }, diff --git a/moduleauthority/audit.go b/moduleauthority/audit.go new file mode 100644 index 0000000..5ec84d0 --- /dev/null +++ b/moduleauthority/audit.go @@ -0,0 +1,71 @@ +package moduleauthority + +import ( + "context" + "errors" + "fmt" + + v1 "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1" + "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1/accountsv1connect" + "google.golang.org/protobuf/types/known/structpb" +) + +var ErrInvalidAuditEvent = errors.New("module authority: incomplete or invalid audit event") + +// AuditEvent is the complete intent presented to the host audit spine. Tenant +// may be empty only for an authorized system event. Actor and solution scope are +// checked by the host; naming them is not itself proof of authority. +type AuditEvent struct { + Tenant, EventType, Actor, Solution, EntryID string + Fields map[string]any + // Retain the same key and complete intent after an uncertain acknowledgement. + // Lookup requires a key; an unkeyed emission cannot be recovered this way. + IdempotencyKey string +} + +// AuditReceipt identifies a committed event for the requested intent. An empty +// EventID is inconclusive, not proof that no effect happened or permission to +// repeat it. The host rechecks current emission authority on every lookup. +type AuditReceipt struct{ EventID string } + +func auditRequest(event AuditEvent, lookup bool) (*v1.ModuleEmitAuditEventRequest, error) { + if event.EventType == "" || event.Actor == "" || event.Solution == "" || (lookup && event.IdempotencyKey == "") { + return nil, ErrInvalidAuditEvent + } + fields, err := structpb.NewStruct(event.Fields) + if err != nil { + return nil, fmt.Errorf("%w: unsupported field value", ErrInvalidAuditEvent) + } + return &v1.ModuleEmitAuditEventRequest{Tenant: event.Tenant, EventType: event.EventType, + Actor: event.Actor, Solution: event.Solution, EntryId: event.EntryID, + Fields: fields, IdempotencyKey: event.IdempotencyKey}, nil +} + +// EmitAuditEvent commits a registered event as this module. Errors retain their +// host codes, including FailedPrecondition for conflicting or unverifiable keys. +// Only rejected authentication is refreshed once; effect failures are not retried. +func (c *Client) EmitAuditEvent(ctx context.Context, event AuditEvent) error { + request, err := auditRequest(event, false) + if err != nil { + return err + } + _, err = callAsModule(ctx, c, accountsv1connect.ModuleCapabilitiesServiceClient.EmitAuditEvent, request) + if err != nil { + return fmt.Errorf("module authority: emit audit event: %w", err) + } + return nil +} + +// LookupAuditEvent is read-only and requires the complete original event intent. +// It neither emits an event nor turns a missing receipt into a retry decision. +func (c *Client) LookupAuditEvent(ctx context.Context, event AuditEvent) (AuditReceipt, error) { + request, err := auditRequest(event, true) + if err != nil { + return AuditReceipt{}, err + } + response, err := callAsModule(ctx, c, accountsv1connect.ModuleCapabilitiesServiceClient.LookupAuditEvent, request) + if err != nil { + return AuditReceipt{}, fmt.Errorf("module authority: lookup audit event: %w", err) + } + return AuditReceipt{EventID: response.GetEventId()}, nil +} diff --git a/moduleauthority/audit_test.go b/moduleauthority/audit_test.go new file mode 100644 index 0000000..fed6b15 --- /dev/null +++ b/moduleauthority/audit_test.go @@ -0,0 +1,81 @@ +package moduleauthority + +import ( + "errors" + "reflect" + "testing" + + "connectrpc.com/connect" +) + +func TestAuditEmissionAndReceiptUseModuleAuthority(t *testing.T) { + h := newHost(t) + client := h.client(t, moduleCredentials) + event := AuditEvent{Tenant: testTenant, EventType: "example.changed", Actor: testOwner, + Solution: "example", EntryID: "entry", Fields: map[string]any{"count": float64(3)}, IdempotencyKey: "effect-1"} + if err := client.EmitAuditEvent(t.Context(), event); err != nil { + t.Fatal(err) + } + receipt, err := client.LookupAuditEvent(t.Context(), event) + if err != nil || receipt.EventID != "event-1" { + t.Fatalf("receipt=%+v err=%v", receipt, err) + } + calls := h.authority.snapshot() + if len(calls) != 2 { + t.Fatalf("calls=%d", len(calls)) + } + for i, method := range []string{"EmitAuditEvent", "LookupAuditEvent"} { + call := calls[i] + if call.method != "/saas.accounts.v1.ModuleCapabilitiesService/"+method { + t.Fatal(call.method) + } + if len(call.internalToken) != 1 || call.internalToken[0] != testInternalToken || len(call.workContext) != 1 || call.workContext[0] != "module.token1" || len(call.authorization) != 0 { + t.Fatal("wrong authority carriers") + } + e := call.audit + if e.GetTenant() != event.Tenant || e.GetActor() != event.Actor || e.GetEventType() != event.EventType || e.GetSolution() != event.Solution || e.GetEntryId() != event.EntryID || e.GetIdempotencyKey() != event.IdempotencyKey || !reflect.DeepEqual(e.GetFields().AsMap(), event.Fields) { + t.Fatal("audit intent changed in transport") + } + } + event.IdempotencyKey = "missing" + receipt, err = client.LookupAuditEvent(t.Context(), event) + if err != nil || receipt.EventID != "" { + t.Fatal("missing receipt invented an outcome", receipt, err) + } + for _, attempt := range []struct { + key string + code connect.Code + }{{"conflict", connect.CodeFailedPrecondition}, {"unavailable", connect.CodeUnavailable}} { + event.IdempotencyKey = attempt.key + before := len(h.authority.snapshot()) + if err := client.EmitAuditEvent(t.Context(), event); connect.CodeOf(err) != attempt.code { + t.Fatal(err) + } + if _, err := client.LookupAuditEvent(t.Context(), event); connect.CodeOf(err) != attempt.code { + t.Fatal(err) + } + if len(h.authority.snapshot()) != before+2 { + t.Fatal("effect error was retried") + } + } + h.assertNoStrayPaths(t) +} + +func TestAuditInvalidIntentDoesNotReachHost(t *testing.T) { + h := newHost(t) + client := h.client(t, moduleCredentials) + for _, event := range []AuditEvent{ + {}, {EventType: "example.changed", Solution: "example"}, + {EventType: "example.changed", Actor: testOwner, Solution: "example", Fields: map[string]any{"bad": make(chan int)}}, + } { + if err := client.EmitAuditEvent(t.Context(), event); !errors.Is(err, ErrInvalidAuditEvent) { + t.Fatal(err) + } + } + if _, err := client.LookupAuditEvent(t.Context(), AuditEvent{EventType: "example.changed", Actor: testOwner, Solution: "example"}); !errors.Is(err, ErrInvalidAuditEvent) { + t.Fatal(err) + } + if len(h.authority.snapshot()) != 0 { + t.Fatal("invalid intent reached host") + } +} diff --git a/moduleauthority/host_fake_test.go b/moduleauthority/host_fake_test.go index cf138e7..0c9b88b 100644 --- a/moduleauthority/host_fake_test.go +++ b/moduleauthority/host_fake_test.go @@ -19,6 +19,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" v1 "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1" "github.com/codefly-dev/saas-sdk-go/gen/saas/accounts/v1/accountsv1connect" @@ -248,6 +249,7 @@ func (g *fakeGateway) snapshot() (calls, stray []string, bodies map[string][]map // authorityCall is one call the fake authority endpoint received. type authorityCall struct { + audit *v1.ModuleEmitAuditEventRequest boundary *v1.VerifyWorkContextRuntimeBoundaryRequest authorization []string method string @@ -261,6 +263,8 @@ type authorityCall struct { // servedOnAuthority is the slice of business.ModuleAuthorityProcedures this // package calls; Mint* are never among them. var servedOnAuthority = map[string]bool{ + accountsv1connect.ModuleCapabilitiesServiceEmitAuditEventProcedure: true, + accountsv1connect.ModuleCapabilitiesServiceLookupAuditEventProcedure: true, accountsv1connect.ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure: true, accountsv1connect.ModuleCapabilitiesServiceExchangeDelegatedOperationAudienceProcedure: true, accountsv1connect.ModuleCapabilitiesServiceExchangeDelegatedReadAudienceProcedure: true, @@ -306,6 +310,9 @@ func (a *fakeAuthority) handle(_ any, stream grpc.ServerStream) error { case accountsv1connect.ModuleCapabilitiesServiceVerifyWorkContextRuntimeBoundaryProcedure: call.boundary = &v1.VerifyWorkContextRuntimeBoundaryRequest{} recvErr = stream.RecvMsg(call.boundary) + case accountsv1connect.ModuleCapabilitiesServiceEmitAuditEventProcedure, accountsv1connect.ModuleCapabilitiesServiceLookupAuditEventProcedure: + call.audit = &v1.ModuleEmitAuditEventRequest{} + recvErr = stream.RecvMsg(call.audit) case accountsv1connect.ModuleCapabilitiesServiceNotifyOrgAdminsProcedure: call.notice = &v1.ModuleNotifyOrgAdminsRequest{} recvErr = stream.RecvMsg(call.notice) @@ -347,6 +354,22 @@ func (a *fakeAuthority) handle(_ any, stream grpc.ServerStream) error { } return stream.SendMsg(&v1.VerifyWorkContextRuntimeBoundaryResponse{TenantId: testTenant, BoundaryId: exampleSource}) } + if call.audit != nil { + switch call.audit.GetIdempotencyKey() { + case "conflict": + return status.Error(codes.FailedPrecondition, "audit intent conflict") + case "unavailable": + return status.Error(codes.Unavailable, "audit storage unavailable") + } + if method == accountsv1connect.ModuleCapabilitiesServiceEmitAuditEventProcedure { + return stream.SendMsg(&emptypb.Empty{}) + } + eventID := "event-1" + if call.audit.GetIdempotencyKey() == "missing" { + eventID = "" + } + return stream.SendMsg(&v1.ModuleLookupAuditEventResponse{EventId: eventID}) + } if call.notice != nil { // ModuleNotifyOrgAdmins: the host resolves the administrators and // answers only whether any received the notice. From c249f20a898651ededb11e1861dbc8e682c2d373 Mon Sep 17 00:00:00 2001 From: Antoine Toussaint <312536060+antoinetoussaint-byte@users.noreply.github.com> Date: Sat, 10 Oct 2026 18:47:05 -0400 Subject: [PATCH 3/3] fix: restore boundary checks and verify audit recovery transport --- .claude/skills/refresh-generated-api/SKILL.md | 7 +- AGENTS.md | 4 +- README.md | 5 +- go.mod | 12 +-- go.sum | 24 ++--- moduleauthority/audit_test.go | 95 +++++++++++++++++++ 6 files changed, 122 insertions(+), 25 deletions(-) diff --git a/.claude/skills/refresh-generated-api/SKILL.md b/.claude/skills/refresh-generated-api/SKILL.md index e66cb05..a13a8d0 100644 --- a/.claude/skills/refresh-generated-api/SKILL.md +++ b/.claude/skills/refresh-generated-api/SKILL.md @@ -103,7 +103,6 @@ overwrite. ## Scope -Wiring this into module-saas-starter's release, so a saas tag publishes a -matching SDK tag, is tracked in the solutions EPIC (obin-ai/lodestar#53, item -4). Until it lands, this walk is manual — which is a gap in the tooling, not a -step to get good at performing. +Release generation belongs to module-saas-starter and this SDK: a saas tag +must publish a matching SDK contract. Until release automation covers both, +this walk is manual — a gap in the owning tools, not a consumer responsibility. diff --git a/AGENTS.md b/AGENTS.md index e919edd..869a397 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,7 +71,9 @@ gofmt -l . | grep -v '^gen/' # expect no output `go test ./...` is load-bearing beyond the unit tests: `internal/apiboundary` type-checks the entire public surface against the boundary rule below, and -`internal/agentcontext` checks these context files. There is no lint config — +`internal/agentcontext` checks these context files. Keep `golang.org/x/tools` +compatible with the active Go toolchain: its importer must understand Go's +export data for the boundary gate to run. There is no lint config — `golangci-lint` being installed on your machine does not make it a gate here. The same workflow's `gen-drift` job regenerates `gen/` from the ref in diff --git a/README.md b/README.md index cdb7628..9dcd71b 100644 --- a/README.md +++ b/README.md @@ -196,8 +196,9 @@ the correct module path. **Never hand-edit `gen/` or sed the module path** — t protobuf file descriptors embed length-prefixed package strings and a text rewrite corrupts them (panics at `init()`). Always regenerate. -> Wiring this regen into module-saas-starter's release (so a saas tag publishes a -> matching SDK tag) is tracked in the solutions EPIC (obin-ai/lodestar#53, item 4). +Regeneration and matching SDK releases are owned by `module-saas-starter` and +this repository. Until release automation covers both, follow the +`refresh-generated-api` procedure in `.claude/skills/`. ## Consuming diff --git a/go.mod b/go.mod index dad3056..e69ae8e 100644 --- a/go.mod +++ b/go.mod @@ -7,17 +7,17 @@ require ( connectrpc.com/connect v1.21.0 github.com/codefly-dev/core v0.3.32 github.com/codefly-dev/sdk-go/workcontext v0.0.0-20260927024316-b3fb40d43099 - golang.org/x/tools v0.49.0 + golang.org/x/tools v0.52.0 google.golang.org/genproto/googleapis/api v0.0.0-20260819154853-08b0e4226688 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 ) require ( - golang.org/x/mod v0.41.0 // indirect - golang.org/x/net v0.59.0 // indirect - golang.org/x/sync v0.23.0 // indirect - golang.org/x/sys v0.48.0 // indirect - golang.org/x/text v0.42.0 // indirect + golang.org/x/mod v0.42.0 // indirect + golang.org/x/net v0.61.0 // indirect + golang.org/x/sync v0.24.0 // indirect + golang.org/x/sys v0.49.0 // indirect + golang.org/x/text v0.43.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 // indirect ) diff --git a/go.sum b/go.sum index e5832c6..e14c18f 100644 --- a/go.sum +++ b/go.sum @@ -34,18 +34,18 @@ go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu6 go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= -golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= -golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= -golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= -golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= -golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= -golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= -golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= -golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= -golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= -golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= -golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= +golang.org/x/mod v0.42.0 h1:ICeL3t2L30ljSPHHxDnR4fqVcBt/zR2zJAb9juavmQg= +golang.org/x/mod v0.42.0/go.mod h1:u5fzIrRInkL8MaO1cbRkUHT64v303YIT5KEqpNr7jRs= +golang.org/x/net v0.61.0 h1:RR+6j/BTBCrggOLugxa+66R8FvoN6MHlzDlZIbN9YFw= +golang.org/x/net v0.61.0/go.mod h1:WgDCOTH8iwtB66T4/GfI94AHo/hhdb7Hah9NDseQfiI= +golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= +golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= +golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= +golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= +golang.org/x/tools v0.52.0 h1:ryxg4U63oaUYk7uOLTF37n43f4qgtGvqV4Ioit1BaEs= +golang.org/x/tools v0.52.0/go.mod h1:ItcP5UNaVGG+Yc4eIYmaFLNJ4soEopkx5Y2d4lcEurs= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/api v0.0.0-20260819154853-08b0e4226688 h1:ax2KzoSRIZU/M0cIxri3pKxy99vniH1PVxWC6si/eZI= diff --git a/moduleauthority/audit_test.go b/moduleauthority/audit_test.go index fed6b15..34c3b01 100644 --- a/moduleauthority/audit_test.go +++ b/moduleauthority/audit_test.go @@ -2,6 +2,7 @@ package moduleauthority import ( "errors" + "fmt" "reflect" "testing" @@ -79,3 +80,97 @@ func TestAuditInvalidIntentDoesNotReachHost(t *testing.T) { t.Fatal("invalid intent reached host") } } + +// Recovery state belongs to the producer. Recreating an SDK client must not +// replace its persisted key, invent a new event, or replay an uncertain emit. +func TestAuditEmissionPreservesIntentAcrossClientRestart(t *testing.T) { + h := newHost(t) + event := AuditEvent{Tenant: testTenant, EventType: "example.changed", Actor: testOwner, + Solution: "example", EntryID: "entry", Fields: map[string]any{"count": float64(3)}, IdempotencyKey: "unavailable"} + for range 2 { + client := h.client(t, moduleCredentials) + if err := client.EmitAuditEvent(t.Context(), event); connect.CodeOf(err) != connect.CodeUnavailable { + t.Fatalf("uncertain emit: %v", err) + } + if err := client.Close(); err != nil { + t.Fatal(err) + } + } + calls := h.authority.snapshot() + if len(calls) != 2 { + t.Fatalf("got %d attempts for two explicit emits; uncertain effects must not be retried", len(calls)) + } + for _, call := range calls { + if call.method != "/saas.accounts.v1.ModuleCapabilitiesService/EmitAuditEvent" || + call.audit.GetTenant() != event.Tenant || call.audit.GetEventType() != event.EventType || + call.audit.GetActor() != event.Actor || call.audit.GetSolution() != event.Solution || + call.audit.GetEntryId() != event.EntryID || call.audit.GetIdempotencyKey() != event.IdempotencyKey || + !reflect.DeepEqual(call.audit.GetFields().AsMap(), event.Fields) { + t.Fatal("restarting the client changed the caller's audit intent") + } + } + h.assertNoStrayPaths(t) +} + +func TestAuditEmissionRefreshesOnlyRejectedModuleAuthentication(t *testing.T) { + for _, scenario := range []struct { + name string + rejectAll bool + badToken bool + wantCode connect.Code + wantCalls int + }{ + {name: "expired capability", wantCalls: 2}, + {name: "revoked module", rejectAll: true, wantCode: connect.CodeUnauthenticated, wantCalls: 2}, + {name: "invalid perimeter", badToken: true, wantCode: connect.CodePermissionDenied, wantCalls: 1}, + } { + t.Run(scenario.name, func(t *testing.T) { + h := newHost(t) + client := h.client(t, moduleCredentials) + if _, err := client.ModuleWorkContext(t.Context()); err != nil { + t.Fatal(err) + } + h.gateway.revoke("module.token1") + h.gateway.mu.Lock() + h.gateway.rejectAll = scenario.rejectAll + h.gateway.mu.Unlock() + if scenario.badToken { + client.authority.token = "invalid-perimeter-token" + } + event := AuditEvent{Tenant: testTenant, EventType: "example.changed", Actor: testOwner, + Solution: "example", IdempotencyKey: "stable-key"} + err := client.EmitAuditEvent(t.Context(), event) + if scenario.wantCode == 0 && err != nil || scenario.wantCode != 0 && connect.CodeOf(err) != scenario.wantCode { + t.Fatalf("emit error = %v, want code %v", err, scenario.wantCode) + } + calls := h.authority.snapshot() + if len(calls) != scenario.wantCalls { + t.Fatalf("got %d calls, want %d", len(calls), scenario.wantCalls) + } + for i, call := range calls { + if len(call.workContext) != 1 || call.workContext[0] != fmt.Sprintf("module.token%d", i+1) || call.audit.GetIdempotencyKey() != event.IdempotencyKey { + t.Fatal("authentication refresh changed the intent or reused the rejected credential") + } + } + h.assertNoStrayPaths(t) + }) + } +} + +func TestAuditEmissionWithoutAuthorityDoesNotMint(t *testing.T) { + h := newHost(t) + seams := h.seams() + seams.Authority = Authority{} + client, err := New(seams, moduleCredentials) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = client.Close() }) + err = client.EmitAuditEvent(t.Context(), AuditEvent{EventType: "example.changed", Actor: testOwner, Solution: "example"}) + if !errors.Is(err, ErrNoAuthority) { + t.Fatalf("got %v, want ErrNoAuthority", err) + } + if calls, _, _, _ := h.gateway.snapshot(); len(calls) != 0 || len(h.authority.snapshot()) != 0 { + t.Fatal("missing authority seam still contacted the host") + } +}