From f85389e9f7749bfda135014e8cf2bc08ca917186 Mon Sep 17 00:00:00 2001
From: Pavel Antonov <antonov@perx.ru>
Date: Thu, 28 Nov 2024 13:30:54 +0400
Subject: [PATCH] WIP

---
 Taskfile.yaml                                 |   14 +-
 go.mod                                        |    1 +
 pkg/events/{events.go => events_old.go}       |    0
 proto/clients/clients.pb.go                   |  810 ++++---
 proto/clients/clients_grpc.pb.go              |    2 +-
 proto/collaborators/collaborators.pb.go       |  502 ++--
 proto/collaborators/collaborators_grpc.pb.go  |    2 +-
 proto/collections/collections.pb.go           |  696 ++++--
 proto/collections/collections_grpc.pb.go      |    2 +-
 proto/common/common.pb.go                     |  289 +--
 proto/common/error.pb.go                      |  160 +-
 proto/common/operation.pb.go                  |   28 +-
 proto/common/operation_service.pb.go          |   50 +-
 proto/common/operation_service_grpc.pb.go     |    2 +-
 proto/common/validation.pb.go                 |   28 +-
 proto/delivery/delivery.pb.go                 |  380 +--
 proto/delivery/delivery_grpc.pb.go            |    2 +-
 proto/environments/environments.pb.go         |  914 +++----
 proto/environments/environments_grpc.pb.go    |    2 +-
 proto/extensions/extension.pb.go              |  357 ++-
 proto/extensions/extension_service.pb.go      |   94 +-
 proto/extensions/extension_service_grpc.pb.go |    2 +-
 proto/extensions/manager_service.pb.go        |  248 +-
 proto/extensions/manager_service_grpc.pb.go   |    2 +-
 proto/files/files.pb.go                       |  786 +++---
 proto/files/files_grpc.pb.go                  |    2 +-
 proto/images/images.pb.go                     |   94 +-
 proto/images/images_grpc.pb.go                |    2 +-
 proto/invitations/invitations.pb.go           |  336 +--
 proto/invitations/invitations_grpc.pb.go      |    2 +-
 proto/items/items.pb.go                       | 2126 +++++++----------
 proto/items/items_grpc.pb.go                  |    2 +-
 proto/locales/locales.pb.go                   |  508 ++--
 proto/locales/locales_grpc.pb.go              |    2 +-
 proto/logs/log.pb.go                          |   28 +-
 proto/logs/log_service.pb.go                  |  182 +-
 proto/logs/log_service_grpc.pb.go             |    2 +-
 proto/members/members.pb.go                   |  573 +++--
 proto/members/members_grpc.pb.go              |    2 +-
 proto/organizations/organizations.pb.go       |  657 ++---
 proto/organizations/organizations_grpc.pb.go  |    2 +-
 proto/references/references.pb.go             |  138 +-
 proto/references/references_grpc.pb.go        |    2 +-
 proto/roles/roles.pb.go                       |  607 +++--
 proto/roles/roles_grpc.pb.go                  |    2 +-
 proto/spaces/spaces.pb.go                     | 1214 +++++-----
 proto/spaces/spaces_grpc.pb.go                |    2 +-
 proto/users/users.pb.go                       |  891 ++++---
 proto/users/users_grpc.pb.go                  |   48 +-
 proto/versions/account/versions.pb.go         |   28 +-
 proto/versions/account/versions_grpc.pb.go    |    2 +-
 proto/versions/content/versions.pb.go         |   28 +-
 proto/versions/content/versions_grpc.pb.go    |    2 +-
 53 files changed, 6473 insertions(+), 6384 deletions(-)
 rename pkg/events/{events.go => events_old.go} (100%)

diff --git a/Taskfile.yaml b/Taskfile.yaml
index a75ab1d8..727d77d8 100644
--- a/Taskfile.yaml
+++ b/Taskfile.yaml
@@ -2,7 +2,7 @@ version: '3'
 
 vars:
   PROTODIR: perxis-proto/proto
-  PBDIR: pb
+  PBDIR: proto
   CURRENT_VERSION:
     sh: svu current
   RELEASE_VERSION:
@@ -47,16 +47,16 @@ tasks:
 #    silent: true
     cmds:
       - for: sources
-        cmd: echo {{ .ITEM }}
+#        cmd: echo {{ .ITEM }}
 #        cmd: '[ "{{.FILE}}" != "perxis-proto/proto/status/status.proto" ]'
 #          - protoc --proto_path={{ .PROTODIR }} --experimental_allow_proto3_optional --go_out={{ .PBDIR }} --go-grpc_out={{ .PBDIR }} --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative {{ .FILE }}
 
 
-  #        cmd: protoc --proto_path={{ .PROTODIR }} --experimental_allow_proto3_optional --go_out={{ .PBDIR }} --go-grpc_out={{ .PBDIR }} --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative {{ .ITEM }}
-#        task: proto_file
-#        vars:
-#          FILE: '{{ .ITEM }}'
-#        ignore_error: true
+      #cmd: protoc --proto_path={{ .PROTODIR }} --experimental_allow_proto3_optional --go_out={{ .PBDIR }} --go-grpc_out={{ .PBDIR }} --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative {{ .ITEM }}
+        task: proto_file
+        vars:
+          FILE: '{{ .ITEM }}'
+        ignore_error: true
 
 
   proto_file:
diff --git a/go.mod b/go.mod
index 1f94424c..e2c403ac 100644
--- a/go.mod
+++ b/go.mod
@@ -7,6 +7,7 @@ require (
 	github.com/bep/gowebp v0.4.0
 	github.com/expr-lang/expr v1.16.9
 	github.com/go-kit/kit v0.13.0
+	github.com/google/go-cmp v0.6.0
 	github.com/gosimple/slug v1.14.0
 	github.com/hashicorp/go-multierror v1.1.1
 	github.com/hashicorp/golang-lru/v2 v2.0.7
diff --git a/pkg/events/events.go b/pkg/events/events_old.go
similarity index 100%
rename from pkg/events/events.go
rename to pkg/events/events_old.go
diff --git a/proto/clients/clients.pb.go b/proto/clients/clients.pb.go
index 250cdd86..04ecb309 100644
--- a/proto/clients/clients.pb.go
+++ b/proto/clients/clients.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: clients/clients.proto
 
 package clients
@@ -45,11 +45,9 @@ type Client struct {
 
 func (x *Client) Reset() {
 	*x = Client{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Client) String() string {
@@ -60,7 +58,7 @@ func (*Client) ProtoMessage() {}
 
 func (x *Client) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -148,11 +146,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -163,7 +159,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -195,11 +191,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -210,7 +204,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -243,11 +237,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -258,7 +250,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -297,11 +289,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -312,7 +302,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -347,11 +337,9 @@ type GetByRequest struct {
 
 func (x *GetByRequest) Reset() {
 	*x = GetByRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetByRequest) String() string {
@@ -362,7 +350,7 @@ func (*GetByRequest) ProtoMessage() {}
 
 func (x *GetByRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -415,11 +403,9 @@ type GetByResponse struct {
 
 func (x *GetByResponse) Reset() {
 	*x = GetByResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetByResponse) String() string {
@@ -430,7 +416,7 @@ func (*GetByResponse) ProtoMessage() {}
 
 func (x *GetByResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -462,11 +448,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -477,7 +461,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -509,11 +493,9 @@ type ListRequest struct {
 
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRequest) String() string {
@@ -524,7 +506,7 @@ func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -556,11 +538,9 @@ type ListResponse struct {
 
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListResponse) String() string {
@@ -571,7 +551,7 @@ func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -604,11 +584,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -619,7 +597,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -660,11 +638,9 @@ type EnableRequest struct {
 
 func (x *EnableRequest) Reset() {
 	*x = EnableRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EnableRequest) String() string {
@@ -675,7 +651,7 @@ func (*EnableRequest) ProtoMessage() {}
 
 func (x *EnableRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_clients_clients_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -711,6 +687,129 @@ func (x *EnableRequest) GetEnable() bool {
 	return false
 }
 
+type ClientEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"`
+	SpaceId  string `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*ClientEvent_Create
+	//	*ClientEvent_Update
+	//	*ClientEvent_Delete
+	//	*ClientEvent_Enable
+	Event isClientEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *ClientEvent) Reset() {
+	*x = ClientEvent{}
+	mi := &file_clients_clients_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ClientEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientEvent) ProtoMessage() {}
+
+func (x *ClientEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_clients_clients_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 ClientEvent.ProtoReflect.Descriptor instead.
+func (*ClientEvent) Descriptor() ([]byte, []int) {
+	return file_clients_clients_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *ClientEvent) GetClientId() string {
+	if x != nil {
+		return x.ClientId
+	}
+	return ""
+}
+
+func (x *ClientEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (m *ClientEvent) GetEvent() isClientEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *ClientEvent) GetCreate() *ClientEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*ClientEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *ClientEvent) GetUpdate() *ClientEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*ClientEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *ClientEvent) GetDelete() *ClientEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*ClientEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+func (x *ClientEvent) GetEnable() *ClientEvent_EnableEvent {
+	if x, ok := x.GetEvent().(*ClientEvent_Enable); ok {
+		return x.Enable
+	}
+	return nil
+}
+
+type isClientEvent_Event interface {
+	isClientEvent_Event()
+}
+
+type ClientEvent_Create struct {
+	Create *ClientEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type ClientEvent_Update struct {
+	Update *ClientEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type ClientEvent_Delete struct {
+	Delete *ClientEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+type ClientEvent_Enable struct {
+	Enable *ClientEvent_EnableEvent `protobuf:"bytes,103,opt,name=enable,proto3,oneof"`
+}
+
+func (*ClientEvent_Create) isClientEvent_Event() {}
+
+func (*ClientEvent_Update) isClientEvent_Event() {}
+
+func (*ClientEvent_Delete) isClientEvent_Event() {}
+
+func (*ClientEvent_Enable) isClientEvent_Event() {}
+
 type Client_OAuth struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -724,11 +823,9 @@ type Client_OAuth struct {
 
 func (x *Client_OAuth) Reset() {
 	*x = Client_OAuth{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Client_OAuth) String() string {
@@ -738,8 +835,8 @@ func (x *Client_OAuth) String() string {
 func (*Client_OAuth) ProtoMessage() {}
 
 func (x *Client_OAuth) ProtoReflect() protoreflect.Message {
-	mi := &file_clients_clients_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_clients_clients_proto_msgTypes[13]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -793,11 +890,9 @@ type Client_APIKey struct {
 
 func (x *Client_APIKey) Reset() {
 	*x = Client_APIKey{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Client_APIKey) String() string {
@@ -807,8 +902,8 @@ func (x *Client_APIKey) String() string {
 func (*Client_APIKey) ProtoMessage() {}
 
 func (x *Client_APIKey) ProtoReflect() protoreflect.Message {
-	mi := &file_clients_clients_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_clients_clients_proto_msgTypes[14]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -847,11 +942,9 @@ type Client_TLS struct {
 
 func (x *Client_TLS) Reset() {
 	*x = Client_TLS{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_clients_clients_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_clients_clients_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Client_TLS) String() string {
@@ -861,8 +954,8 @@ func (x *Client_TLS) String() string {
 func (*Client_TLS) ProtoMessage() {}
 
 func (x *Client_TLS) ProtoReflect() protoreflect.Message {
-	mi := &file_clients_clients_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_clients_clients_proto_msgTypes[15]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -884,6 +977,159 @@ func (x *Client_TLS) GetSubject() string {
 	return ""
 }
 
+type ClientEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ClientEvent_CreateEvent) Reset() {
+	*x = ClientEvent_CreateEvent{}
+	mi := &file_clients_clients_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ClientEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientEvent_CreateEvent) ProtoMessage() {}
+
+func (x *ClientEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_clients_clients_proto_msgTypes[16]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClientEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*ClientEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_clients_clients_proto_rawDescGZIP(), []int{12, 0}
+}
+
+type ClientEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ClientEvent_UpdateEvent) Reset() {
+	*x = ClientEvent_UpdateEvent{}
+	mi := &file_clients_clients_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ClientEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *ClientEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_clients_clients_proto_msgTypes[17]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClientEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*ClientEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_clients_clients_proto_rawDescGZIP(), []int{12, 1}
+}
+
+type ClientEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ClientEvent_DeleteEvent) Reset() {
+	*x = ClientEvent_DeleteEvent{}
+	mi := &file_clients_clients_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ClientEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *ClientEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_clients_clients_proto_msgTypes[18]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClientEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*ClientEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_clients_clients_proto_rawDescGZIP(), []int{12, 2}
+}
+
+type ClientEvent_EnableEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Enable bool `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"`
+}
+
+func (x *ClientEvent_EnableEvent) Reset() {
+	*x = ClientEvent_EnableEvent{}
+	mi := &file_clients_clients_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ClientEvent_EnableEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientEvent_EnableEvent) ProtoMessage() {}
+
+func (x *ClientEvent_EnableEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_clients_clients_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 ClientEvent_EnableEvent.ProtoReflect.Descriptor instead.
+func (*ClientEvent_EnableEvent) Descriptor() ([]byte, []int) {
+	return file_clients_clients_proto_rawDescGZIP(), []int{12, 3}
+}
+
+func (x *ClientEvent_EnableEvent) GetEnable() bool {
+	if x != nil {
+		return x.Enable
+	}
+	return false
+}
+
 var File_clients_clients_proto protoreflect.FileDescriptor
 
 var file_clients_clients_proto_rawDesc = []byte{
@@ -974,43 +1220,70 @@ var file_clients_clients_proto_rawDesc = []byte{
 	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
 	0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
 	0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x32, 0xf7, 0x03, 0x0a, 0x07, 0x43,
-	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xb2, 0x03, 0x0a, 0x0b, 0x43,
+	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c,
+	0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
+	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x64, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69,
+	0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6c, 0x69,
+	0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x42,
+	0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73,
+	0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x61,
+	0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62,
+	0x6c, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a,
+	0x25, 0x0a, 0x0b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16,
+	0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06,
+	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32,
+	0xf7, 0x03, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x06, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,
+	0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47,
+	0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x05,
+	0x47, 0x65, 0x74, 0x42, 0x79, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
+	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
 	0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x05, 0x47, 0x65, 0x74, 0x42, 0x79,
-	0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
-	0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x42, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x74, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x04, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69,
+	0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
+	0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x42, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
-	0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x42, 0x0a, 0x06, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x61,
-	0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
-	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,
-	0x74, 0x73, 0x3b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
+	0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12,
+	0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x73, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74,
+	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
+	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1025,54 +1298,63 @@ func file_clients_clients_proto_rawDescGZIP() []byte {
 	return file_clients_clients_proto_rawDescData
 }
 
-var file_clients_clients_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_clients_clients_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_clients_clients_proto_goTypes = []any{
-	(*Client)(nil),         // 0: content.clients.Client
-	(*CreateRequest)(nil),  // 1: content.clients.CreateRequest
-	(*CreateResponse)(nil), // 2: content.clients.CreateResponse
-	(*GetRequest)(nil),     // 3: content.clients.GetRequest
-	(*GetResponse)(nil),    // 4: content.clients.GetResponse
-	(*GetByRequest)(nil),   // 5: content.clients.GetByRequest
-	(*GetByResponse)(nil),  // 6: content.clients.GetByResponse
-	(*UpdateRequest)(nil),  // 7: content.clients.UpdateRequest
-	(*ListRequest)(nil),    // 8: content.clients.ListRequest
-	(*ListResponse)(nil),   // 9: content.clients.ListResponse
-	(*DeleteRequest)(nil),  // 10: content.clients.DeleteRequest
-	(*EnableRequest)(nil),  // 11: content.clients.EnableRequest
-	(*Client_OAuth)(nil),   // 12: content.clients.Client.OAuth
-	(*Client_APIKey)(nil),  // 13: content.clients.Client.APIKey
-	(*Client_TLS)(nil),     // 14: content.clients.Client.TLS
-	(*emptypb.Empty)(nil),  // 15: google.protobuf.Empty
+	(*Client)(nil),                  // 0: content.clients.Client
+	(*CreateRequest)(nil),           // 1: content.clients.CreateRequest
+	(*CreateResponse)(nil),          // 2: content.clients.CreateResponse
+	(*GetRequest)(nil),              // 3: content.clients.GetRequest
+	(*GetResponse)(nil),             // 4: content.clients.GetResponse
+	(*GetByRequest)(nil),            // 5: content.clients.GetByRequest
+	(*GetByResponse)(nil),           // 6: content.clients.GetByResponse
+	(*UpdateRequest)(nil),           // 7: content.clients.UpdateRequest
+	(*ListRequest)(nil),             // 8: content.clients.ListRequest
+	(*ListResponse)(nil),            // 9: content.clients.ListResponse
+	(*DeleteRequest)(nil),           // 10: content.clients.DeleteRequest
+	(*EnableRequest)(nil),           // 11: content.clients.EnableRequest
+	(*ClientEvent)(nil),             // 12: content.clients.ClientEvent
+	(*Client_OAuth)(nil),            // 13: content.clients.Client.OAuth
+	(*Client_APIKey)(nil),           // 14: content.clients.Client.APIKey
+	(*Client_TLS)(nil),              // 15: content.clients.Client.TLS
+	(*ClientEvent_CreateEvent)(nil), // 16: content.clients.ClientEvent.CreateEvent
+	(*ClientEvent_UpdateEvent)(nil), // 17: content.clients.ClientEvent.UpdateEvent
+	(*ClientEvent_DeleteEvent)(nil), // 18: content.clients.ClientEvent.DeleteEvent
+	(*ClientEvent_EnableEvent)(nil), // 19: content.clients.ClientEvent.EnableEvent
+	(*emptypb.Empty)(nil),           // 20: google.protobuf.Empty
 }
 var file_clients_clients_proto_depIdxs = []int32{
-	12, // 0: content.clients.Client.oauth:type_name -> content.clients.Client.OAuth
-	14, // 1: content.clients.Client.tls:type_name -> content.clients.Client.TLS
-	13, // 2: content.clients.Client.api_key:type_name -> content.clients.Client.APIKey
+	13, // 0: content.clients.Client.oauth:type_name -> content.clients.Client.OAuth
+	15, // 1: content.clients.Client.tls:type_name -> content.clients.Client.TLS
+	14, // 2: content.clients.Client.api_key:type_name -> content.clients.Client.APIKey
 	0,  // 3: content.clients.CreateRequest.client:type_name -> content.clients.Client
 	0,  // 4: content.clients.CreateResponse.created:type_name -> content.clients.Client
 	0,  // 5: content.clients.GetResponse.client:type_name -> content.clients.Client
 	0,  // 6: content.clients.GetByResponse.client:type_name -> content.clients.Client
 	0,  // 7: content.clients.UpdateRequest.client:type_name -> content.clients.Client
 	0,  // 8: content.clients.ListResponse.clients:type_name -> content.clients.Client
-	1,  // 9: content.clients.Clients.Create:input_type -> content.clients.CreateRequest
-	3,  // 10: content.clients.Clients.Get:input_type -> content.clients.GetRequest
-	5,  // 11: content.clients.Clients.GetBy:input_type -> content.clients.GetByRequest
-	7,  // 12: content.clients.Clients.Update:input_type -> content.clients.UpdateRequest
-	8,  // 13: content.clients.Clients.List:input_type -> content.clients.ListRequest
-	10, // 14: content.clients.Clients.Delete:input_type -> content.clients.DeleteRequest
-	11, // 15: content.clients.Clients.Enable:input_type -> content.clients.EnableRequest
-	2,  // 16: content.clients.Clients.Create:output_type -> content.clients.CreateResponse
-	4,  // 17: content.clients.Clients.Get:output_type -> content.clients.GetResponse
-	6,  // 18: content.clients.Clients.GetBy:output_type -> content.clients.GetByResponse
-	15, // 19: content.clients.Clients.Update:output_type -> google.protobuf.Empty
-	9,  // 20: content.clients.Clients.List:output_type -> content.clients.ListResponse
-	15, // 21: content.clients.Clients.Delete:output_type -> google.protobuf.Empty
-	15, // 22: content.clients.Clients.Enable:output_type -> google.protobuf.Empty
-	16, // [16:23] is the sub-list for method output_type
-	9,  // [9:16] is the sub-list for method input_type
-	9,  // [9:9] is the sub-list for extension type_name
-	9,  // [9:9] is the sub-list for extension extendee
-	0,  // [0:9] is the sub-list for field type_name
+	16, // 9: content.clients.ClientEvent.create:type_name -> content.clients.ClientEvent.CreateEvent
+	17, // 10: content.clients.ClientEvent.update:type_name -> content.clients.ClientEvent.UpdateEvent
+	18, // 11: content.clients.ClientEvent.delete:type_name -> content.clients.ClientEvent.DeleteEvent
+	19, // 12: content.clients.ClientEvent.enable:type_name -> content.clients.ClientEvent.EnableEvent
+	1,  // 13: content.clients.Clients.Create:input_type -> content.clients.CreateRequest
+	3,  // 14: content.clients.Clients.Get:input_type -> content.clients.GetRequest
+	5,  // 15: content.clients.Clients.GetBy:input_type -> content.clients.GetByRequest
+	7,  // 16: content.clients.Clients.Update:input_type -> content.clients.UpdateRequest
+	8,  // 17: content.clients.Clients.List:input_type -> content.clients.ListRequest
+	10, // 18: content.clients.Clients.Delete:input_type -> content.clients.DeleteRequest
+	11, // 19: content.clients.Clients.Enable:input_type -> content.clients.EnableRequest
+	2,  // 20: content.clients.Clients.Create:output_type -> content.clients.CreateResponse
+	4,  // 21: content.clients.Clients.Get:output_type -> content.clients.GetResponse
+	6,  // 22: content.clients.Clients.GetBy:output_type -> content.clients.GetByResponse
+	20, // 23: content.clients.Clients.Update:output_type -> google.protobuf.Empty
+	9,  // 24: content.clients.Clients.List:output_type -> content.clients.ListResponse
+	20, // 25: content.clients.Clients.Delete:output_type -> google.protobuf.Empty
+	20, // 26: content.clients.Clients.Enable:output_type -> google.protobuf.Empty
+	20, // [20:27] is the sub-list for method output_type
+	13, // [13:20] is the sub-list for method input_type
+	13, // [13:13] is the sub-list for extension type_name
+	13, // [13:13] is the sub-list for extension extendee
+	0,  // [0:13] is the sub-list for field type_name
 }
 
 func init() { file_clients_clients_proto_init() }
@@ -1080,196 +1362,20 @@ func file_clients_clients_proto_init() {
 	if File_clients_clients_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_clients_clients_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Client); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*GetByRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*GetByResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*ListResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*EnableRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*Client_OAuth); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*Client_APIKey); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_clients_clients_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*Client_TLS); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	file_clients_clients_proto_msgTypes[0].OneofWrappers = []any{}
+	file_clients_clients_proto_msgTypes[12].OneofWrappers = []any{
+		(*ClientEvent_Create)(nil),
+		(*ClientEvent_Update)(nil),
+		(*ClientEvent_Delete)(nil),
+		(*ClientEvent_Enable)(nil),
+	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_clients_clients_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   15,
+			NumMessages:   20,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/clients/clients_grpc.pb.go b/proto/clients/clients_grpc.pb.go
index b2e006de..1da57867 100644
--- a/proto/clients/clients_grpc.pb.go
+++ b/proto/clients/clients_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: clients/clients.proto
 
 package clients
diff --git a/proto/collaborators/collaborators.pb.go b/proto/collaborators/collaborators.pb.go
index bb3aad63..eae0d6ed 100644
--- a/proto/collaborators/collaborators.pb.go
+++ b/proto/collaborators/collaborators.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: collaborators/collaborators.proto
 
 package collaborators
@@ -34,11 +34,9 @@ type SetRequest struct {
 
 func (x *SetRequest) Reset() {
 	*x = SetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *SetRequest) String() string {
@@ -49,7 +47,7 @@ func (*SetRequest) ProtoMessage() {}
 
 func (x *SetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -96,11 +94,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -111,7 +107,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -150,11 +146,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -165,7 +159,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -198,11 +192,9 @@ type RemoveRequest struct {
 
 func (x *RemoveRequest) Reset() {
 	*x = RemoveRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *RemoveRequest) String() string {
@@ -213,7 +205,7 @@ func (*RemoveRequest) ProtoMessage() {}
 
 func (x *RemoveRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -252,11 +244,9 @@ type ListCollaboratorsRequest struct {
 
 func (x *ListCollaboratorsRequest) Reset() {
 	*x = ListCollaboratorsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListCollaboratorsRequest) String() string {
@@ -267,7 +257,7 @@ func (*ListCollaboratorsRequest) ProtoMessage() {}
 
 func (x *ListCollaboratorsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -299,11 +289,9 @@ type ListCollaboratorsResponse struct {
 
 func (x *ListCollaboratorsResponse) Reset() {
 	*x = ListCollaboratorsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListCollaboratorsResponse) String() string {
@@ -314,7 +302,7 @@ func (*ListCollaboratorsResponse) ProtoMessage() {}
 
 func (x *ListCollaboratorsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -346,11 +334,9 @@ type ListSpacesRequest struct {
 
 func (x *ListSpacesRequest) Reset() {
 	*x = ListSpacesRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListSpacesRequest) String() string {
@@ -361,7 +347,7 @@ func (*ListSpacesRequest) ProtoMessage() {}
 
 func (x *ListSpacesRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -393,11 +379,9 @@ type ListSpacesResponse struct {
 
 func (x *ListSpacesResponse) Reset() {
 	*x = ListSpacesResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_collaborators_collaborators_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_collaborators_collaborators_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListSpacesResponse) String() string {
@@ -408,7 +392,7 @@ func (*ListSpacesResponse) ProtoMessage() {}
 
 func (x *ListSpacesResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_collaborators_collaborators_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -430,6 +414,181 @@ func (x *ListSpacesResponse) GetSpaces() []*common.Collaborator {
 	return nil
 }
 
+type CollaboratorEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	Subject string `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"`
+	Role    string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*CollaboratorEvent_Set
+	//	*CollaboratorEvent_Remove
+	Event isCollaboratorEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *CollaboratorEvent) Reset() {
+	*x = CollaboratorEvent{}
+	mi := &file_collaborators_collaborators_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollaboratorEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollaboratorEvent) ProtoMessage() {}
+
+func (x *CollaboratorEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collaborators_collaborators_proto_msgTypes[8]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollaboratorEvent.ProtoReflect.Descriptor instead.
+func (*CollaboratorEvent) Descriptor() ([]byte, []int) {
+	return file_collaborators_collaborators_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *CollaboratorEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *CollaboratorEvent) GetSubject() string {
+	if x != nil {
+		return x.Subject
+	}
+	return ""
+}
+
+func (x *CollaboratorEvent) GetRole() string {
+	if x != nil {
+		return x.Role
+	}
+	return ""
+}
+
+func (m *CollaboratorEvent) GetEvent() isCollaboratorEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *CollaboratorEvent) GetSet() *CollaboratorEvent_SetEvent {
+	if x, ok := x.GetEvent().(*CollaboratorEvent_Set); ok {
+		return x.Set
+	}
+	return nil
+}
+
+func (x *CollaboratorEvent) GetRemove() *CollaboratorEvent_RemoveEvent {
+	if x, ok := x.GetEvent().(*CollaboratorEvent_Remove); ok {
+		return x.Remove
+	}
+	return nil
+}
+
+type isCollaboratorEvent_Event interface {
+	isCollaboratorEvent_Event()
+}
+
+type CollaboratorEvent_Set struct {
+	Set *CollaboratorEvent_SetEvent `protobuf:"bytes,100,opt,name=set,proto3,oneof"`
+}
+
+type CollaboratorEvent_Remove struct {
+	Remove *CollaboratorEvent_RemoveEvent `protobuf:"bytes,101,opt,name=remove,proto3,oneof"`
+}
+
+func (*CollaboratorEvent_Set) isCollaboratorEvent_Event() {}
+
+func (*CollaboratorEvent_Remove) isCollaboratorEvent_Event() {}
+
+type CollaboratorEvent_SetEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollaboratorEvent_SetEvent) Reset() {
+	*x = CollaboratorEvent_SetEvent{}
+	mi := &file_collaborators_collaborators_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollaboratorEvent_SetEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollaboratorEvent_SetEvent) ProtoMessage() {}
+
+func (x *CollaboratorEvent_SetEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collaborators_collaborators_proto_msgTypes[9]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollaboratorEvent_SetEvent.ProtoReflect.Descriptor instead.
+func (*CollaboratorEvent_SetEvent) Descriptor() ([]byte, []int) {
+	return file_collaborators_collaborators_proto_rawDescGZIP(), []int{8, 0}
+}
+
+type CollaboratorEvent_RemoveEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollaboratorEvent_RemoveEvent) Reset() {
+	*x = CollaboratorEvent_RemoveEvent{}
+	mi := &file_collaborators_collaborators_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollaboratorEvent_RemoveEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollaboratorEvent_RemoveEvent) ProtoMessage() {}
+
+func (x *CollaboratorEvent_RemoveEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collaborators_collaborators_proto_msgTypes[10]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollaboratorEvent_RemoveEvent.ProtoReflect.Descriptor instead.
+func (*CollaboratorEvent_RemoveEvent) Descriptor() ([]byte, []int) {
+	return file_collaborators_collaborators_proto_rawDescGZIP(), []int{8, 1}
+}
+
 var File_collaborators_collaborators_proto protoreflect.FileDescriptor
 
 var file_collaborators_collaborators_proto_rawDesc = []byte{
@@ -472,40 +631,58 @@ var file_collaborators_collaborators_proto_rawDesc = []byte{
 	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01,
 	0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f,
 	0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x73, 0x32, 0xcc, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74,
-	0x6f, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,
-	0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62,
-	0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c,
-	0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f,
-	0x76, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c,
-	0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x73, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+	0x74, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c,
+	0x65, 0x12, 0x45, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f,
+	0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+	0x74, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x48, 0x00, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x4e, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73,
+	0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xcc, 0x03, 0x0a,
+	0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x42,
+	0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
 	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x22, 0x00, 0x12, 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62,
-	0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e,
+	0x22, 0x00, 0x12, 0x4e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72,
+	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+	0x74, 0x6f, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x48, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x24, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61,
+	0x74, 0x6f, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x11,
 	0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73,
-	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f,
-	0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a,
-	0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f,
-	0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
+	0x73, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c,
+	0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f,
+	0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c,
+	0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43,
+	0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
 	0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
-	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67,
-	0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72,
-	0x61, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74,
-	0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f,
+	0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67,
+	0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
+	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x3b,
+	0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -520,37 +697,42 @@ func file_collaborators_collaborators_proto_rawDescGZIP() []byte {
 	return file_collaborators_collaborators_proto_rawDescData
 }
 
-var file_collaborators_collaborators_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
+var file_collaborators_collaborators_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
 var file_collaborators_collaborators_proto_goTypes = []any{
-	(*SetRequest)(nil),                // 0: content.collaborators.SetRequest
-	(*GetRequest)(nil),                // 1: content.collaborators.GetRequest
-	(*GetResponse)(nil),               // 2: content.collaborators.GetResponse
-	(*RemoveRequest)(nil),             // 3: content.collaborators.RemoveRequest
-	(*ListCollaboratorsRequest)(nil),  // 4: content.collaborators.ListCollaboratorsRequest
-	(*ListCollaboratorsResponse)(nil), // 5: content.collaborators.ListCollaboratorsResponse
-	(*ListSpacesRequest)(nil),         // 6: content.collaborators.ListSpacesRequest
-	(*ListSpacesResponse)(nil),        // 7: content.collaborators.ListSpacesResponse
-	(*common.Collaborator)(nil),       // 8: common.Collaborator
-	(*emptypb.Empty)(nil),             // 9: google.protobuf.Empty
+	(*SetRequest)(nil),                    // 0: content.collaborators.SetRequest
+	(*GetRequest)(nil),                    // 1: content.collaborators.GetRequest
+	(*GetResponse)(nil),                   // 2: content.collaborators.GetResponse
+	(*RemoveRequest)(nil),                 // 3: content.collaborators.RemoveRequest
+	(*ListCollaboratorsRequest)(nil),      // 4: content.collaborators.ListCollaboratorsRequest
+	(*ListCollaboratorsResponse)(nil),     // 5: content.collaborators.ListCollaboratorsResponse
+	(*ListSpacesRequest)(nil),             // 6: content.collaborators.ListSpacesRequest
+	(*ListSpacesResponse)(nil),            // 7: content.collaborators.ListSpacesResponse
+	(*CollaboratorEvent)(nil),             // 8: content.collaborators.CollaboratorEvent
+	(*CollaboratorEvent_SetEvent)(nil),    // 9: content.collaborators.CollaboratorEvent.SetEvent
+	(*CollaboratorEvent_RemoveEvent)(nil), // 10: content.collaborators.CollaboratorEvent.RemoveEvent
+	(*common.Collaborator)(nil),           // 11: common.Collaborator
+	(*emptypb.Empty)(nil),                 // 12: google.protobuf.Empty
 }
 var file_collaborators_collaborators_proto_depIdxs = []int32{
-	8, // 0: content.collaborators.ListCollaboratorsResponse.collaborators:type_name -> common.Collaborator
-	8, // 1: content.collaborators.ListSpacesResponse.spaces:type_name -> common.Collaborator
-	0, // 2: content.collaborators.Collaborators.Set:input_type -> content.collaborators.SetRequest
-	1, // 3: content.collaborators.Collaborators.Get:input_type -> content.collaborators.GetRequest
-	3, // 4: content.collaborators.Collaborators.Remove:input_type -> content.collaborators.RemoveRequest
-	4, // 5: content.collaborators.Collaborators.ListCollaborators:input_type -> content.collaborators.ListCollaboratorsRequest
-	6, // 6: content.collaborators.Collaborators.ListSpaces:input_type -> content.collaborators.ListSpacesRequest
-	9, // 7: content.collaborators.Collaborators.Set:output_type -> google.protobuf.Empty
-	2, // 8: content.collaborators.Collaborators.Get:output_type -> content.collaborators.GetResponse
-	9, // 9: content.collaborators.Collaborators.Remove:output_type -> google.protobuf.Empty
-	5, // 10: content.collaborators.Collaborators.ListCollaborators:output_type -> content.collaborators.ListCollaboratorsResponse
-	7, // 11: content.collaborators.Collaborators.ListSpaces:output_type -> content.collaborators.ListSpacesResponse
-	7, // [7:12] is the sub-list for method output_type
-	2, // [2:7] is the sub-list for method input_type
-	2, // [2:2] is the sub-list for extension type_name
-	2, // [2:2] is the sub-list for extension extendee
-	0, // [0:2] is the sub-list for field type_name
+	11, // 0: content.collaborators.ListCollaboratorsResponse.collaborators:type_name -> common.Collaborator
+	11, // 1: content.collaborators.ListSpacesResponse.spaces:type_name -> common.Collaborator
+	9,  // 2: content.collaborators.CollaboratorEvent.set:type_name -> content.collaborators.CollaboratorEvent.SetEvent
+	10, // 3: content.collaborators.CollaboratorEvent.remove:type_name -> content.collaborators.CollaboratorEvent.RemoveEvent
+	0,  // 4: content.collaborators.Collaborators.Set:input_type -> content.collaborators.SetRequest
+	1,  // 5: content.collaborators.Collaborators.Get:input_type -> content.collaborators.GetRequest
+	3,  // 6: content.collaborators.Collaborators.Remove:input_type -> content.collaborators.RemoveRequest
+	4,  // 7: content.collaborators.Collaborators.ListCollaborators:input_type -> content.collaborators.ListCollaboratorsRequest
+	6,  // 8: content.collaborators.Collaborators.ListSpaces:input_type -> content.collaborators.ListSpacesRequest
+	12, // 9: content.collaborators.Collaborators.Set:output_type -> google.protobuf.Empty
+	2,  // 10: content.collaborators.Collaborators.Get:output_type -> content.collaborators.GetResponse
+	12, // 11: content.collaborators.Collaborators.Remove:output_type -> google.protobuf.Empty
+	5,  // 12: content.collaborators.Collaborators.ListCollaborators:output_type -> content.collaborators.ListCollaboratorsResponse
+	7,  // 13: content.collaborators.Collaborators.ListSpaces:output_type -> content.collaborators.ListSpacesResponse
+	9,  // [9:14] is the sub-list for method output_type
+	4,  // [4:9] is the sub-list for method input_type
+	4,  // [4:4] is the sub-list for extension type_name
+	4,  // [4:4] is the sub-list for extension extendee
+	0,  // [0:4] is the sub-list for field type_name
 }
 
 func init() { file_collaborators_collaborators_proto_init() }
@@ -558,103 +740,9 @@ func file_collaborators_collaborators_proto_init() {
 	if File_collaborators_collaborators_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_collaborators_collaborators_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*SetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*RemoveRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*ListCollaboratorsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*ListCollaboratorsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*ListSpacesRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_collaborators_collaborators_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*ListSpacesResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_collaborators_collaborators_proto_msgTypes[8].OneofWrappers = []any{
+		(*CollaboratorEvent_Set)(nil),
+		(*CollaboratorEvent_Remove)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -662,7 +750,7 @@ func file_collaborators_collaborators_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_collaborators_collaborators_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   8,
+			NumMessages:   11,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/collaborators/collaborators_grpc.pb.go b/proto/collaborators/collaborators_grpc.pb.go
index 85262442..5db1a9d9 100644
--- a/proto/collaborators/collaborators_grpc.pb.go
+++ b/proto/collaborators/collaborators_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: collaborators/collaborators.proto
 
 package collaborators
diff --git a/proto/collections/collections.pb.go b/proto/collections/collections.pb.go
index b4e4b659..ed77ad71 100644
--- a/proto/collections/collections.pb.go
+++ b/proto/collections/collections.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.35.1
-// 	protoc        v5.28.3
+// 	protoc        v5.28.2
 // source: collections/collections.proto
 
 package collections
@@ -372,7 +372,7 @@ type CreateRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"`
+	Coll *Collection `protobuf:"bytes,1,opt,name=coll,proto3" json:"coll,omitempty"`
 }
 
 func (x *CreateRequest) Reset() {
@@ -405,9 +405,9 @@ func (*CreateRequest) Descriptor() ([]byte, []int) {
 	return file_collections_collections_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *CreateRequest) GetCollection() *Collection {
+func (x *CreateRequest) GetColl() *Collection {
 	if x != nil {
-		return x.Collection
+		return x.Coll
 	}
 	return nil
 }
@@ -507,10 +507,10 @@ type GetRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId      string      `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string      `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string      `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	Options      *GetOptions `protobuf:"bytes,4,opt,name=options,proto3" json:"options,omitempty"`
+	SpaceId string      `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string      `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string      `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	Options *GetOptions `protobuf:"bytes,4,opt,name=options,proto3" json:"options,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
@@ -557,9 +557,9 @@ func (x *GetRequest) GetEnvId() string {
 	return ""
 }
 
-func (x *GetRequest) GetCollectionId() string {
+func (x *GetRequest) GetId() string {
 	if x != nil {
-		return x.CollectionId
+		return x.Id
 	}
 	return ""
 }
@@ -576,7 +576,7 @@ type GetResponse struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"`
+	Coll *Collection `protobuf:"bytes,1,opt,name=coll,proto3" json:"coll,omitempty"`
 }
 
 func (x *GetResponse) Reset() {
@@ -609,9 +609,9 @@ func (*GetResponse) Descriptor() ([]byte, []int) {
 	return file_collections_collections_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *GetResponse) GetCollection() *Collection {
+func (x *GetResponse) GetColl() *Collection {
 	if x != nil {
-		return x.Collection
+		return x.Coll
 	}
 	return nil
 }
@@ -682,7 +682,7 @@ type ListResponse struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Collections []*Collection `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"`
+	Colls []*Collection `protobuf:"bytes,1,rep,name=colls,proto3" json:"colls,omitempty"`
 }
 
 func (x *ListResponse) Reset() {
@@ -715,9 +715,9 @@ func (*ListResponse) Descriptor() ([]byte, []int) {
 	return file_collections_collections_proto_rawDescGZIP(), []int{8}
 }
 
-func (x *ListResponse) GetCollections() []*Collection {
+func (x *ListResponse) GetColls() []*Collection {
 	if x != nil {
-		return x.Collections
+		return x.Colls
 	}
 	return nil
 }
@@ -727,7 +727,7 @@ type UpdateRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"`
+	Coll *Collection `protobuf:"bytes,1,opt,name=coll,proto3" json:"coll,omitempty"`
 }
 
 func (x *UpdateRequest) Reset() {
@@ -760,9 +760,9 @@ func (*UpdateRequest) Descriptor() ([]byte, []int) {
 	return file_collections_collections_proto_rawDescGZIP(), []int{9}
 }
 
-func (x *UpdateRequest) GetCollection() *Collection {
+func (x *UpdateRequest) GetColl() *Collection {
 	if x != nil {
-		return x.Collection
+		return x.Coll
 	}
 	return nil
 }
@@ -772,10 +772,10 @@ type SetSchemaRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	Schema       string `protobuf:"bytes,4,opt,name=schema,proto3" json:"schema,omitempty"`
+	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	Schema  string `protobuf:"bytes,4,opt,name=schema,proto3" json:"schema,omitempty"`
 }
 
 func (x *SetSchemaRequest) Reset() {
@@ -822,9 +822,9 @@ func (x *SetSchemaRequest) GetEnvId() string {
 	return ""
 }
 
-func (x *SetSchemaRequest) GetCollectionId() string {
+func (x *SetSchemaRequest) GetId() string {
 	if x != nil {
-		return x.CollectionId
+		return x.Id
 	}
 	return ""
 }
@@ -841,9 +841,9 @@ type DeleteRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
@@ -890,13 +890,144 @@ func (x *DeleteRequest) GetEnvId() string {
 	return ""
 }
 
-func (x *DeleteRequest) GetCollectionId() string {
+func (x *DeleteRequest) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+type CollectionEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*CollectionEvent_Create
+	//	*CollectionEvent_Update
+	//	*CollectionEvent_Delete
+	//	*CollectionEvent_SetSchema
+	Event isCollectionEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *CollectionEvent) Reset() {
+	*x = CollectionEvent{}
+	mi := &file_collections_collections_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollectionEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollectionEvent) ProtoMessage() {}
+
+func (x *CollectionEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collections_collections_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 CollectionEvent.ProtoReflect.Descriptor instead.
+func (*CollectionEvent) Descriptor() ([]byte, []int) {
+	return file_collections_collections_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *CollectionEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *CollectionEvent) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+func (x *CollectionEvent) GetCollectionId() string {
 	if x != nil {
 		return x.CollectionId
 	}
 	return ""
 }
 
+func (m *CollectionEvent) GetEvent() isCollectionEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *CollectionEvent) GetCreate() *CollectionEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*CollectionEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *CollectionEvent) GetUpdate() *CollectionEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*CollectionEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *CollectionEvent) GetDelete() *CollectionEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*CollectionEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+func (x *CollectionEvent) GetSetSchema() *CollectionEvent_SetSchemaEvent {
+	if x, ok := x.GetEvent().(*CollectionEvent_SetSchema); ok {
+		return x.SetSchema
+	}
+	return nil
+}
+
+type isCollectionEvent_Event interface {
+	isCollectionEvent_Event()
+}
+
+type CollectionEvent_Create struct {
+	Create *CollectionEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type CollectionEvent_Update struct {
+	Update *CollectionEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type CollectionEvent_Delete struct {
+	Delete *CollectionEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+type CollectionEvent_SetSchema struct {
+	SetSchema *CollectionEvent_SetSchemaEvent `protobuf:"bytes,103,opt,name=set_schema,json=setSchema,proto3,oneof"`
+}
+
+func (*CollectionEvent_Create) isCollectionEvent_Event() {}
+
+func (*CollectionEvent_Update) isCollectionEvent_Event() {}
+
+func (*CollectionEvent_Delete) isCollectionEvent_Event() {}
+
+func (*CollectionEvent_SetSchema) isCollectionEvent_Event() {}
+
 type Collection_View struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -910,7 +1041,7 @@ type Collection_View struct {
 
 func (x *Collection_View) Reset() {
 	*x = Collection_View{}
-	mi := &file_collections_collections_proto_msgTypes[12]
+	mi := &file_collections_collections_proto_msgTypes[13]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -922,7 +1053,7 @@ func (x *Collection_View) String() string {
 func (*Collection_View) ProtoMessage() {}
 
 func (x *Collection_View) ProtoReflect() protoreflect.Message {
-	mi := &file_collections_collections_proto_msgTypes[12]
+	mi := &file_collections_collections_proto_msgTypes[13]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -978,7 +1109,7 @@ type Collection_StateInfo struct {
 
 func (x *Collection_StateInfo) Reset() {
 	*x = Collection_StateInfo{}
-	mi := &file_collections_collections_proto_msgTypes[13]
+	mi := &file_collections_collections_proto_msgTypes[14]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -990,7 +1121,7 @@ func (x *Collection_StateInfo) String() string {
 func (*Collection_StateInfo) ProtoMessage() {}
 
 func (x *Collection_StateInfo) ProtoReflect() protoreflect.Message {
-	mi := &file_collections_collections_proto_msgTypes[13]
+	mi := &file_collections_collections_proto_msgTypes[14]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1043,7 +1174,7 @@ type ListRequest_Filter struct {
 
 func (x *ListRequest_Filter) Reset() {
 	*x = ListRequest_Filter{}
-	mi := &file_collections_collections_proto_msgTypes[14]
+	mi := &file_collections_collections_proto_msgTypes[15]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -1055,7 +1186,7 @@ func (x *ListRequest_Filter) String() string {
 func (*ListRequest_Filter) ProtoMessage() {}
 
 func (x *ListRequest_Filter) ProtoReflect() protoreflect.Message {
-	mi := &file_collections_collections_proto_msgTypes[14]
+	mi := &file_collections_collections_proto_msgTypes[15]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1113,6 +1244,150 @@ func (x *ListRequest_Filter) GetTag() []string {
 	return nil
 }
 
+type CollectionEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollectionEvent_CreateEvent) Reset() {
+	*x = CollectionEvent_CreateEvent{}
+	mi := &file_collections_collections_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollectionEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollectionEvent_CreateEvent) ProtoMessage() {}
+
+func (x *CollectionEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collections_collections_proto_msgTypes[16]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollectionEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*CollectionEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_collections_collections_proto_rawDescGZIP(), []int{12, 0}
+}
+
+type CollectionEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollectionEvent_UpdateEvent) Reset() {
+	*x = CollectionEvent_UpdateEvent{}
+	mi := &file_collections_collections_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollectionEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollectionEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *CollectionEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collections_collections_proto_msgTypes[17]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollectionEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*CollectionEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_collections_collections_proto_rawDescGZIP(), []int{12, 1}
+}
+
+type CollectionEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollectionEvent_DeleteEvent) Reset() {
+	*x = CollectionEvent_DeleteEvent{}
+	mi := &file_collections_collections_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollectionEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollectionEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *CollectionEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collections_collections_proto_msgTypes[18]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CollectionEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*CollectionEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_collections_collections_proto_rawDescGZIP(), []int{12, 2}
+}
+
+type CollectionEvent_SetSchemaEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CollectionEvent_SetSchemaEvent) Reset() {
+	*x = CollectionEvent_SetSchemaEvent{}
+	mi := &file_collections_collections_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *CollectionEvent_SetSchemaEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CollectionEvent_SetSchemaEvent) ProtoMessage() {}
+
+func (x *CollectionEvent_SetSchemaEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_collections_collections_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 CollectionEvent_SetSchemaEvent.ProtoReflect.Descriptor instead.
+func (*CollectionEvent_SetSchemaEvent) Descriptor() ([]byte, []int) {
+	return file_collections_collections_proto_rawDescGZIP(), []int{12, 3}
+}
+
 var File_collections_collections_proto protoreflect.FileDescriptor
 
 var file_collections_collections_proto_rawDesc = []byte{
@@ -1207,115 +1482,139 @@ var file_collections_collections_proto_rawDesc = []byte{
 	0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x48, 0x41,
 	0x4e, 0x47, 0x45, 0x44, 0x10, 0x04, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c,
 	0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, 0x0a, 0x0a, 0x08,
-	0x5f, 0x6e, 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, 0x50, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x63, 0x6f, 0x6c,
-	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4b, 0x0a, 0x0e, 0x43, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x44, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
-	0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53,
-	0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x22, 0x9e, 0x01,
-	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69,
-	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23,
-	0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4e,
-	0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a,
-	0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x5f, 0x6e, 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x04, 0x63, 0x6f, 0x6c,
+	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x6c, 0x6c, 0x22, 0x4b,
+	0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x39, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c,
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x44, 0x0a, 0x0a, 0x47,
+	0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73,
+	0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x69, 0x6e, 0x63, 0x6c,
+	0x75, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61,
+	0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+	0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65,
+	0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76,
+	0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x42, 0x0a,
+	0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04,
+	0x63, 0x6f, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x6c,
+	0x6c, 0x22, 0xb7, 0x02, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06,
+	0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e,
+	0x76, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x1a, 0xb4, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
+	0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,
+	0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65,
+	0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+	0x65, 0x5f, 0x6e, 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x12, 0x25,
+	0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x48,
+	0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67,
+	0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x45, 0x0a, 0x0c, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x63,
+	0x6f, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x63, 0x6f, 0x6c,
+	0x6c, 0x73, 0x22, 0x44, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x04, 0x63, 0x6f, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
 	0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c,
 	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7,
-	0x02, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
-	0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76,
-	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64,
-	0x12, 0x3f, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,
-	0x72, 0x1a, 0xb4, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e,
-	0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x79, 0x73,
-	0x74, 0x65, 0x6d, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e,
-	0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e,
-	0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x69,
-	0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x06, 0x20,
-	0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x48, 0x69, 0x64, 0x64,
-	0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03,
-	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x07, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x51, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c,
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x50, 0x0a, 0x0d, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0a,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+	0x6f, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x6c, 0x6c, 0x22, 0x6c, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53,
+	0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69,
+	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x0e,
+	0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16,
+	0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x51, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xea, 0x03, 0x0a, 0x0f, 0x43, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f,
+	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12,
+	0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x64,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
+	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x4a, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
 	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01,
-	0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a,
-	0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
-	0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c,
-	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68,
-	0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,
-	0x61, 0x22, 0x66, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a,
-	0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
-	0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c,
-	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xdb, 0x03, 0x0a, 0x0b, 0x43, 0x6f,
-	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f,
-	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a,
-	0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x04, 0x4c, 0x69,
-	0x73, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c,
-	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x06, 0x55, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f,
-	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x00, 0x12, 0x4c, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
-	0x46, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x2e, 0x70,
-	0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f,
-	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x06,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x5f,
+	0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x48, 0x00, 0x52, 0x09, 0x73, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x0d,
+	0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a,
+	0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x10, 0x0a, 0x0e, 0x53,
+	0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a,
+	0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xdb, 0x03, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
+	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x03, 0x47,
+	0x65, 0x74, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c,
+	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c,
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c,
+	0x0a, 0x09, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x06,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
+	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
+	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1331,61 +1630,70 @@ func file_collections_collections_proto_rawDescGZIP() []byte {
 }
 
 var file_collections_collections_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_collections_collections_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_collections_collections_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_collections_collections_proto_goTypes = []any{
-	(Collection_State)(0),         // 0: content.collections.Collection.State
-	(*Access)(nil),                // 1: content.collections.Access
-	(*Collection)(nil),            // 2: content.collections.Collection
-	(*CreateRequest)(nil),         // 3: content.collections.CreateRequest
-	(*CreateResponse)(nil),        // 4: content.collections.CreateResponse
-	(*GetOptions)(nil),            // 5: content.collections.GetOptions
-	(*GetRequest)(nil),            // 6: content.collections.GetRequest
-	(*GetResponse)(nil),           // 7: content.collections.GetResponse
-	(*ListRequest)(nil),           // 8: content.collections.ListRequest
-	(*ListResponse)(nil),          // 9: content.collections.ListResponse
-	(*UpdateRequest)(nil),         // 10: content.collections.UpdateRequest
-	(*SetSchemaRequest)(nil),      // 11: content.collections.SetSchemaRequest
-	(*DeleteRequest)(nil),         // 12: content.collections.DeleteRequest
-	(*Collection_View)(nil),       // 13: content.collections.Collection.View
-	(*Collection_StateInfo)(nil),  // 14: content.collections.Collection.StateInfo
-	(*ListRequest_Filter)(nil),    // 15: content.collections.ListRequest.Filter
-	(common.Action)(0),            // 16: common.Action
-	(*durationpb.Duration)(nil),   // 17: google.protobuf.Duration
-	(*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp
-	(*emptypb.Empty)(nil),         // 19: google.protobuf.Empty
+	(Collection_State)(0),                  // 0: content.collections.Collection.State
+	(*Access)(nil),                         // 1: content.collections.Access
+	(*Collection)(nil),                     // 2: content.collections.Collection
+	(*CreateRequest)(nil),                  // 3: content.collections.CreateRequest
+	(*CreateResponse)(nil),                 // 4: content.collections.CreateResponse
+	(*GetOptions)(nil),                     // 5: content.collections.GetOptions
+	(*GetRequest)(nil),                     // 6: content.collections.GetRequest
+	(*GetResponse)(nil),                    // 7: content.collections.GetResponse
+	(*ListRequest)(nil),                    // 8: content.collections.ListRequest
+	(*ListResponse)(nil),                   // 9: content.collections.ListResponse
+	(*UpdateRequest)(nil),                  // 10: content.collections.UpdateRequest
+	(*SetSchemaRequest)(nil),               // 11: content.collections.SetSchemaRequest
+	(*DeleteRequest)(nil),                  // 12: content.collections.DeleteRequest
+	(*CollectionEvent)(nil),                // 13: content.collections.CollectionEvent
+	(*Collection_View)(nil),                // 14: content.collections.Collection.View
+	(*Collection_StateInfo)(nil),           // 15: content.collections.Collection.StateInfo
+	(*ListRequest_Filter)(nil),             // 16: content.collections.ListRequest.Filter
+	(*CollectionEvent_CreateEvent)(nil),    // 17: content.collections.CollectionEvent.CreateEvent
+	(*CollectionEvent_UpdateEvent)(nil),    // 18: content.collections.CollectionEvent.UpdateEvent
+	(*CollectionEvent_DeleteEvent)(nil),    // 19: content.collections.CollectionEvent.DeleteEvent
+	(*CollectionEvent_SetSchemaEvent)(nil), // 20: content.collections.CollectionEvent.SetSchemaEvent
+	(common.Action)(0),                     // 21: common.Action
+	(*durationpb.Duration)(nil),            // 22: google.protobuf.Duration
+	(*timestamppb.Timestamp)(nil),          // 23: google.protobuf.Timestamp
+	(*emptypb.Empty)(nil),                  // 24: google.protobuf.Empty
 }
 var file_collections_collections_proto_depIdxs = []int32{
-	16, // 0: content.collections.Access.actions:type_name -> common.Action
-	13, // 1: content.collections.Collection.view:type_name -> content.collections.Collection.View
-	14, // 2: content.collections.Collection.state_info:type_name -> content.collections.Collection.StateInfo
+	21, // 0: content.collections.Access.actions:type_name -> common.Action
+	14, // 1: content.collections.Collection.view:type_name -> content.collections.Collection.View
+	15, // 2: content.collections.Collection.state_info:type_name -> content.collections.Collection.StateInfo
 	1,  // 3: content.collections.Collection.access:type_name -> content.collections.Access
-	17, // 4: content.collections.Collection.revision_ttl:type_name -> google.protobuf.Duration
-	2,  // 5: content.collections.CreateRequest.collection:type_name -> content.collections.Collection
+	22, // 4: content.collections.Collection.revision_ttl:type_name -> google.protobuf.Duration
+	2,  // 5: content.collections.CreateRequest.coll:type_name -> content.collections.Collection
 	2,  // 6: content.collections.CreateResponse.created:type_name -> content.collections.Collection
 	5,  // 7: content.collections.GetRequest.options:type_name -> content.collections.GetOptions
-	2,  // 8: content.collections.GetResponse.collection:type_name -> content.collections.Collection
-	15, // 9: content.collections.ListRequest.filter:type_name -> content.collections.ListRequest.Filter
-	2,  // 10: content.collections.ListResponse.collections:type_name -> content.collections.Collection
-	2,  // 11: content.collections.UpdateRequest.collection:type_name -> content.collections.Collection
-	0,  // 12: content.collections.Collection.StateInfo.state:type_name -> content.collections.Collection.State
-	18, // 13: content.collections.Collection.StateInfo.started_at:type_name -> google.protobuf.Timestamp
-	3,  // 14: content.collections.Collections.Create:input_type -> content.collections.CreateRequest
-	6,  // 15: content.collections.Collections.Get:input_type -> content.collections.GetRequest
-	8,  // 16: content.collections.Collections.List:input_type -> content.collections.ListRequest
-	10, // 17: content.collections.Collections.Update:input_type -> content.collections.UpdateRequest
-	11, // 18: content.collections.Collections.SetSchema:input_type -> content.collections.SetSchemaRequest
-	12, // 19: content.collections.Collections.Delete:input_type -> content.collections.DeleteRequest
-	4,  // 20: content.collections.Collections.Create:output_type -> content.collections.CreateResponse
-	7,  // 21: content.collections.Collections.Get:output_type -> content.collections.GetResponse
-	9,  // 22: content.collections.Collections.List:output_type -> content.collections.ListResponse
-	19, // 23: content.collections.Collections.Update:output_type -> google.protobuf.Empty
-	19, // 24: content.collections.Collections.SetSchema:output_type -> google.protobuf.Empty
-	19, // 25: content.collections.Collections.Delete:output_type -> google.protobuf.Empty
-	20, // [20:26] is the sub-list for method output_type
-	14, // [14:20] 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
+	2,  // 8: content.collections.GetResponse.coll:type_name -> content.collections.Collection
+	16, // 9: content.collections.ListRequest.filter:type_name -> content.collections.ListRequest.Filter
+	2,  // 10: content.collections.ListResponse.colls:type_name -> content.collections.Collection
+	2,  // 11: content.collections.UpdateRequest.coll:type_name -> content.collections.Collection
+	17, // 12: content.collections.CollectionEvent.create:type_name -> content.collections.CollectionEvent.CreateEvent
+	18, // 13: content.collections.CollectionEvent.update:type_name -> content.collections.CollectionEvent.UpdateEvent
+	19, // 14: content.collections.CollectionEvent.delete:type_name -> content.collections.CollectionEvent.DeleteEvent
+	20, // 15: content.collections.CollectionEvent.set_schema:type_name -> content.collections.CollectionEvent.SetSchemaEvent
+	0,  // 16: content.collections.Collection.StateInfo.state:type_name -> content.collections.Collection.State
+	23, // 17: content.collections.Collection.StateInfo.started_at:type_name -> google.protobuf.Timestamp
+	3,  // 18: content.collections.Collections.Create:input_type -> content.collections.CreateRequest
+	6,  // 19: content.collections.Collections.Get:input_type -> content.collections.GetRequest
+	8,  // 20: content.collections.Collections.List:input_type -> content.collections.ListRequest
+	10, // 21: content.collections.Collections.Update:input_type -> content.collections.UpdateRequest
+	11, // 22: content.collections.Collections.SetSchema:input_type -> content.collections.SetSchemaRequest
+	12, // 23: content.collections.Collections.Delete:input_type -> content.collections.DeleteRequest
+	4,  // 24: content.collections.Collections.Create:output_type -> content.collections.CreateResponse
+	7,  // 25: content.collections.Collections.Get:output_type -> content.collections.GetResponse
+	9,  // 26: content.collections.Collections.List:output_type -> content.collections.ListResponse
+	24, // 27: content.collections.Collections.Update:output_type -> google.protobuf.Empty
+	24, // 28: content.collections.Collections.SetSchema:output_type -> google.protobuf.Empty
+	24, // 29: content.collections.Collections.Delete:output_type -> google.protobuf.Empty
+	24, // [24:30] is the sub-list for method output_type
+	18, // [18:24] is the sub-list for method input_type
+	18, // [18:18] is the sub-list for extension type_name
+	18, // [18:18] is the sub-list for extension extendee
+	0,  // [0:18] is the sub-list for field type_name
 }
 
 func init() { file_collections_collections_proto_init() }
@@ -1394,13 +1702,19 @@ func file_collections_collections_proto_init() {
 		return
 	}
 	file_collections_collections_proto_msgTypes[1].OneofWrappers = []any{}
+	file_collections_collections_proto_msgTypes[12].OneofWrappers = []any{
+		(*CollectionEvent_Create)(nil),
+		(*CollectionEvent_Update)(nil),
+		(*CollectionEvent_Delete)(nil),
+		(*CollectionEvent_SetSchema)(nil),
+	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_collections_collections_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   15,
+			NumMessages:   20,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/collections/collections_grpc.pb.go b/proto/collections/collections_grpc.pb.go
index 7f5ebd62..82ee135f 100644
--- a/proto/collections/collections_grpc.pb.go
+++ b/proto/collections/collections_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.28.3
+// - protoc             v5.28.2
 // source: collections/collections.proto
 
 package collections
diff --git a/proto/common/common.pb.go b/proto/common/common.pb.go
index 81aaac09..741d8fc0 100644
--- a/proto/common/common.pb.go
+++ b/proto/common/common.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.31.0
-// 	protoc        v5.28.1
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: common/common.proto
 
 package common
@@ -10,6 +10,7 @@ import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	structpb "google.golang.org/protobuf/types/known/structpb"
+	_ "google.golang.org/protobuf/types/known/timestamppb"
 	reflect "reflect"
 	sync "sync"
 )
@@ -140,11 +141,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_common_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_common_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -155,7 +154,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_common_common_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -207,11 +206,9 @@ type FindOptions struct {
 
 func (x *FindOptions) Reset() {
 	*x = FindOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_common_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_common_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindOptions) String() string {
@@ -222,7 +219,7 @@ func (*FindOptions) ProtoMessage() {}
 
 func (x *FindOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_common_common_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -291,28 +288,23 @@ type Rule struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	CollectionId string   `protobuf:"bytes,1,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	Actions      []Action `protobuf:"varint,2,rep,packed,name=actions,proto3,enum=common.Action" json:"actions,omitempty"`
-	Access       Access   `protobuf:"varint,3,opt,name=access,proto3,enum=common.Access" json:"access,omitempty"`
-	HiddenFields []string `protobuf:"bytes,5,rep,name=hidden_fields,json=hiddenFields,proto3" json:"hidden_fields,omitempty"`
-	// Deprecated
-	ReadonlyFields  []string `protobuf:"bytes,6,rep,name=readonly_fields,json=readonlyFields,proto3" json:"readonly_fields,omitempty"`
-	WriteonlyFields []string `protobuf:"bytes,7,rep,name=writeonly_fields,json=writeonlyFields,proto3" json:"writeonly_fields,omitempty"`
+	CollectionId    string   `protobuf:"bytes,1,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	Actions         []Action `protobuf:"varint,2,rep,packed,name=actions,proto3,enum=common.Action" json:"actions,omitempty"`
+	Access          Access   `protobuf:"varint,3,opt,name=access,proto3,enum=common.Access" json:"access,omitempty"`
+	HiddenFields    []string `protobuf:"bytes,5,rep,name=hidden_fields,json=hiddenFields,proto3" json:"hidden_fields,omitempty"`
 	ReadFilter      string   `protobuf:"bytes,8,opt,name=read_filter,json=readFilter,proto3" json:"read_filter,omitempty"`
 	WriteFilter     string   `protobuf:"bytes,9,opt,name=write_filter,json=writeFilter,proto3" json:"write_filter,omitempty"`
 	DenyReadFields  []string `protobuf:"bytes,10,rep,name=deny_read_fields,json=denyReadFields,proto3" json:"deny_read_fields,omitempty"`
 	DenyWriteFields []string `protobuf:"bytes,11,rep,name=deny_write_fields,json=denyWriteFields,proto3" json:"deny_write_fields,omitempty"`
-	// признак надо ли скрывать поле в UI
+	// скрыть коллекцию в интерфейсе от пользователя
 	Hidden bool `protobuf:"varint,12,opt,name=hidden,proto3" json:"hidden,omitempty"`
 }
 
 func (x *Rule) Reset() {
 	*x = Rule{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_common_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_common_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Rule) String() string {
@@ -323,7 +315,7 @@ func (*Rule) ProtoMessage() {}
 
 func (x *Rule) ProtoReflect() protoreflect.Message {
 	mi := &file_common_common_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -366,20 +358,6 @@ func (x *Rule) GetHiddenFields() []string {
 	return nil
 }
 
-func (x *Rule) GetReadonlyFields() []string {
-	if x != nil {
-		return x.ReadonlyFields
-	}
-	return nil
-}
-
-func (x *Rule) GetWriteonlyFields() []string {
-	if x != nil {
-		return x.WriteonlyFields
-	}
-	return nil
-}
-
 func (x *Rule) GetReadFilter() string {
 	if x != nil {
 		return x.ReadFilter
@@ -427,11 +405,9 @@ type Collaborator struct {
 
 func (x *Collaborator) Reset() {
 	*x = Collaborator{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_common_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_common_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Collaborator) String() string {
@@ -442,7 +418,7 @@ func (*Collaborator) ProtoMessage() {}
 
 func (x *Collaborator) ProtoReflect() protoreflect.Message {
 	mi := &file_common_common_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -492,11 +468,9 @@ type Version struct {
 
 func (x *Version) Reset() {
 	*x = Version{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_common_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_common_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Version) String() string {
@@ -507,7 +481,7 @@ func (*Version) ProtoMessage() {}
 
 func (x *Version) ProtoReflect() protoreflect.Message {
 	mi := &file_common_common_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -563,79 +537,76 @@ var file_common_common_proto_rawDesc = []byte{
 	0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x1c, 0x67,
 	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73,
-	0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x06, 0x46,
-	0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0b, 0x46, 0x69,
-	0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72,
-	0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a,
-	0x08, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
-	0x07, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65,
-	0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67,
-	0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
-	0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x25, 0x0a,
-	0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, 0x69,
-	0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05,
-	0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d,
-	0x69, 0x74, 0x22, 0xa8, 0x03, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
-	0x12, 0x28, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0e, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x61, 0x63,
-	0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d,
-	0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65,
-	0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x5f, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x68, 0x69, 0x64, 0x64, 0x65,
-	0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x6f,
-	0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
-	0x12, 0x29, 0x0a, 0x10, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x69,
-	0x65, 0x6c, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74,
-	0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72,
-	0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c,
-	0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
-	0x28, 0x0a, 0x10, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6e, 0x79, 0x52,
-	0x65, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6e,
-	0x79, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0b,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x6e, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46,
-	0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18,
-	0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x57, 0x0a,
-	0x0c, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a,
-	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a,
-	0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,
-	0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72,
-	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69,
-	0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
-	0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75,
-	0x69, 0x6c, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
-	0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d,
-	0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69,
-	0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,
-	0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4e, 0x75,
-	0x6d, 0x62, 0x65, 0x72, 0x2a, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x07,
-	0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x49, 0x4e, 0x45, 0x10,
-	0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x43, 0x0a, 0x06, 0x41,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,
-	0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x08,
-	0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41,
-	0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04,
-	0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
-	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b, 0x63, 0x6f,
-	0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x06,
+	0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0b, 0x46,
+	0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f,
+	0x72, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x19,
+	0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x07, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67,
+	0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61,
+	0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x25,
+	0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a,
+	0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69,
+	0x6d, 0x69, 0x74, 0x22, 0xd4, 0x02, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d,
+	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x28, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x61,
+	0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x61, 0x63, 0x63,
+	0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x5f, 0x66, 0x69,
+	0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x68, 0x69, 0x64, 0x64,
+	0x65, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64,
+	0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72,
+	0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x72, 0x69,
+	0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10,
+	0x64, 0x65, 0x6e, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6e, 0x79, 0x52, 0x65, 0x61, 0x64,
+	0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x77,
+	0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x0f, 0x64, 0x65, 0x6e, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c,
+	0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x57, 0x0a, 0x0c, 0x43, 0x6f,
+	0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12,
+	0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72,
+	0x6f, 0x6c, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x21,
+	0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65,
+	0x72, 0x2a, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x07, 0x0a, 0x03, 0x41,
+	0x4e, 0x59, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x08,
+	0x0a, 0x04, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x43, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
+	0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52,
+	0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10,
+	0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x42, 0x32, 0x5a,
+	0x30, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72,
+	0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -652,7 +623,7 @@ func file_common_common_proto_rawDescGZIP() []byte {
 
 var file_common_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
 var file_common_common_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
-var file_common_common_proto_goTypes = []interface{}{
+var file_common_common_proto_goTypes = []any{
 	(Access)(0),            // 0: common.Access
 	(Action)(0),            // 1: common.Action
 	(*Filter)(nil),         // 2: common.Filter
@@ -678,68 +649,6 @@ func file_common_common_proto_init() {
 	if File_common_common_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_common_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FindOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Rule); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Collaborator); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Version); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/common/error.pb.go b/proto/common/error.pb.go
index 6eeb8c55..27b2f6dd 100644
--- a/proto/common/error.pb.go
+++ b/proto/common/error.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: common/error.proto
 
 package common
@@ -42,11 +42,9 @@ type Error struct {
 
 func (x *Error) Reset() {
 	*x = Error{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error) String() string {
@@ -57,7 +55,7 @@ func (*Error) ProtoMessage() {}
 
 func (x *Error) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -166,11 +164,9 @@ type Error_BadRequest struct {
 
 func (x *Error_BadRequest) Reset() {
 	*x = Error_BadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_BadRequest) String() string {
@@ -181,7 +177,7 @@ func (*Error_BadRequest) ProtoMessage() {}
 
 func (x *Error_BadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -213,11 +209,9 @@ type Error_Help struct {
 
 func (x *Error_Help) Reset() {
 	*x = Error_Help{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_Help) String() string {
@@ -228,7 +222,7 @@ func (*Error_Help) ProtoMessage() {}
 
 func (x *Error_Help) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -261,11 +255,9 @@ type Error_DebugInfo struct {
 
 func (x *Error_DebugInfo) Reset() {
 	*x = Error_DebugInfo{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_DebugInfo) String() string {
@@ -276,7 +268,7 @@ func (*Error_DebugInfo) ProtoMessage() {}
 
 func (x *Error_DebugInfo) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -316,11 +308,9 @@ type Error_LocalizedMessage struct {
 
 func (x *Error_LocalizedMessage) Reset() {
 	*x = Error_LocalizedMessage{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_LocalizedMessage) String() string {
@@ -331,7 +321,7 @@ func (*Error_LocalizedMessage) ProtoMessage() {}
 
 func (x *Error_LocalizedMessage) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -371,11 +361,9 @@ type Error_BadRequest_FieldViolation struct {
 
 func (x *Error_BadRequest_FieldViolation) Reset() {
 	*x = Error_BadRequest_FieldViolation{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_BadRequest_FieldViolation) String() string {
@@ -386,7 +374,7 @@ func (*Error_BadRequest_FieldViolation) ProtoMessage() {}
 
 func (x *Error_BadRequest_FieldViolation) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -426,11 +414,9 @@ type Error_Help_Link struct {
 
 func (x *Error_Help_Link) Reset() {
 	*x = Error_Help_Link{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_error_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_error_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error_Help_Link) String() string {
@@ -441,7 +427,7 @@ func (*Error_Help_Link) ProtoMessage() {}
 
 func (x *Error_Help_Link) ProtoReflect() protoreflect.Message {
 	mi := &file_common_error_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -587,92 +573,6 @@ func file_common_error_proto_init() {
 	if File_common_error_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_common_error_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Error); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_BadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_Help); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_DebugInfo); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_LocalizedMessage); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_BadRequest_FieldViolation); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_error_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*Error_Help_Link); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/common/operation.pb.go b/proto/common/operation.pb.go
index 3f72af24..b7218c91 100644
--- a/proto/common/operation.pb.go
+++ b/proto/common/operation.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: common/operation.proto
 
 package common
@@ -53,11 +53,9 @@ type Operation struct {
 
 func (x *Operation) Reset() {
 	*x = Operation{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_operation_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_operation_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Operation) String() string {
@@ -68,7 +66,7 @@ func (*Operation) ProtoMessage() {}
 
 func (x *Operation) ProtoReflect() protoreflect.Message {
 	mi := &file_common_operation_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -249,20 +247,6 @@ func file_common_operation_proto_init() {
 		return
 	}
 	file_common_error_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_common_operation_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Operation); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	file_common_operation_proto_msgTypes[0].OneofWrappers = []any{
 		(*Operation_Response)(nil),
 		(*Operation_Error)(nil),
diff --git a/proto/common/operation_service.pb.go b/proto/common/operation_service.pb.go
index d0bd8e57..6ce9c39f 100644
--- a/proto/common/operation_service.pb.go
+++ b/proto/common/operation_service.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: common/operation_service.proto
 
 package common
@@ -30,11 +30,9 @@ type GetOperationRequest struct {
 
 func (x *GetOperationRequest) Reset() {
 	*x = GetOperationRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_operation_service_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_operation_service_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetOperationRequest) String() string {
@@ -45,7 +43,7 @@ func (*GetOperationRequest) ProtoMessage() {}
 
 func (x *GetOperationRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_common_operation_service_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -77,11 +75,9 @@ type CancelOperationRequest struct {
 
 func (x *CancelOperationRequest) Reset() {
 	*x = CancelOperationRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_operation_service_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_operation_service_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CancelOperationRequest) String() string {
@@ -92,7 +88,7 @@ func (*CancelOperationRequest) ProtoMessage() {}
 
 func (x *CancelOperationRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_common_operation_service_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -183,32 +179,6 @@ func file_common_operation_service_proto_init() {
 	}
 	file_common_operation_proto_init()
 	file_common_validation_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_common_operation_service_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*GetOperationRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_common_operation_service_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*CancelOperationRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/common/operation_service_grpc.pb.go b/proto/common/operation_service_grpc.pb.go
index ff590c80..920d34a2 100644
--- a/proto/common/operation_service_grpc.pb.go
+++ b/proto/common/operation_service_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: common/operation_service.proto
 
 package common
diff --git a/proto/common/validation.pb.go b/proto/common/validation.pb.go
index 8fe6a0c0..fc46a2b0 100644
--- a/proto/common/validation.pb.go
+++ b/proto/common/validation.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: common/validation.proto
 
 package common
@@ -33,11 +33,9 @@ type MapKeySpec struct {
 
 func (x *MapKeySpec) Reset() {
 	*x = MapKeySpec{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_common_validation_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_common_validation_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MapKeySpec) String() string {
@@ -48,7 +46,7 @@ func (*MapKeySpec) ProtoMessage() {}
 
 func (x *MapKeySpec) ProtoReflect() protoreflect.Message {
 	mi := &file_common_validation_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -279,20 +277,6 @@ func file_common_validation_proto_init() {
 	if File_common_validation_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_common_validation_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*MapKeySpec); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/delivery/delivery.pb.go b/proto/delivery/delivery.pb.go
index 81f70e66..dd6158f4 100644
--- a/proto/delivery/delivery.pb.go
+++ b/proto/delivery/delivery.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: delivery/delivery.proto
 
 package delivery
@@ -35,11 +35,9 @@ type ListLocalesRequest struct {
 
 func (x *ListLocalesRequest) Reset() {
 	*x = ListLocalesRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListLocalesRequest) String() string {
@@ -50,7 +48,7 @@ func (*ListLocalesRequest) ProtoMessage() {}
 
 func (x *ListLocalesRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -82,11 +80,9 @@ type ListLocalesResponse struct {
 
 func (x *ListLocalesResponse) Reset() {
 	*x = ListLocalesResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListLocalesResponse) String() string {
@@ -97,7 +93,7 @@ func (*ListLocalesResponse) ProtoMessage() {}
 
 func (x *ListLocalesResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -130,11 +126,9 @@ type GetEnvironmentRequest struct {
 
 func (x *GetEnvironmentRequest) Reset() {
 	*x = GetEnvironmentRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetEnvironmentRequest) String() string {
@@ -145,7 +139,7 @@ func (*GetEnvironmentRequest) ProtoMessage() {}
 
 func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -184,11 +178,9 @@ type GetEnvironmentResponse struct {
 
 func (x *GetEnvironmentResponse) Reset() {
 	*x = GetEnvironmentResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetEnvironmentResponse) String() string {
@@ -199,7 +191,7 @@ func (*GetEnvironmentResponse) ProtoMessage() {}
 
 func (x *GetEnvironmentResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -231,11 +223,9 @@ type ListEnvironmentsRequest struct {
 
 func (x *ListEnvironmentsRequest) Reset() {
 	*x = ListEnvironmentsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListEnvironmentsRequest) String() string {
@@ -246,7 +236,7 @@ func (*ListEnvironmentsRequest) ProtoMessage() {}
 
 func (x *ListEnvironmentsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -278,11 +268,9 @@ type ListEnvironmentsResponse struct {
 
 func (x *ListEnvironmentsResponse) Reset() {
 	*x = ListEnvironmentsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListEnvironmentsResponse) String() string {
@@ -293,7 +281,7 @@ func (*ListEnvironmentsResponse) ProtoMessage() {}
 
 func (x *ListEnvironmentsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -327,11 +315,9 @@ type GetCollectionRequest struct {
 
 func (x *GetCollectionRequest) Reset() {
 	*x = GetCollectionRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetCollectionRequest) String() string {
@@ -342,7 +328,7 @@ func (*GetCollectionRequest) ProtoMessage() {}
 
 func (x *GetCollectionRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -388,11 +374,9 @@ type GetCollectionResponse struct {
 
 func (x *GetCollectionResponse) Reset() {
 	*x = GetCollectionResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetCollectionResponse) String() string {
@@ -403,7 +387,7 @@ func (*GetCollectionResponse) ProtoMessage() {}
 
 func (x *GetCollectionResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -436,11 +420,9 @@ type ListCollectionsRequest struct {
 
 func (x *ListCollectionsRequest) Reset() {
 	*x = ListCollectionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListCollectionsRequest) String() string {
@@ -451,7 +433,7 @@ func (*ListCollectionsRequest) ProtoMessage() {}
 
 func (x *ListCollectionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -490,11 +472,9 @@ type ListCollectionsResponse struct {
 
 func (x *ListCollectionsResponse) Reset() {
 	*x = ListCollectionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListCollectionsResponse) String() string {
@@ -505,7 +485,7 @@ func (*ListCollectionsResponse) ProtoMessage() {}
 
 func (x *ListCollectionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -541,11 +521,9 @@ type GetItemRequest struct {
 
 func (x *GetItemRequest) Reset() {
 	*x = GetItemRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetItemRequest) String() string {
@@ -556,7 +534,7 @@ func (*GetItemRequest) ProtoMessage() {}
 
 func (x *GetItemRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -616,11 +594,9 @@ type GetItemResponse struct {
 
 func (x *GetItemResponse) Reset() {
 	*x = GetItemResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetItemResponse) String() string {
@@ -631,7 +607,7 @@ func (*GetItemResponse) ProtoMessage() {}
 
 func (x *GetItemResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -667,11 +643,9 @@ type FindItemsRequest struct {
 
 func (x *FindItemsRequest) Reset() {
 	*x = FindItemsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindItemsRequest) String() string {
@@ -682,7 +656,7 @@ func (*FindItemsRequest) ProtoMessage() {}
 
 func (x *FindItemsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -743,11 +717,9 @@ type FindItemsResponse struct {
 
 func (x *FindItemsResponse) Reset() {
 	*x = FindItemsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindItemsResponse) String() string {
@@ -758,7 +730,7 @@ func (*FindItemsResponse) ProtoMessage() {}
 
 func (x *FindItemsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -797,11 +769,9 @@ type AggregateOptions struct {
 
 func (x *AggregateOptions) Reset() {
 	*x = AggregateOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateOptions) String() string {
@@ -812,7 +782,7 @@ func (*AggregateOptions) ProtoMessage() {}
 
 func (x *AggregateOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -848,11 +818,9 @@ type AggregateRequest struct {
 
 func (x *AggregateRequest) Reset() {
 	*x = AggregateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[15]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateRequest) String() string {
@@ -863,7 +831,7 @@ func (*AggregateRequest) ProtoMessage() {}
 
 func (x *AggregateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[15]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -923,11 +891,9 @@ type AggregateResponse struct {
 
 func (x *AggregateResponse) Reset() {
 	*x = AggregateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_delivery_delivery_proto_msgTypes[16]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_delivery_delivery_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateResponse) String() string {
@@ -938,7 +904,7 @@ func (*AggregateResponse) ProtoMessage() {}
 
 func (x *AggregateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_delivery_delivery_proto_msgTypes[16]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1215,212 +1181,6 @@ func file_delivery_delivery_proto_init() {
 	if File_delivery_delivery_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_delivery_delivery_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*ListLocalesRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*ListLocalesResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*GetEnvironmentRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetEnvironmentResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*ListEnvironmentsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*ListEnvironmentsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*GetCollectionRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*GetCollectionResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*ListCollectionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*ListCollectionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*GetItemRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*GetItemResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*FindItemsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*FindItemsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[15].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_delivery_delivery_proto_msgTypes[16].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/delivery/delivery_grpc.pb.go b/proto/delivery/delivery_grpc.pb.go
index a0a14e9b..93f1436c 100644
--- a/proto/delivery/delivery_grpc.pb.go
+++ b/proto/delivery/delivery_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: delivery/delivery.proto
 
 package delivery
diff --git a/proto/environments/environments.pb.go b/proto/environments/environments.pb.go
index 9bff8500..455abfed 100644
--- a/proto/environments/environments.pb.go
+++ b/proto/environments/environments.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: environments/environments.proto
 
 package environments
@@ -92,11 +92,9 @@ type Environment struct {
 
 func (x *Environment) Reset() {
 	*x = Environment{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Environment) String() string {
@@ -107,7 +105,7 @@ func (*Environment) ProtoMessage() {}
 
 func (x *Environment) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -176,11 +174,9 @@ type StateInfo struct {
 
 func (x *StateInfo) Reset() {
 	*x = StateInfo{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *StateInfo) String() string {
@@ -191,7 +187,7 @@ func (*StateInfo) ProtoMessage() {}
 
 func (x *StateInfo) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -239,11 +235,9 @@ type Config struct {
 
 func (x *Config) Reset() {
 	*x = Config{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Config) String() string {
@@ -254,7 +248,7 @@ func (*Config) ProtoMessage() {}
 
 func (x *Config) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -293,11 +287,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -308,7 +300,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -340,11 +332,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -355,7 +345,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -387,11 +377,9 @@ type ListRequest struct {
 
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRequest) String() string {
@@ -402,7 +390,7 @@ func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -434,11 +422,9 @@ type ListResponse struct {
 
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListResponse) String() string {
@@ -449,7 +435,7 @@ func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -477,16 +463,14 @@ type GetRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -497,7 +481,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -519,9 +503,9 @@ func (x *GetRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *GetRequest) GetEnvId() string {
+func (x *GetRequest) GetId() string {
 	if x != nil {
-		return x.EnvId
+		return x.Id
 	}
 	return ""
 }
@@ -536,11 +520,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -551,7 +533,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -583,11 +565,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -598,7 +578,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -626,17 +606,15 @@ type SetAliasRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 	Alias   string `protobuf:"bytes,3,opt,name=alias,proto3" json:"alias,omitempty"`
 }
 
 func (x *SetAliasRequest) Reset() {
 	*x = SetAliasRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *SetAliasRequest) String() string {
@@ -647,7 +625,7 @@ func (*SetAliasRequest) ProtoMessage() {}
 
 func (x *SetAliasRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -669,9 +647,9 @@ func (x *SetAliasRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *SetAliasRequest) GetEnvId() string {
+func (x *SetAliasRequest) GetId() string {
 	if x != nil {
-		return x.EnvId
+		return x.Id
 	}
 	return ""
 }
@@ -689,17 +667,15 @@ type RemoveAliasRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 	Alias   string `protobuf:"bytes,3,opt,name=alias,proto3" json:"alias,omitempty"`
 }
 
 func (x *RemoveAliasRequest) Reset() {
 	*x = RemoveAliasRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *RemoveAliasRequest) String() string {
@@ -710,7 +686,7 @@ func (*RemoveAliasRequest) ProtoMessage() {}
 
 func (x *RemoveAliasRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -732,9 +708,9 @@ func (x *RemoveAliasRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *RemoveAliasRequest) GetEnvId() string {
+func (x *RemoveAliasRequest) GetId() string {
 	if x != nil {
-		return x.EnvId
+		return x.Id
 	}
 	return ""
 }
@@ -752,16 +728,14 @@ type DeleteRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -772,7 +746,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -794,9 +768,9 @@ func (x *DeleteRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *DeleteRequest) GetEnvId() string {
+func (x *DeleteRequest) GetId() string {
 	if x != nil {
-		return x.EnvId
+		return x.Id
 	}
 	return ""
 }
@@ -807,17 +781,15 @@ type MigrateRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string          `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId   string          `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Id      string          `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 	Options *MigrateOptions `protobuf:"bytes,10,opt,name=options,proto3" json:"options,omitempty"`
 }
 
 func (x *MigrateRequest) Reset() {
 	*x = MigrateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MigrateRequest) String() string {
@@ -828,7 +800,7 @@ func (*MigrateRequest) ProtoMessage() {}
 
 func (x *MigrateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -850,9 +822,9 @@ func (x *MigrateRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *MigrateRequest) GetEnvId() string {
+func (x *MigrateRequest) GetId() string {
 	if x != nil {
-		return x.EnvId
+		return x.Id
 	}
 	return ""
 }
@@ -877,11 +849,9 @@ type MigrateOptions struct {
 
 func (x *MigrateOptions) Reset() {
 	*x = MigrateOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_environments_environments_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_environments_environments_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MigrateOptions) String() string {
@@ -892,7 +862,7 @@ func (*MigrateOptions) ProtoMessage() {}
 
 func (x *MigrateOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_environments_environments_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -921,6 +891,273 @@ func (x *MigrateOptions) GetAsync() bool {
 	return false
 }
 
+type EnvironmentEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*EnvironmentEvent_Create
+	//	*EnvironmentEvent_Update
+	//	*EnvironmentEvent_Delete
+	//	*EnvironmentEvent_Migrate
+	Event isEnvironmentEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *EnvironmentEvent) Reset() {
+	*x = EnvironmentEvent{}
+	mi := &file_environments_environments_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *EnvironmentEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentEvent) ProtoMessage() {}
+
+func (x *EnvironmentEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_environments_environments_proto_msgTypes[15]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnvironmentEvent.ProtoReflect.Descriptor instead.
+func (*EnvironmentEvent) Descriptor() ([]byte, []int) {
+	return file_environments_environments_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *EnvironmentEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *EnvironmentEvent) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+func (m *EnvironmentEvent) GetEvent() isEnvironmentEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *EnvironmentEvent) GetCreate() *EnvironmentEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*EnvironmentEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *EnvironmentEvent) GetUpdate() *EnvironmentEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*EnvironmentEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *EnvironmentEvent) GetDelete() *EnvironmentEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*EnvironmentEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+func (x *EnvironmentEvent) GetMigrate() *EnvironmentEvent_MigrateEvent {
+	if x, ok := x.GetEvent().(*EnvironmentEvent_Migrate); ok {
+		return x.Migrate
+	}
+	return nil
+}
+
+type isEnvironmentEvent_Event interface {
+	isEnvironmentEvent_Event()
+}
+
+type EnvironmentEvent_Create struct {
+	Create *EnvironmentEvent_CreateEvent `protobuf:"bytes,101,opt,name=create,proto3,oneof"`
+}
+
+type EnvironmentEvent_Update struct {
+	Update *EnvironmentEvent_UpdateEvent `protobuf:"bytes,102,opt,name=update,proto3,oneof"`
+}
+
+type EnvironmentEvent_Delete struct {
+	Delete *EnvironmentEvent_DeleteEvent `protobuf:"bytes,103,opt,name=delete,proto3,oneof"`
+}
+
+type EnvironmentEvent_Migrate struct {
+	Migrate *EnvironmentEvent_MigrateEvent `protobuf:"bytes,104,opt,name=migrate,proto3,oneof"`
+}
+
+func (*EnvironmentEvent_Create) isEnvironmentEvent_Event() {}
+
+func (*EnvironmentEvent_Update) isEnvironmentEvent_Event() {}
+
+func (*EnvironmentEvent_Delete) isEnvironmentEvent_Event() {}
+
+func (*EnvironmentEvent_Migrate) isEnvironmentEvent_Event() {}
+
+type EnvironmentEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *EnvironmentEvent_CreateEvent) Reset() {
+	*x = EnvironmentEvent_CreateEvent{}
+	mi := &file_environments_environments_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *EnvironmentEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentEvent_CreateEvent) ProtoMessage() {}
+
+func (x *EnvironmentEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_environments_environments_proto_msgTypes[16]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnvironmentEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*EnvironmentEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_environments_environments_proto_rawDescGZIP(), []int{15, 0}
+}
+
+type EnvironmentEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *EnvironmentEvent_UpdateEvent) Reset() {
+	*x = EnvironmentEvent_UpdateEvent{}
+	mi := &file_environments_environments_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *EnvironmentEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *EnvironmentEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_environments_environments_proto_msgTypes[17]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnvironmentEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*EnvironmentEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_environments_environments_proto_rawDescGZIP(), []int{15, 1}
+}
+
+type EnvironmentEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *EnvironmentEvent_DeleteEvent) Reset() {
+	*x = EnvironmentEvent_DeleteEvent{}
+	mi := &file_environments_environments_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *EnvironmentEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *EnvironmentEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_environments_environments_proto_msgTypes[18]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnvironmentEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*EnvironmentEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_environments_environments_proto_rawDescGZIP(), []int{15, 2}
+}
+
+type EnvironmentEvent_MigrateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *EnvironmentEvent_MigrateEvent) Reset() {
+	*x = EnvironmentEvent_MigrateEvent{}
+	mi := &file_environments_environments_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *EnvironmentEvent_MigrateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentEvent_MigrateEvent) ProtoMessage() {}
+
+func (x *EnvironmentEvent_MigrateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_environments_environments_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 EnvironmentEvent_MigrateEvent.ProtoReflect.Descriptor instead.
+func (*EnvironmentEvent_MigrateEvent) Descriptor() ([]byte, []int) {
+	return file_environments_environments_proto_rawDescGZIP(), []int{15, 3}
+}
+
 var File_environments_environments_proto protoreflect.FileDescriptor
 
 var file_environments_environments_proto_rawDesc = []byte{
@@ -980,92 +1217,118 @@ var file_environments_environments_proto_rawDesc = []byte{
 	0x73, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
 	0x32, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72,
 	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
-	0x65, 0x6e, 0x74, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x47, 0x65, 0x74,
+	0x65, 0x6e, 0x74, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x22, 0x37, 0x0a, 0x0a, 0x47, 0x65, 0x74,
 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
 	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0b, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76,
-	0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x44, 0x0a,
-	0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33,
-	0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03,
-	0x65, 0x6e, 0x76, 0x22, 0x59, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52,
+	0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x22, 0x42, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x33, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+	0x74, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x44, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65,
+	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x52, 0x0a, 0x0f,
+	0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c,
+	0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73,
+	0x22, 0x55, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
 	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49,
-	0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61,
-	0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x5c,
-	0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12,
-	0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x41, 0x0a, 0x0d,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
-	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22,
-	0x82, 0x01, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a,
-	0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
-	0x6e, 0x76, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67,
-	0x72, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x4f,
-	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73,
-	0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63,
-	0x32, 0x81, 0x05, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-	0x73, 0x12, 0x55, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72,
-	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,
-	0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
-	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
-	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21,
+	0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+	0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3a, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x64, 0x22, 0x7b, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64,
+	0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+	0x12, 0x3e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x22, 0x3a, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xc5, 0x03, 0x0a,
+	0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06,
+	0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e,
+	0x76, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e,
+	0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x12, 0x4c, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12,
+	0x4c, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+	0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x4f, 0x0a,
+	0x07, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33,
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
-	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
-	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
-	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x4b, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
-	0x6e, 0x74, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a,
-	0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x28, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
-	0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x47, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x07, 0x4d, 0x69, 0x67,
-	0x72, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65,
-	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+	0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x1a, 0x0d,
+	0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a,
+	0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0e, 0x0a, 0x0c, 0x4d,
+	0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65,
+	0x76, 0x65, 0x6e, 0x74, 0x32, 0x81, 0x05, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12,
+	0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65,
+	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x03,
+	0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e,
+	0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x04, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76,
+	0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x55, 0x70, 0x64,
 	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
 	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x22, 0x00, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
-	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72,
-	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
-	0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x79, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73,
+	0x12, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x51, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73,
+	0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c,
+	0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x49, 0x0a,
+	0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e,
+	0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e,
+	0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70,
+	0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65,
+	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1081,59 +1344,68 @@ func file_environments_environments_proto_rawDescGZIP() []byte {
 }
 
 var file_environments_environments_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_environments_environments_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_environments_environments_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
 var file_environments_environments_proto_goTypes = []any{
-	(StateInfo_State)(0),          // 0: content.environments.StateInfo.State
-	(*Environment)(nil),           // 1: content.environments.Environment
-	(*StateInfo)(nil),             // 2: content.environments.StateInfo
-	(*Config)(nil),                // 3: content.environments.Config
-	(*CreateRequest)(nil),         // 4: content.environments.CreateRequest
-	(*CreateResponse)(nil),        // 5: content.environments.CreateResponse
-	(*ListRequest)(nil),           // 6: content.environments.ListRequest
-	(*ListResponse)(nil),          // 7: content.environments.ListResponse
-	(*GetRequest)(nil),            // 8: content.environments.GetRequest
-	(*GetResponse)(nil),           // 9: content.environments.GetResponse
-	(*UpdateRequest)(nil),         // 10: content.environments.UpdateRequest
-	(*SetAliasRequest)(nil),       // 11: content.environments.SetAliasRequest
-	(*RemoveAliasRequest)(nil),    // 12: content.environments.RemoveAliasRequest
-	(*DeleteRequest)(nil),         // 13: content.environments.DeleteRequest
-	(*MigrateRequest)(nil),        // 14: content.environments.MigrateRequest
-	(*MigrateOptions)(nil),        // 15: content.environments.MigrateOptions
-	(*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp
-	(*emptypb.Empty)(nil),         // 17: google.protobuf.Empty
+	(StateInfo_State)(0),                  // 0: content.environments.StateInfo.State
+	(*Environment)(nil),                   // 1: content.environments.Environment
+	(*StateInfo)(nil),                     // 2: content.environments.StateInfo
+	(*Config)(nil),                        // 3: content.environments.Config
+	(*CreateRequest)(nil),                 // 4: content.environments.CreateRequest
+	(*CreateResponse)(nil),                // 5: content.environments.CreateResponse
+	(*ListRequest)(nil),                   // 6: content.environments.ListRequest
+	(*ListResponse)(nil),                  // 7: content.environments.ListResponse
+	(*GetRequest)(nil),                    // 8: content.environments.GetRequest
+	(*GetResponse)(nil),                   // 9: content.environments.GetResponse
+	(*UpdateRequest)(nil),                 // 10: content.environments.UpdateRequest
+	(*SetAliasRequest)(nil),               // 11: content.environments.SetAliasRequest
+	(*RemoveAliasRequest)(nil),            // 12: content.environments.RemoveAliasRequest
+	(*DeleteRequest)(nil),                 // 13: content.environments.DeleteRequest
+	(*MigrateRequest)(nil),                // 14: content.environments.MigrateRequest
+	(*MigrateOptions)(nil),                // 15: content.environments.MigrateOptions
+	(*EnvironmentEvent)(nil),              // 16: content.environments.EnvironmentEvent
+	(*EnvironmentEvent_CreateEvent)(nil),  // 17: content.environments.EnvironmentEvent.CreateEvent
+	(*EnvironmentEvent_UpdateEvent)(nil),  // 18: content.environments.EnvironmentEvent.UpdateEvent
+	(*EnvironmentEvent_DeleteEvent)(nil),  // 19: content.environments.EnvironmentEvent.DeleteEvent
+	(*EnvironmentEvent_MigrateEvent)(nil), // 20: content.environments.EnvironmentEvent.MigrateEvent
+	(*timestamppb.Timestamp)(nil),         // 21: google.protobuf.Timestamp
+	(*emptypb.Empty)(nil),                 // 22: google.protobuf.Empty
 }
 var file_environments_environments_proto_depIdxs = []int32{
 	2,  // 0: content.environments.Environment.state_info:type_name -> content.environments.StateInfo
 	3,  // 1: content.environments.Environment.config:type_name -> content.environments.Config
 	0,  // 2: content.environments.StateInfo.state:type_name -> content.environments.StateInfo.State
-	16, // 3: content.environments.StateInfo.started_at:type_name -> google.protobuf.Timestamp
+	21, // 3: content.environments.StateInfo.started_at:type_name -> google.protobuf.Timestamp
 	1,  // 4: content.environments.CreateRequest.env:type_name -> content.environments.Environment
 	1,  // 5: content.environments.CreateResponse.created:type_name -> content.environments.Environment
 	1,  // 6: content.environments.ListResponse.envs:type_name -> content.environments.Environment
 	1,  // 7: content.environments.GetResponse.env:type_name -> content.environments.Environment
 	1,  // 8: content.environments.UpdateRequest.env:type_name -> content.environments.Environment
 	15, // 9: content.environments.MigrateRequest.options:type_name -> content.environments.MigrateOptions
-	4,  // 10: content.environments.Environments.Create:input_type -> content.environments.CreateRequest
-	8,  // 11: content.environments.Environments.Get:input_type -> content.environments.GetRequest
-	6,  // 12: content.environments.Environments.List:input_type -> content.environments.ListRequest
-	10, // 13: content.environments.Environments.Update:input_type -> content.environments.UpdateRequest
-	11, // 14: content.environments.Environments.SetAlias:input_type -> content.environments.SetAliasRequest
-	12, // 15: content.environments.Environments.RemoveAlias:input_type -> content.environments.RemoveAliasRequest
-	13, // 16: content.environments.Environments.Delete:input_type -> content.environments.DeleteRequest
-	14, // 17: content.environments.Environments.Migrate:input_type -> content.environments.MigrateRequest
-	5,  // 18: content.environments.Environments.Create:output_type -> content.environments.CreateResponse
-	9,  // 19: content.environments.Environments.Get:output_type -> content.environments.GetResponse
-	7,  // 20: content.environments.Environments.List:output_type -> content.environments.ListResponse
-	17, // 21: content.environments.Environments.Update:output_type -> google.protobuf.Empty
-	17, // 22: content.environments.Environments.SetAlias:output_type -> google.protobuf.Empty
-	17, // 23: content.environments.Environments.RemoveAlias:output_type -> google.protobuf.Empty
-	17, // 24: content.environments.Environments.Delete:output_type -> google.protobuf.Empty
-	17, // 25: content.environments.Environments.Migrate:output_type -> google.protobuf.Empty
-	18, // [18:26] is the sub-list for method output_type
-	10, // [10:18] is the sub-list for method input_type
-	10, // [10:10] is the sub-list for extension type_name
-	10, // [10:10] is the sub-list for extension extendee
-	0,  // [0:10] is the sub-list for field type_name
+	17, // 10: content.environments.EnvironmentEvent.create:type_name -> content.environments.EnvironmentEvent.CreateEvent
+	18, // 11: content.environments.EnvironmentEvent.update:type_name -> content.environments.EnvironmentEvent.UpdateEvent
+	19, // 12: content.environments.EnvironmentEvent.delete:type_name -> content.environments.EnvironmentEvent.DeleteEvent
+	20, // 13: content.environments.EnvironmentEvent.migrate:type_name -> content.environments.EnvironmentEvent.MigrateEvent
+	4,  // 14: content.environments.Environments.Create:input_type -> content.environments.CreateRequest
+	8,  // 15: content.environments.Environments.Get:input_type -> content.environments.GetRequest
+	6,  // 16: content.environments.Environments.List:input_type -> content.environments.ListRequest
+	10, // 17: content.environments.Environments.Update:input_type -> content.environments.UpdateRequest
+	11, // 18: content.environments.Environments.SetAlias:input_type -> content.environments.SetAliasRequest
+	12, // 19: content.environments.Environments.RemoveAlias:input_type -> content.environments.RemoveAliasRequest
+	13, // 20: content.environments.Environments.Delete:input_type -> content.environments.DeleteRequest
+	14, // 21: content.environments.Environments.Migrate:input_type -> content.environments.MigrateRequest
+	5,  // 22: content.environments.Environments.Create:output_type -> content.environments.CreateResponse
+	9,  // 23: content.environments.Environments.Get:output_type -> content.environments.GetResponse
+	7,  // 24: content.environments.Environments.List:output_type -> content.environments.ListResponse
+	22, // 25: content.environments.Environments.Update:output_type -> google.protobuf.Empty
+	22, // 26: content.environments.Environments.SetAlias:output_type -> google.protobuf.Empty
+	22, // 27: content.environments.Environments.RemoveAlias:output_type -> google.protobuf.Empty
+	22, // 28: content.environments.Environments.Delete:output_type -> google.protobuf.Empty
+	22, // 29: content.environments.Environments.Migrate:output_type -> google.protobuf.Empty
+	22, // [22:30] is the sub-list for method output_type
+	14, // [14:22] is the sub-list for method input_type
+	14, // [14:14] is the sub-list for extension type_name
+	14, // [14:14] is the sub-list for extension extendee
+	0,  // [0:14] is the sub-list for field type_name
 }
 
 func init() { file_environments_environments_proto_init() }
@@ -1141,187 +1413,11 @@ func file_environments_environments_proto_init() {
 	if File_environments_environments_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_environments_environments_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Environment); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*StateInfo); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*Config); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*ListResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*SetAliasRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*RemoveAliasRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*MigrateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_environments_environments_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*MigrateOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_environments_environments_proto_msgTypes[15].OneofWrappers = []any{
+		(*EnvironmentEvent_Create)(nil),
+		(*EnvironmentEvent_Update)(nil),
+		(*EnvironmentEvent_Delete)(nil),
+		(*EnvironmentEvent_Migrate)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -1329,7 +1425,7 @@ func file_environments_environments_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_environments_environments_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   15,
+			NumMessages:   20,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/environments/environments_grpc.pb.go b/proto/environments/environments_grpc.pb.go
index b0d65500..1cd53012 100644
--- a/proto/environments/environments_grpc.pb.go
+++ b/proto/environments/environments_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: environments/environments.proto
 
 package environments
diff --git a/proto/extensions/extension.pb.go b/proto/extensions/extension.pb.go
index 042f307b..fc8975fb 100644
--- a/proto/extensions/extension.pb.go
+++ b/proto/extensions/extension.pb.go
@@ -10,8 +10,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: extensions/extension.proto
 
 package extensions
@@ -307,11 +307,9 @@ type Action struct {
 
 func (x *Action) Reset() {
 	*x = Action{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Action) String() string {
@@ -322,7 +320,7 @@ func (*Action) ProtoMessage() {}
 
 func (x *Action) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -505,11 +503,9 @@ type ActionRequest struct {
 
 func (x *ActionRequest) Reset() {
 	*x = ActionRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ActionRequest) String() string {
@@ -520,7 +516,7 @@ func (*ActionRequest) ProtoMessage() {}
 
 func (x *ActionRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -619,6 +615,232 @@ func (x *ActionRequest) GetParams() *references.Reference {
 	return nil
 }
 
+type ExtensionEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SpaceId   string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	Extension string `protobuf:"bytes,2,opt,name=extension,proto3" json:"extension,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*ExtensionEvent_Install
+	//	*ExtensionEvent_Uninstall
+	//	*ExtensionEvent_Action
+	Event isExtensionEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *ExtensionEvent) Reset() {
+	*x = ExtensionEvent{}
+	mi := &file_extensions_extension_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ExtensionEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExtensionEvent) ProtoMessage() {}
+
+func (x *ExtensionEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_extension_proto_msgTypes[2]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExtensionEvent.ProtoReflect.Descriptor instead.
+func (*ExtensionEvent) Descriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ExtensionEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *ExtensionEvent) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (m *ExtensionEvent) GetEvent() isExtensionEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *ExtensionEvent) GetInstall() *ExtensionEvent_InstallEvent {
+	if x, ok := x.GetEvent().(*ExtensionEvent_Install); ok {
+		return x.Install
+	}
+	return nil
+}
+
+func (x *ExtensionEvent) GetUninstall() *ExtensionEvent_UninstallEvent {
+	if x, ok := x.GetEvent().(*ExtensionEvent_Uninstall); ok {
+		return x.Uninstall
+	}
+	return nil
+}
+
+func (x *ExtensionEvent) GetAction() *ExtensionEvent_ActionEvent {
+	if x, ok := x.GetEvent().(*ExtensionEvent_Action); ok {
+		return x.Action
+	}
+	return nil
+}
+
+type isExtensionEvent_Event interface {
+	isExtensionEvent_Event()
+}
+
+type ExtensionEvent_Install struct {
+	Install *ExtensionEvent_InstallEvent `protobuf:"bytes,100,opt,name=install,proto3,oneof"`
+}
+
+type ExtensionEvent_Uninstall struct {
+	Uninstall *ExtensionEvent_UninstallEvent `protobuf:"bytes,101,opt,name=uninstall,proto3,oneof"`
+}
+
+type ExtensionEvent_Action struct {
+	Action *ExtensionEvent_ActionEvent `protobuf:"bytes,102,opt,name=action,proto3,oneof"`
+}
+
+func (*ExtensionEvent_Install) isExtensionEvent_Event() {}
+
+func (*ExtensionEvent_Uninstall) isExtensionEvent_Event() {}
+
+func (*ExtensionEvent_Action) isExtensionEvent_Event() {}
+
+type ExtensionEvent_InstallEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ExtensionEvent_InstallEvent) Reset() {
+	*x = ExtensionEvent_InstallEvent{}
+	mi := &file_extensions_extension_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ExtensionEvent_InstallEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExtensionEvent_InstallEvent) ProtoMessage() {}
+
+func (x *ExtensionEvent_InstallEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_extension_proto_msgTypes[4]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExtensionEvent_InstallEvent.ProtoReflect.Descriptor instead.
+func (*ExtensionEvent_InstallEvent) Descriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{2, 0}
+}
+
+type ExtensionEvent_UninstallEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ExtensionEvent_UninstallEvent) Reset() {
+	*x = ExtensionEvent_UninstallEvent{}
+	mi := &file_extensions_extension_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ExtensionEvent_UninstallEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExtensionEvent_UninstallEvent) ProtoMessage() {}
+
+func (x *ExtensionEvent_UninstallEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_extension_proto_msgTypes[5]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExtensionEvent_UninstallEvent.ProtoReflect.Descriptor instead.
+func (*ExtensionEvent_UninstallEvent) Descriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{2, 1}
+}
+
+type ExtensionEvent_ActionEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"`
+}
+
+func (x *ExtensionEvent_ActionEvent) Reset() {
+	*x = ExtensionEvent_ActionEvent{}
+	mi := &file_extensions_extension_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ExtensionEvent_ActionEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExtensionEvent_ActionEvent) ProtoMessage() {}
+
+func (x *ExtensionEvent_ActionEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_extension_proto_msgTypes[6]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExtensionEvent_ActionEvent.ProtoReflect.Descriptor instead.
+func (*ExtensionEvent_ActionEvent) Descriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{2, 2}
+}
+
+func (x *ExtensionEvent_ActionEvent) GetAction() string {
+	if x != nil {
+		return x.Action
+	}
+	return ""
+}
+
 var File_extensions_extension_proto protoreflect.FileDescriptor
 
 var file_extensions_extension_proto_rawDesc = []byte{
@@ -716,7 +938,30 @@ var file_extensions_extension_proto_rawDesc = []byte{
 	0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
 	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
 	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x67, 0x0a, 0x06, 0x54, 0x61,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xed, 0x02, 0x0a, 0x0e, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x07, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+	0x6c, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x49, 0x0a, 0x09, 0x75,
+	0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,
+	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0e, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74,
+	0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x10, 0x0a, 0x0e, 0x55, 0x6e, 0x69, 0x6e,
+	0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x25, 0x0a, 0x0b, 0x41, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2a, 0x67, 0x0a, 0x06, 0x54, 0x61,
 	0x72, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10,
 	0x00, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x44, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04,
 	0x57, 0x49, 0x44, 0x45, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x04,
@@ -743,31 +988,38 @@ func file_extensions_extension_proto_rawDescGZIP() []byte {
 }
 
 var file_extensions_extension_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
-var file_extensions_extension_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_extensions_extension_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
 var file_extensions_extension_proto_goTypes = []any{
-	(Target)(0),                  // 0: extensions.Target
-	(Action_Kind)(0),             // 1: extensions.Action.Kind
-	(Action_View)(0),             // 2: extensions.Action.View
-	(*Action)(nil),               // 3: extensions.Action
-	(*ActionRequest)(nil),        // 4: extensions.ActionRequest
-	nil,                          // 5: extensions.ActionRequest.MetadataEntry
-	(*references.Reference)(nil), // 6: content.references.Reference
+	(Target)(0),                           // 0: extensions.Target
+	(Action_Kind)(0),                      // 1: extensions.Action.Kind
+	(Action_View)(0),                      // 2: extensions.Action.View
+	(*Action)(nil),                        // 3: extensions.Action
+	(*ActionRequest)(nil),                 // 4: extensions.ActionRequest
+	(*ExtensionEvent)(nil),                // 5: extensions.ExtensionEvent
+	nil,                                   // 6: extensions.ActionRequest.MetadataEntry
+	(*ExtensionEvent_InstallEvent)(nil),   // 7: extensions.ExtensionEvent.InstallEvent
+	(*ExtensionEvent_UninstallEvent)(nil), // 8: extensions.ExtensionEvent.UninstallEvent
+	(*ExtensionEvent_ActionEvent)(nil),    // 9: extensions.ExtensionEvent.ActionEvent
+	(*references.Reference)(nil),          // 10: content.references.Reference
 }
 var file_extensions_extension_proto_depIdxs = []int32{
-	0, // 0: extensions.Action.target:type_name -> extensions.Target
-	6, // 1: extensions.Action.image:type_name -> content.references.Reference
-	1, // 2: extensions.Action.kind:type_name -> extensions.Action.Kind
-	6, // 3: extensions.Action.refs:type_name -> content.references.Reference
-	4, // 4: extensions.Action.request:type_name -> extensions.ActionRequest
-	2, // 5: extensions.Action.view:type_name -> extensions.Action.View
-	5, // 6: extensions.ActionRequest.metadata:type_name -> extensions.ActionRequest.MetadataEntry
-	6, // 7: extensions.ActionRequest.refs:type_name -> content.references.Reference
-	6, // 8: extensions.ActionRequest.params:type_name -> content.references.Reference
-	9, // [9:9] is the sub-list for method output_type
-	9, // [9:9] is the sub-list for method input_type
-	9, // [9:9] is the sub-list for extension type_name
-	9, // [9:9] is the sub-list for extension extendee
-	0, // [0:9] is the sub-list for field type_name
+	0,  // 0: extensions.Action.target:type_name -> extensions.Target
+	10, // 1: extensions.Action.image:type_name -> content.references.Reference
+	1,  // 2: extensions.Action.kind:type_name -> extensions.Action.Kind
+	10, // 3: extensions.Action.refs:type_name -> content.references.Reference
+	4,  // 4: extensions.Action.request:type_name -> extensions.ActionRequest
+	2,  // 5: extensions.Action.view:type_name -> extensions.Action.View
+	6,  // 6: extensions.ActionRequest.metadata:type_name -> extensions.ActionRequest.MetadataEntry
+	10, // 7: extensions.ActionRequest.refs:type_name -> content.references.Reference
+	10, // 8: extensions.ActionRequest.params:type_name -> content.references.Reference
+	7,  // 9: extensions.ExtensionEvent.install:type_name -> extensions.ExtensionEvent.InstallEvent
+	8,  // 10: extensions.ExtensionEvent.uninstall:type_name -> extensions.ExtensionEvent.UninstallEvent
+	9,  // 11: extensions.ExtensionEvent.action:type_name -> extensions.ExtensionEvent.ActionEvent
+	12, // [12:12] is the sub-list for method output_type
+	12, // [12:12] is the sub-list for method input_type
+	12, // [12:12] is the sub-list for extension type_name
+	12, // [12:12] is the sub-list for extension extendee
+	0,  // [0:12] is the sub-list for field type_name
 }
 
 func init() { file_extensions_extension_proto_init() }
@@ -775,31 +1027,10 @@ func file_extensions_extension_proto_init() {
 	if File_extensions_extension_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_extensions_extension_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Action); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*ActionRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_extensions_extension_proto_msgTypes[2].OneofWrappers = []any{
+		(*ExtensionEvent_Install)(nil),
+		(*ExtensionEvent_Uninstall)(nil),
+		(*ExtensionEvent_Action)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -807,7 +1038,7 @@ func file_extensions_extension_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_extensions_extension_proto_rawDesc,
 			NumEnums:      3,
-			NumMessages:   3,
+			NumMessages:   7,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/proto/extensions/extension_service.pb.go b/proto/extensions/extension_service.pb.go
index 39424e06..fe4190c9 100644
--- a/proto/extensions/extension_service.pb.go
+++ b/proto/extensions/extension_service.pb.go
@@ -10,8 +10,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: extensions/extension_service.proto
 
 package extensions
@@ -150,11 +150,9 @@ type InstallRequest struct {
 
 func (x *InstallRequest) Reset() {
 	*x = InstallRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_service_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *InstallRequest) String() string {
@@ -165,7 +163,7 @@ func (*InstallRequest) ProtoMessage() {}
 
 func (x *InstallRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_service_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -223,11 +221,9 @@ type UninstallRequest struct {
 
 func (x *UninstallRequest) Reset() {
 	*x = UninstallRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_service_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UninstallRequest) String() string {
@@ -238,7 +234,7 @@ func (*UninstallRequest) ProtoMessage() {}
 
 func (x *UninstallRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_service_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -301,11 +297,9 @@ type CheckRequest struct {
 
 func (x *CheckRequest) Reset() {
 	*x = CheckRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_service_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CheckRequest) String() string {
@@ -316,7 +310,7 @@ func (*CheckRequest) ProtoMessage() {}
 
 func (x *CheckRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_service_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -371,11 +365,9 @@ type ActionResponse struct {
 
 func (x *ActionResponse) Reset() {
 	*x = ActionResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_extension_service_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ActionResponse) String() string {
@@ -386,7 +378,7 @@ func (*ActionResponse) ProtoMessage() {}
 
 func (x *ActionResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_extension_service_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -624,56 +616,6 @@ func file_extensions_extension_service_proto_init() {
 		return
 	}
 	file_extensions_extension_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_extensions_extension_service_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*InstallRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_service_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*UninstallRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_service_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CheckRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_service_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*ActionResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/extensions/extension_service_grpc.pb.go b/proto/extensions/extension_service_grpc.pb.go
index a5a1a981..9efc3962 100644
--- a/proto/extensions/extension_service_grpc.pb.go
+++ b/proto/extensions/extension_service_grpc.pb.go
@@ -11,7 +11,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: extensions/extension_service.proto
 
 package extensions
diff --git a/proto/extensions/manager_service.pb.go b/proto/extensions/manager_service.pb.go
index e0a1160e..d6935efe 100644
--- a/proto/extensions/manager_service.pb.go
+++ b/proto/extensions/manager_service.pb.go
@@ -27,8 +27,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: extensions/manager_service.proto
 
 package extensions
@@ -123,11 +123,9 @@ type ListExtensionsRequest struct {
 
 func (x *ListExtensionsRequest) Reset() {
 	*x = ListExtensionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListExtensionsRequest) String() string {
@@ -138,7 +136,7 @@ func (*ListExtensionsRequest) ProtoMessage() {}
 
 func (x *ListExtensionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -196,11 +194,9 @@ type ListExtensionsResponse struct {
 
 func (x *ListExtensionsResponse) Reset() {
 	*x = ListExtensionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListExtensionsResponse) String() string {
@@ -211,7 +207,7 @@ func (*ListExtensionsResponse) ProtoMessage() {}
 
 func (x *ListExtensionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -251,11 +247,9 @@ type ExtensionDescriptor struct {
 
 func (x *ExtensionDescriptor) Reset() {
 	*x = ExtensionDescriptor{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ExtensionDescriptor) String() string {
@@ -266,7 +260,7 @@ func (*ExtensionDescriptor) ProtoMessage() {}
 
 func (x *ExtensionDescriptor) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -347,11 +341,9 @@ type RegisterExtensionsRequest struct {
 
 func (x *RegisterExtensionsRequest) Reset() {
 	*x = RegisterExtensionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *RegisterExtensionsRequest) String() string {
@@ -362,7 +354,7 @@ func (*RegisterExtensionsRequest) ProtoMessage() {}
 
 func (x *RegisterExtensionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -392,11 +384,9 @@ type RegisterExtensionsResponse struct {
 
 func (x *RegisterExtensionsResponse) Reset() {
 	*x = RegisterExtensionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *RegisterExtensionsResponse) String() string {
@@ -407,7 +397,7 @@ func (*RegisterExtensionsResponse) ProtoMessage() {}
 
 func (x *RegisterExtensionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -432,11 +422,9 @@ type UnregisterExtensionsRequest struct {
 
 func (x *UnregisterExtensionsRequest) Reset() {
 	*x = UnregisterExtensionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UnregisterExtensionsRequest) String() string {
@@ -447,7 +435,7 @@ func (*UnregisterExtensionsRequest) ProtoMessage() {}
 
 func (x *UnregisterExtensionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -477,11 +465,9 @@ type UnregisterExtensionsResponse struct {
 
 func (x *UnregisterExtensionsResponse) Reset() {
 	*x = UnregisterExtensionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UnregisterExtensionsResponse) String() string {
@@ -492,7 +478,7 @@ func (*UnregisterExtensionsResponse) ProtoMessage() {}
 
 func (x *UnregisterExtensionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -517,11 +503,9 @@ type ListRegisteredExtensionsRequest struct {
 
 func (x *ListRegisteredExtensionsRequest) Reset() {
 	*x = ListRegisteredExtensionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRegisteredExtensionsRequest) String() string {
@@ -532,7 +516,7 @@ func (*ListRegisteredExtensionsRequest) ProtoMessage() {}
 
 func (x *ListRegisteredExtensionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -564,11 +548,9 @@ type ListRegisteredExtensionsResponse struct {
 
 func (x *ListRegisteredExtensionsResponse) Reset() {
 	*x = ListRegisteredExtensionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRegisteredExtensionsResponse) String() string {
@@ -579,7 +561,7 @@ func (*ListRegisteredExtensionsResponse) ProtoMessage() {}
 
 func (x *ListRegisteredExtensionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -617,11 +599,9 @@ type SpaceExtensions struct {
 
 func (x *SpaceExtensions) Reset() {
 	*x = SpaceExtensions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *SpaceExtensions) String() string {
@@ -632,7 +612,7 @@ func (*SpaceExtensions) ProtoMessage() {}
 
 func (x *SpaceExtensions) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -714,11 +694,9 @@ type ListExtensionsResponse_ExtensionInfo struct {
 
 func (x *ListExtensionsResponse_ExtensionInfo) Reset() {
 	*x = ListExtensionsResponse_ExtensionInfo{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_service_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_extensions_manager_service_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListExtensionsResponse_ExtensionInfo) String() string {
@@ -729,7 +707,7 @@ func (*ListExtensionsResponse_ExtensionInfo) ProtoMessage() {}
 
 func (x *ListExtensionsResponse_ExtensionInfo) ProtoReflect() protoreflect.Message {
 	mi := &file_extensions_manager_service_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1011,140 +989,6 @@ func file_extensions_manager_service_proto_init() {
 	if File_extensions_manager_service_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_extensions_manager_service_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*ListExtensionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*ListExtensionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*ExtensionDescriptor); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*RegisterExtensionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*RegisterExtensionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*UnregisterExtensionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*UnregisterExtensionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRegisteredExtensionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRegisteredExtensionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*SpaceExtensions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_manager_service_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*ListExtensionsResponse_ExtensionInfo); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/extensions/manager_service_grpc.pb.go b/proto/extensions/manager_service_grpc.pb.go
index 07ee35f5..2666df12 100644
--- a/proto/extensions/manager_service_grpc.pb.go
+++ b/proto/extensions/manager_service_grpc.pb.go
@@ -28,7 +28,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: extensions/manager_service.proto
 
 package extensions
diff --git a/proto/files/files.pb.go b/proto/files/files.pb.go
index 84a25157..b36ec58c 100644
--- a/proto/files/files.pb.go
+++ b/proto/files/files.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: files/files.proto
 
 package files
@@ -36,11 +36,9 @@ type File struct {
 
 func (x *File) Reset() {
 	*x = File{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *File) String() string {
@@ -51,7 +49,7 @@ func (*File) ProtoMessage() {}
 
 func (x *File) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -122,11 +120,9 @@ type MultipartUpload struct {
 
 func (x *MultipartUpload) Reset() {
 	*x = MultipartUpload{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MultipartUpload) String() string {
@@ -137,7 +133,7 @@ func (*MultipartUpload) ProtoMessage() {}
 
 func (x *MultipartUpload) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -198,11 +194,9 @@ type Upload struct {
 
 func (x *Upload) Reset() {
 	*x = Upload{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Upload) String() string {
@@ -213,7 +207,7 @@ func (*Upload) ProtoMessage() {}
 
 func (x *Upload) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -253,11 +247,9 @@ type CompletedPart struct {
 
 func (x *CompletedPart) Reset() {
 	*x = CompletedPart{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CompletedPart) String() string {
@@ -268,7 +260,7 @@ func (*CompletedPart) ProtoMessage() {}
 
 func (x *CompletedPart) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -307,11 +299,9 @@ type StartUploadRequest struct {
 
 func (x *StartUploadRequest) Reset() {
 	*x = StartUploadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *StartUploadRequest) String() string {
@@ -322,7 +312,7 @@ func (*StartUploadRequest) ProtoMessage() {}
 
 func (x *StartUploadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -354,11 +344,9 @@ type StartUploadResponse struct {
 
 func (x *StartUploadResponse) Reset() {
 	*x = StartUploadResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *StartUploadResponse) String() string {
@@ -369,7 +357,7 @@ func (*StartUploadResponse) ProtoMessage() {}
 
 func (x *StartUploadResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -401,11 +389,9 @@ type CompleteUploadRequest struct {
 
 func (x *CompleteUploadRequest) Reset() {
 	*x = CompleteUploadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CompleteUploadRequest) String() string {
@@ -416,7 +402,7 @@ func (*CompleteUploadRequest) ProtoMessage() {}
 
 func (x *CompleteUploadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -448,11 +434,9 @@ type CompleteUploadResponse struct {
 
 func (x *CompleteUploadResponse) Reset() {
 	*x = CompleteUploadResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CompleteUploadResponse) String() string {
@@ -463,7 +447,7 @@ func (*CompleteUploadResponse) ProtoMessage() {}
 
 func (x *CompleteUploadResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -495,11 +479,9 @@ type AbortUploadRequest struct {
 
 func (x *AbortUploadRequest) Reset() {
 	*x = AbortUploadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AbortUploadRequest) String() string {
@@ -510,7 +492,7 @@ func (*AbortUploadRequest) ProtoMessage() {}
 
 func (x *AbortUploadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -540,11 +522,9 @@ type AbortUploadResponse struct {
 
 func (x *AbortUploadResponse) Reset() {
 	*x = AbortUploadResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AbortUploadResponse) String() string {
@@ -555,7 +535,7 @@ func (*AbortUploadResponse) ProtoMessage() {}
 
 func (x *AbortUploadResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -580,11 +560,9 @@ type MoveUploadRequest struct {
 
 func (x *MoveUploadRequest) Reset() {
 	*x = MoveUploadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MoveUploadRequest) String() string {
@@ -595,7 +573,7 @@ func (*MoveUploadRequest) ProtoMessage() {}
 
 func (x *MoveUploadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -627,11 +605,9 @@ type MoveUploadResponse struct {
 
 func (x *MoveUploadResponse) Reset() {
 	*x = MoveUploadResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MoveUploadResponse) String() string {
@@ -642,7 +618,7 @@ func (*MoveUploadResponse) ProtoMessage() {}
 
 func (x *MoveUploadResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -674,11 +650,9 @@ type UploadRequest struct {
 
 func (x *UploadRequest) Reset() {
 	*x = UploadRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UploadRequest) String() string {
@@ -689,7 +663,7 @@ func (*UploadRequest) ProtoMessage() {}
 
 func (x *UploadRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -721,11 +695,9 @@ type UploadResponse struct {
 
 func (x *UploadResponse) Reset() {
 	*x = UploadResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UploadResponse) String() string {
@@ -736,7 +708,7 @@ func (*UploadResponse) ProtoMessage() {}
 
 func (x *UploadResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -768,11 +740,9 @@ type GetFileRequest struct {
 
 func (x *GetFileRequest) Reset() {
 	*x = GetFileRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetFileRequest) String() string {
@@ -783,7 +753,7 @@ func (*GetFileRequest) ProtoMessage() {}
 
 func (x *GetFileRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -815,11 +785,9 @@ type GetFileResponse struct {
 
 func (x *GetFileResponse) Reset() {
 	*x = GetFileResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[15]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetFileResponse) String() string {
@@ -830,7 +798,7 @@ func (*GetFileResponse) ProtoMessage() {}
 
 func (x *GetFileResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[15]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -862,11 +830,9 @@ type DeleteFileRequest struct {
 
 func (x *DeleteFileRequest) Reset() {
 	*x = DeleteFileRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[16]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteFileRequest) String() string {
@@ -877,7 +843,7 @@ func (*DeleteFileRequest) ProtoMessage() {}
 
 func (x *DeleteFileRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[16]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -907,11 +873,9 @@ type DeleteFileResponse struct {
 
 func (x *DeleteFileResponse) Reset() {
 	*x = DeleteFileResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_files_files_proto_msgTypes[17]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_files_files_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteFileResponse) String() string {
@@ -922,7 +886,7 @@ func (*DeleteFileResponse) ProtoMessage() {}
 
 func (x *DeleteFileResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_files_files_proto_msgTypes[17]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -937,6 +901,215 @@ func (*DeleteFileResponse) Descriptor() ([]byte, []int) {
 	return file_files_files_proto_rawDescGZIP(), []int{17}
 }
 
+type FileEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FileId string `protobuf:"bytes,1,opt,name=file_id,json=fileId,proto3" json:"file_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*FileEvent_Upload
+	//	*FileEvent_MoveUpload
+	//	*FileEvent_Delete
+	Event isFileEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *FileEvent) Reset() {
+	*x = FileEvent{}
+	mi := &file_files_files_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FileEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileEvent) ProtoMessage() {}
+
+func (x *FileEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_files_files_proto_msgTypes[18]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileEvent.ProtoReflect.Descriptor instead.
+func (*FileEvent) Descriptor() ([]byte, []int) {
+	return file_files_files_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *FileEvent) GetFileId() string {
+	if x != nil {
+		return x.FileId
+	}
+	return ""
+}
+
+func (m *FileEvent) GetEvent() isFileEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *FileEvent) GetUpload() *FileEvent_UploadEvent {
+	if x, ok := x.GetEvent().(*FileEvent_Upload); ok {
+		return x.Upload
+	}
+	return nil
+}
+
+func (x *FileEvent) GetMoveUpload() *FileEvent_MoveUploadEvent {
+	if x, ok := x.GetEvent().(*FileEvent_MoveUpload); ok {
+		return x.MoveUpload
+	}
+	return nil
+}
+
+func (x *FileEvent) GetDelete() *FileEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*FileEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+type isFileEvent_Event interface {
+	isFileEvent_Event()
+}
+
+type FileEvent_Upload struct {
+	Upload *FileEvent_UploadEvent `protobuf:"bytes,100,opt,name=upload,proto3,oneof"`
+}
+
+type FileEvent_MoveUpload struct {
+	MoveUpload *FileEvent_MoveUploadEvent `protobuf:"bytes,101,opt,name=move_upload,json=moveUpload,proto3,oneof"`
+}
+
+type FileEvent_Delete struct {
+	Delete *FileEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+func (*FileEvent_Upload) isFileEvent_Event() {}
+
+func (*FileEvent_MoveUpload) isFileEvent_Event() {}
+
+func (*FileEvent_Delete) isFileEvent_Event() {}
+
+type FileEvent_UploadEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *FileEvent_UploadEvent) Reset() {
+	*x = FileEvent_UploadEvent{}
+	mi := &file_files_files_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FileEvent_UploadEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileEvent_UploadEvent) ProtoMessage() {}
+
+func (x *FileEvent_UploadEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_files_files_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 FileEvent_UploadEvent.ProtoReflect.Descriptor instead.
+func (*FileEvent_UploadEvent) Descriptor() ([]byte, []int) {
+	return file_files_files_proto_rawDescGZIP(), []int{18, 0}
+}
+
+type FileEvent_MoveUploadEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *FileEvent_MoveUploadEvent) Reset() {
+	*x = FileEvent_MoveUploadEvent{}
+	mi := &file_files_files_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FileEvent_MoveUploadEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileEvent_MoveUploadEvent) ProtoMessage() {}
+
+func (x *FileEvent_MoveUploadEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_files_files_proto_msgTypes[20]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileEvent_MoveUploadEvent.ProtoReflect.Descriptor instead.
+func (*FileEvent_MoveUploadEvent) Descriptor() ([]byte, []int) {
+	return file_files_files_proto_rawDescGZIP(), []int{18, 1}
+}
+
+type FileEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *FileEvent_DeleteEvent) Reset() {
+	*x = FileEvent_DeleteEvent{}
+	mi := &file_files_files_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FileEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *FileEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_files_files_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 FileEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*FileEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_files_files_proto_rawDescGZIP(), []int{18, 2}
+}
+
 var File_files_files_proto protoreflect.FileDescriptor
 
 var file_files_files_proto_rawDesc = []byte{
@@ -1020,41 +1193,58 @@ var file_files_files_proto_rawDesc = []byte{
 	0x1f, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e,
 	0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65,
 	0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe0, 0x03, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73,
-	0x12, 0x46, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12,
-	0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c,
-	0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x66, 0x69, 0x6c,
-	0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70,
-	0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c,
-	0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61,
-	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73,
-	0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0b, 0x41, 0x62, 0x6f,
-	0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73,
-	0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x43, 0x0a,
-	0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x66, 0x69,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a,
+	0x06, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+	0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75,
+	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x70,
+	0x6c, 0x6f, 0x61, 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x69, 0x6c,
+	0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x6f, 0x76,
+	0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a,
+	0x6d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c,
+	0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x1a, 0x11, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xe0, 0x03, 0x0a,
+	0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55,
+	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x74,
+	0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1a, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70,
+	0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f,
+	0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64,
+	0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
+	0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x55,
+	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x42, 0x0a, 0x0b, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19,
+	0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61,
+	0x64, 0x12, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70,
+	0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x66, 0x69,
 	0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x4d, 0x6f,
-	0x76, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x37, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x66,
-	0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61,
-	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x07, 0x47,
-	0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47,
-	0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74,
-	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x66, 0x69, 0x6c, 0x65, 0x73, 0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x12, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61,
+	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73,
+	0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x15, 0x2e, 0x66,
+	0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x46,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a,
+	0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x69,
+	0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42,
+	0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70,
+	0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x3b, 0x66, 0x69, 0x6c, 0x65,
+	0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1069,27 +1259,31 @@ func file_files_files_proto_rawDescGZIP() []byte {
 	return file_files_files_proto_rawDescData
 }
 
-var file_files_files_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
+var file_files_files_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
 var file_files_files_proto_goTypes = []any{
-	(*File)(nil),                   // 0: files.File
-	(*MultipartUpload)(nil),        // 1: files.MultipartUpload
-	(*Upload)(nil),                 // 2: files.Upload
-	(*CompletedPart)(nil),          // 3: files.CompletedPart
-	(*StartUploadRequest)(nil),     // 4: files.StartUploadRequest
-	(*StartUploadResponse)(nil),    // 5: files.StartUploadResponse
-	(*CompleteUploadRequest)(nil),  // 6: files.CompleteUploadRequest
-	(*CompleteUploadResponse)(nil), // 7: files.CompleteUploadResponse
-	(*AbortUploadRequest)(nil),     // 8: files.AbortUploadRequest
-	(*AbortUploadResponse)(nil),    // 9: files.AbortUploadResponse
-	(*MoveUploadRequest)(nil),      // 10: files.MoveUploadRequest
-	(*MoveUploadResponse)(nil),     // 11: files.MoveUploadResponse
-	(*UploadRequest)(nil),          // 12: files.UploadRequest
-	(*UploadResponse)(nil),         // 13: files.UploadResponse
-	(*GetFileRequest)(nil),         // 14: files.GetFileRequest
-	(*GetFileResponse)(nil),        // 15: files.GetFileResponse
-	(*DeleteFileRequest)(nil),      // 16: files.DeleteFileRequest
-	(*DeleteFileResponse)(nil),     // 17: files.DeleteFileResponse
-	(*emptypb.Empty)(nil),          // 18: google.protobuf.Empty
+	(*File)(nil),                      // 0: files.File
+	(*MultipartUpload)(nil),           // 1: files.MultipartUpload
+	(*Upload)(nil),                    // 2: files.Upload
+	(*CompletedPart)(nil),             // 3: files.CompletedPart
+	(*StartUploadRequest)(nil),        // 4: files.StartUploadRequest
+	(*StartUploadResponse)(nil),       // 5: files.StartUploadResponse
+	(*CompleteUploadRequest)(nil),     // 6: files.CompleteUploadRequest
+	(*CompleteUploadResponse)(nil),    // 7: files.CompleteUploadResponse
+	(*AbortUploadRequest)(nil),        // 8: files.AbortUploadRequest
+	(*AbortUploadResponse)(nil),       // 9: files.AbortUploadResponse
+	(*MoveUploadRequest)(nil),         // 10: files.MoveUploadRequest
+	(*MoveUploadResponse)(nil),        // 11: files.MoveUploadResponse
+	(*UploadRequest)(nil),             // 12: files.UploadRequest
+	(*UploadResponse)(nil),            // 13: files.UploadResponse
+	(*GetFileRequest)(nil),            // 14: files.GetFileRequest
+	(*GetFileResponse)(nil),           // 15: files.GetFileResponse
+	(*DeleteFileRequest)(nil),         // 16: files.DeleteFileRequest
+	(*DeleteFileResponse)(nil),        // 17: files.DeleteFileResponse
+	(*FileEvent)(nil),                 // 18: files.FileEvent
+	(*FileEvent_UploadEvent)(nil),     // 19: files.FileEvent.UploadEvent
+	(*FileEvent_MoveUploadEvent)(nil), // 20: files.FileEvent.MoveUploadEvent
+	(*FileEvent_DeleteEvent)(nil),     // 21: files.FileEvent.DeleteEvent
+	(*emptypb.Empty)(nil),             // 22: google.protobuf.Empty
 }
 var file_files_files_proto_depIdxs = []int32{
 	0,  // 0: files.MultipartUpload.file:type_name -> files.File
@@ -1106,25 +1300,28 @@ var file_files_files_proto_depIdxs = []int32{
 	2,  // 11: files.UploadResponse.upload:type_name -> files.Upload
 	0,  // 12: files.GetFileResponse.file:type_name -> files.File
 	0,  // 13: files.DeleteFileRequest.file:type_name -> files.File
-	4,  // 14: files.Files.StartUpload:input_type -> files.StartUploadRequest
-	6,  // 15: files.Files.CompleteUpload:input_type -> files.CompleteUploadRequest
-	8,  // 16: files.Files.AbortUpload:input_type -> files.AbortUploadRequest
-	10, // 17: files.Files.MoveUpload:input_type -> files.MoveUploadRequest
-	12, // 18: files.Files.Upload:input_type -> files.UploadRequest
-	14, // 19: files.Files.GetFile:input_type -> files.GetFileRequest
-	16, // 20: files.Files.DeleteFile:input_type -> files.DeleteFileRequest
-	5,  // 21: files.Files.StartUpload:output_type -> files.StartUploadResponse
-	7,  // 22: files.Files.CompleteUpload:output_type -> files.CompleteUploadResponse
-	18, // 23: files.Files.AbortUpload:output_type -> google.protobuf.Empty
-	11, // 24: files.Files.MoveUpload:output_type -> files.MoveUploadResponse
-	13, // 25: files.Files.Upload:output_type -> files.UploadResponse
-	15, // 26: files.Files.GetFile:output_type -> files.GetFileResponse
-	18, // 27: files.Files.DeleteFile: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
+	19, // 14: files.FileEvent.upload:type_name -> files.FileEvent.UploadEvent
+	20, // 15: files.FileEvent.move_upload:type_name -> files.FileEvent.MoveUploadEvent
+	21, // 16: files.FileEvent.delete:type_name -> files.FileEvent.DeleteEvent
+	4,  // 17: files.Files.StartUpload:input_type -> files.StartUploadRequest
+	6,  // 18: files.Files.CompleteUpload:input_type -> files.CompleteUploadRequest
+	8,  // 19: files.Files.AbortUpload:input_type -> files.AbortUploadRequest
+	10, // 20: files.Files.MoveUpload:input_type -> files.MoveUploadRequest
+	12, // 21: files.Files.Upload:input_type -> files.UploadRequest
+	14, // 22: files.Files.GetFile:input_type -> files.GetFileRequest
+	16, // 23: files.Files.DeleteFile:input_type -> files.DeleteFileRequest
+	5,  // 24: files.Files.StartUpload:output_type -> files.StartUploadResponse
+	7,  // 25: files.Files.CompleteUpload:output_type -> files.CompleteUploadResponse
+	22, // 26: files.Files.AbortUpload:output_type -> google.protobuf.Empty
+	11, // 27: files.Files.MoveUpload:output_type -> files.MoveUploadResponse
+	13, // 28: files.Files.Upload:output_type -> files.UploadResponse
+	15, // 29: files.Files.GetFile:output_type -> files.GetFileResponse
+	22, // 30: files.Files.DeleteFile:output_type -> google.protobuf.Empty
+	24, // [24:31] is the sub-list for method output_type
+	17, // [17:24] is the sub-list for method input_type
+	17, // [17:17] is the sub-list for extension type_name
+	17, // [17:17] is the sub-list for extension extendee
+	0,  // [0:17] is the sub-list for field type_name
 }
 
 func init() { file_files_files_proto_init() }
@@ -1132,223 +1329,10 @@ func file_files_files_proto_init() {
 	if File_files_files_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_files_files_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*File); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*MultipartUpload); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*Upload); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*CompletedPart); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*StartUploadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*StartUploadResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*CompleteUploadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*CompleteUploadResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*AbortUploadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*AbortUploadResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*MoveUploadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*MoveUploadResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*UploadRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*UploadResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*GetFileRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[15].Exporter = func(v any, i int) any {
-			switch v := v.(*GetFileResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[16].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteFileRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_files_files_proto_msgTypes[17].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteFileResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_files_files_proto_msgTypes[18].OneofWrappers = []any{
+		(*FileEvent_Upload)(nil),
+		(*FileEvent_MoveUpload)(nil),
+		(*FileEvent_Delete)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -1356,7 +1340,7 @@ func file_files_files_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_files_files_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   18,
+			NumMessages:   22,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/files/files_grpc.pb.go b/proto/files/files_grpc.pb.go
index ae5d8c47..583e190b 100644
--- a/proto/files/files_grpc.pb.go
+++ b/proto/files/files_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: files/files.proto
 
 package files
diff --git a/proto/images/images.pb.go b/proto/images/images.pb.go
index e84dae61..7b763dda 100644
--- a/proto/images/images.pb.go
+++ b/proto/images/images.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: images/images.proto
 
 package images
@@ -32,11 +32,9 @@ type Param struct {
 
 func (x *Param) Reset() {
 	*x = Param{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_images_images_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_images_images_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Param) String() string {
@@ -47,7 +45,7 @@ func (*Param) ProtoMessage() {}
 
 func (x *Param) ProtoReflect() protoreflect.Message {
 	mi := &file_images_images_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -87,11 +85,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_images_images_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_images_images_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -102,7 +98,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_images_images_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -141,11 +137,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_images_images_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_images_images_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -156,7 +150,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_images_images_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -188,11 +182,9 @@ type GetRequest_GetOptions struct {
 
 func (x *GetRequest_GetOptions) Reset() {
 	*x = GetRequest_GetOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_images_images_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_images_images_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest_GetOptions) String() string {
@@ -203,7 +195,7 @@ func (*GetRequest_GetOptions) ProtoMessage() {}
 
 func (x *GetRequest_GetOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_images_images_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -296,56 +288,6 @@ func file_images_images_proto_init() {
 	if File_images_images_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_images_images_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Param); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_images_images_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_images_images_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_images_images_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest_GetOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/images/images_grpc.pb.go b/proto/images/images_grpc.pb.go
index 669dcc8e..7d26ae1b 100644
--- a/proto/images/images_grpc.pb.go
+++ b/proto/images/images_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: images/images.proto
 
 package images
diff --git a/proto/invitations/invitations.pb.go b/proto/invitations/invitations.pb.go
index 5fd81d66..afdab083 100644
--- a/proto/invitations/invitations.pb.go
+++ b/proto/invitations/invitations.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: invitations/invitations.proto
 
 package invitations
@@ -40,11 +40,9 @@ type Invitation struct {
 
 func (x *Invitation) Reset() {
 	*x = Invitation{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Invitation) String() string {
@@ -55,7 +53,7 @@ func (*Invitation) ProtoMessage() {}
 
 func (x *Invitation) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -141,11 +139,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -156,7 +152,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -225,11 +221,9 @@ type FindOptions struct {
 
 func (x *FindOptions) Reset() {
 	*x = FindOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindOptions) String() string {
@@ -240,7 +234,7 @@ func (*FindOptions) ProtoMessage() {}
 
 func (x *FindOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -286,11 +280,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -301,7 +293,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -333,11 +325,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -348,7 +338,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -380,11 +370,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -395,7 +383,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -427,11 +415,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -442,7 +428,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -478,11 +464,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -493,7 +477,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -551,11 +535,9 @@ type UpdateInvitationResponse struct {
 
 func (x *UpdateInvitationResponse) Reset() {
 	*x = UpdateInvitationResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateInvitationResponse) String() string {
@@ -566,7 +548,7 @@ func (*UpdateInvitationResponse) ProtoMessage() {}
 
 func (x *UpdateInvitationResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -592,11 +574,9 @@ type AcceptRequest struct {
 
 func (x *AcceptRequest) Reset() {
 	*x = AcceptRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AcceptRequest) String() string {
@@ -607,7 +587,7 @@ func (*AcceptRequest) ProtoMessage() {}
 
 func (x *AcceptRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -644,11 +624,9 @@ type AcceptInvitationResponse struct {
 
 func (x *AcceptInvitationResponse) Reset() {
 	*x = AcceptInvitationResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AcceptInvitationResponse) String() string {
@@ -659,7 +637,7 @@ func (*AcceptInvitationResponse) ProtoMessage() {}
 
 func (x *AcceptInvitationResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -685,11 +663,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -700,7 +676,7 @@ func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -740,11 +716,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -755,7 +729,7 @@ func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -794,11 +768,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -809,7 +781,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -839,11 +811,9 @@ type DeleteSpaceInvitationResponse struct {
 
 func (x *DeleteSpaceInvitationResponse) Reset() {
 	*x = DeleteSpaceInvitationResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_invitations_invitations_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_invitations_invitations_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteSpaceInvitationResponse) String() string {
@@ -854,7 +824,7 @@ func (*DeleteSpaceInvitationResponse) ProtoMessage() {}
 
 func (x *DeleteSpaceInvitationResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_invitations_invitations_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1076,188 +1046,6 @@ func file_invitations_invitations_proto_init() {
 	if File_invitations_invitations_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_invitations_invitations_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Invitation); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*FindOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateInvitationResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*AcceptRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*AcceptInvitationResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_invitations_invitations_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteSpaceInvitationResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/invitations/invitations_grpc.pb.go b/proto/invitations/invitations_grpc.pb.go
index 767261cb..2bcfb16e 100644
--- a/proto/invitations/invitations_grpc.pb.go
+++ b/proto/invitations/invitations_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: invitations/invitations.proto
 
 package invitations
diff --git a/proto/items/items.pb.go b/proto/items/items.pb.go
index a49876ec..b905fd6b 100644
--- a/proto/items/items.pb.go
+++ b/proto/items/items.pb.go
@@ -8,8 +8,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: items/items.proto
 
 package items
@@ -95,11 +95,9 @@ type Error struct {
 
 func (x *Error) Reset() {
 	*x = Error{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Error) String() string {
@@ -110,7 +108,7 @@ func (*Error) ProtoMessage() {}
 
 func (x *Error) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -149,11 +147,9 @@ type DecodeError struct {
 
 func (x *DecodeError) Reset() {
 	*x = DecodeError{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DecodeError) String() string {
@@ -164,7 +160,7 @@ func (*DecodeError) ProtoMessage() {}
 
 func (x *DecodeError) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -196,11 +192,9 @@ type ValidationError struct {
 
 func (x *ValidationError) Reset() {
 	*x = ValidationError{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ValidationError) String() string {
@@ -211,7 +205,7 @@ func (*ValidationError) ProtoMessage() {}
 
 func (x *ValidationError) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -243,11 +237,9 @@ type ModificationError struct {
 
 func (x *ModificationError) Reset() {
 	*x = ModificationError{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ModificationError) String() string {
@@ -258,7 +250,7 @@ func (*ModificationError) ProtoMessage() {}
 
 func (x *ModificationError) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -294,11 +286,9 @@ type Permissions struct {
 
 func (x *Permissions) Reset() {
 	*x = Permissions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Permissions) String() string {
@@ -309,7 +299,7 @@ func (*Permissions) ProtoMessage() {}
 
 func (x *Permissions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -406,11 +396,9 @@ type Item struct {
 
 func (x *Item) Reset() {
 	*x = Item{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Item) String() string {
@@ -421,7 +409,7 @@ func (*Item) ProtoMessage() {}
 
 func (x *Item) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -596,11 +584,9 @@ type EventCreate struct {
 
 func (x *EventCreate) Reset() {
 	*x = EventCreate{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EventCreate) String() string {
@@ -611,7 +597,7 @@ func (*EventCreate) ProtoMessage() {}
 
 func (x *EventCreate) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -667,11 +653,9 @@ type EventUpdate struct {
 
 func (x *EventUpdate) Reset() {
 	*x = EventUpdate{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EventUpdate) String() string {
@@ -682,7 +666,7 @@ func (*EventUpdate) ProtoMessage() {}
 
 func (x *EventUpdate) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -738,11 +722,9 @@ type EventPublish struct {
 
 func (x *EventPublish) Reset() {
 	*x = EventPublish{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EventPublish) String() string {
@@ -753,7 +735,7 @@ func (*EventPublish) ProtoMessage() {}
 
 func (x *EventPublish) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -809,11 +791,9 @@ type EventUnpublish struct {
 
 func (x *EventUnpublish) Reset() {
 	*x = EventUnpublish{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EventUnpublish) String() string {
@@ -824,7 +804,7 @@ func (*EventUnpublish) ProtoMessage() {}
 
 func (x *EventUnpublish) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -880,11 +860,9 @@ type EventDelete struct {
 
 func (x *EventDelete) Reset() {
 	*x = EventDelete{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *EventDelete) String() string {
@@ -895,7 +873,7 @@ func (*EventDelete) ProtoMessage() {}
 
 func (x *EventDelete) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -950,11 +928,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -965,7 +941,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1011,11 +987,9 @@ type CreateOptions struct {
 
 func (x *CreateOptions) Reset() {
 	*x = CreateOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateOptions) String() string {
@@ -1026,7 +1000,7 @@ func (*CreateOptions) ProtoMessage() {}
 
 func (x *CreateOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1066,11 +1040,9 @@ type FindOptions struct {
 
 func (x *FindOptions) Reset() {
 	*x = FindOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindOptions) String() string {
@@ -1081,7 +1053,7 @@ func (*FindOptions) ProtoMessage() {}
 
 func (x *FindOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1155,11 +1127,9 @@ type UpdateOptions struct {
 
 func (x *UpdateOptions) Reset() {
 	*x = UpdateOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateOptions) String() string {
@@ -1170,7 +1140,7 @@ func (*UpdateOptions) ProtoMessage() {}
 
 func (x *UpdateOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1205,11 +1175,9 @@ type GetPublishedOptions struct {
 
 func (x *GetPublishedOptions) Reset() {
 	*x = GetPublishedOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[15]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetPublishedOptions) String() string {
@@ -1220,7 +1188,7 @@ func (*GetPublishedOptions) ProtoMessage() {}
 
 func (x *GetPublishedOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[15]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1260,11 +1228,9 @@ type DeleteOptions struct {
 
 func (x *DeleteOptions) Reset() {
 	*x = DeleteOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[16]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteOptions) String() string {
@@ -1275,7 +1241,7 @@ func (*DeleteOptions) ProtoMessage() {}
 
 func (x *DeleteOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[16]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1314,11 +1280,9 @@ type UndeleteOptions struct {
 
 func (x *UndeleteOptions) Reset() {
 	*x = UndeleteOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[17]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UndeleteOptions) String() string {
@@ -1329,7 +1293,7 @@ func (*UndeleteOptions) ProtoMessage() {}
 
 func (x *UndeleteOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[17]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1361,11 +1325,9 @@ type PublishOptions struct {
 
 func (x *PublishOptions) Reset() {
 	*x = PublishOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[18]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *PublishOptions) String() string {
@@ -1376,7 +1338,7 @@ func (*PublishOptions) ProtoMessage() {}
 
 func (x *PublishOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[18]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1408,11 +1370,9 @@ type UnpublishOptions struct {
 
 func (x *UnpublishOptions) Reset() {
 	*x = UnpublishOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[19]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UnpublishOptions) String() string {
@@ -1423,7 +1383,7 @@ func (*UnpublishOptions) ProtoMessage() {}
 
 func (x *UnpublishOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[19]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1463,11 +1423,9 @@ type FindPublishedOptions struct {
 
 func (x *FindPublishedOptions) Reset() {
 	*x = FindPublishedOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[20]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindPublishedOptions) String() string {
@@ -1478,7 +1436,7 @@ func (*FindPublishedOptions) ProtoMessage() {}
 
 func (x *FindPublishedOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[20]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1547,11 +1505,9 @@ type FindArchivedOptions struct {
 
 func (x *FindArchivedOptions) Reset() {
 	*x = FindArchivedOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[21]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindArchivedOptions) String() string {
@@ -1562,7 +1518,7 @@ func (*FindArchivedOptions) ProtoMessage() {}
 
 func (x *FindArchivedOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[21]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1610,11 +1566,9 @@ type ListRevisionsOptions struct {
 
 func (x *ListRevisionsOptions) Reset() {
 	*x = ListRevisionsOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[22]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[22]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRevisionsOptions) String() string {
@@ -1625,7 +1579,7 @@ func (*ListRevisionsOptions) ProtoMessage() {}
 
 func (x *ListRevisionsOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[22]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1672,11 +1626,9 @@ type GetRevisionOptions struct {
 
 func (x *GetRevisionOptions) Reset() {
 	*x = GetRevisionOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[23]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[23]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRevisionOptions) String() string {
@@ -1687,7 +1639,7 @@ func (*GetRevisionOptions) ProtoMessage() {}
 
 func (x *GetRevisionOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[23]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1737,11 +1689,9 @@ type AggregateOptions struct {
 
 func (x *AggregateOptions) Reset() {
 	*x = AggregateOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[24]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[24]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateOptions) String() string {
@@ -1752,7 +1702,7 @@ func (*AggregateOptions) ProtoMessage() {}
 
 func (x *AggregateOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[24]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1784,11 +1734,9 @@ type AggregatePublishedOptions struct {
 
 func (x *AggregatePublishedOptions) Reset() {
 	*x = AggregatePublishedOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[25]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[25]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregatePublishedOptions) String() string {
@@ -1799,7 +1747,7 @@ func (*AggregatePublishedOptions) ProtoMessage() {}
 
 func (x *AggregatePublishedOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[25]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1832,11 +1780,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[26]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[26]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -1847,7 +1793,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[26]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1886,11 +1832,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[27]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[27]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -1901,7 +1845,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[27]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1933,11 +1877,9 @@ type IntrospectRequest struct {
 
 func (x *IntrospectRequest) Reset() {
 	*x = IntrospectRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[28]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[28]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *IntrospectRequest) String() string {
@@ -1948,7 +1890,7 @@ func (*IntrospectRequest) ProtoMessage() {}
 
 func (x *IntrospectRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[28]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1982,11 +1924,9 @@ type IntrospectResponse struct {
 
 func (x *IntrospectResponse) Reset() {
 	*x = IntrospectResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[29]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[29]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *IntrospectResponse) String() string {
@@ -1997,7 +1937,7 @@ func (*IntrospectResponse) ProtoMessage() {}
 
 func (x *IntrospectResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[29]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2044,11 +1984,9 @@ type GetOptions struct {
 
 func (x *GetOptions) Reset() {
 	*x = GetOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[30]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[30]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetOptions) String() string {
@@ -2059,7 +1997,7 @@ func (*GetOptions) ProtoMessage() {}
 
 func (x *GetOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[30]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2102,11 +2040,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[31]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[31]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -2117,7 +2053,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[31]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2177,11 +2113,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[32]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[32]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -2192,7 +2126,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[32]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2228,11 +2162,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[33]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[33]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -2243,7 +2175,7 @@ func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[33]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2304,11 +2236,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[34]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[34]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -2319,7 +2249,7 @@ func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[34]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2359,11 +2289,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[35]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[35]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -2374,7 +2302,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[35]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2414,11 +2342,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[36]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[36]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -2429,7 +2355,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[36]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2469,11 +2395,9 @@ type UndeleteRequest struct {
 
 func (x *UndeleteRequest) Reset() {
 	*x = UndeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[37]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[37]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UndeleteRequest) String() string {
@@ -2484,7 +2408,7 @@ func (*UndeleteRequest) ProtoMessage() {}
 
 func (x *UndeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[37]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2524,11 +2448,9 @@ type PublishRequest struct {
 
 func (x *PublishRequest) Reset() {
 	*x = PublishRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[38]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[38]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *PublishRequest) String() string {
@@ -2539,7 +2461,7 @@ func (*PublishRequest) ProtoMessage() {}
 
 func (x *PublishRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[38]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2579,11 +2501,9 @@ type UnpublishRequest struct {
 
 func (x *UnpublishRequest) Reset() {
 	*x = UnpublishRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[39]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[39]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UnpublishRequest) String() string {
@@ -2594,7 +2514,7 @@ func (*UnpublishRequest) ProtoMessage() {}
 
 func (x *UnpublishRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[39]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2637,11 +2557,9 @@ type GetPublishedRequest struct {
 
 func (x *GetPublishedRequest) Reset() {
 	*x = GetPublishedRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[40]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[40]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetPublishedRequest) String() string {
@@ -2652,7 +2570,7 @@ func (*GetPublishedRequest) ProtoMessage() {}
 
 func (x *GetPublishedRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[40]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2712,11 +2630,9 @@ type GetPublishedResponse struct {
 
 func (x *GetPublishedResponse) Reset() {
 	*x = GetPublishedResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[41]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetPublishedResponse) String() string {
@@ -2727,7 +2643,7 @@ func (*GetPublishedResponse) ProtoMessage() {}
 
 func (x *GetPublishedResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[41]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2763,11 +2679,9 @@ type FindPublishedRequest struct {
 
 func (x *FindPublishedRequest) Reset() {
 	*x = FindPublishedRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[42]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[42]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindPublishedRequest) String() string {
@@ -2778,7 +2692,7 @@ func (*FindPublishedRequest) ProtoMessage() {}
 
 func (x *FindPublishedRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[42]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2839,11 +2753,9 @@ type FindPublishedResponse struct {
 
 func (x *FindPublishedResponse) Reset() {
 	*x = FindPublishedResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[43]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[43]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindPublishedResponse) String() string {
@@ -2854,7 +2766,7 @@ func (*FindPublishedResponse) ProtoMessage() {}
 
 func (x *FindPublishedResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[43]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2897,11 +2809,9 @@ type AggregateRequest struct {
 
 func (x *AggregateRequest) Reset() {
 	*x = AggregateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[44]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[44]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateRequest) String() string {
@@ -2912,7 +2822,7 @@ func (*AggregateRequest) ProtoMessage() {}
 
 func (x *AggregateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[44]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -2974,11 +2884,9 @@ type AggregateResponse struct {
 
 func (x *AggregateResponse) Reset() {
 	*x = AggregateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[45]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[45]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregateResponse) String() string {
@@ -2989,7 +2897,7 @@ func (*AggregateResponse) ProtoMessage() {}
 
 func (x *AggregateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[45]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3025,11 +2933,9 @@ type AggregatePublishedRequest struct {
 
 func (x *AggregatePublishedRequest) Reset() {
 	*x = AggregatePublishedRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[46]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[46]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregatePublishedRequest) String() string {
@@ -3040,7 +2946,7 @@ func (*AggregatePublishedRequest) ProtoMessage() {}
 
 func (x *AggregatePublishedRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[46]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3100,11 +3006,9 @@ type AggregatePublishedResponse struct {
 
 func (x *AggregatePublishedResponse) Reset() {
 	*x = AggregatePublishedResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[47]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[47]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AggregatePublishedResponse) String() string {
@@ -3115,7 +3019,7 @@ func (*AggregatePublishedResponse) ProtoMessage() {}
 
 func (x *AggregatePublishedResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[47]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3152,11 +3056,9 @@ type GetRevisionRequest struct {
 
 func (x *GetRevisionRequest) Reset() {
 	*x = GetRevisionRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[48]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[48]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRevisionRequest) String() string {
@@ -3167,7 +3069,7 @@ func (*GetRevisionRequest) ProtoMessage() {}
 
 func (x *GetRevisionRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[48]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3234,11 +3136,9 @@ type GetRevisionResponse struct {
 
 func (x *GetRevisionResponse) Reset() {
 	*x = GetRevisionResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[49]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[49]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRevisionResponse) String() string {
@@ -3249,7 +3149,7 @@ func (*GetRevisionResponse) ProtoMessage() {}
 
 func (x *GetRevisionResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[49]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3285,11 +3185,9 @@ type ListRevisionsRequest struct {
 
 func (x *ListRevisionsRequest) Reset() {
 	*x = ListRevisionsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[50]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[50]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRevisionsRequest) String() string {
@@ -3300,7 +3198,7 @@ func (*ListRevisionsRequest) ProtoMessage() {}
 
 func (x *ListRevisionsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[50]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3360,11 +3258,9 @@ type ListRevisionsResponse struct {
 
 func (x *ListRevisionsResponse) Reset() {
 	*x = ListRevisionsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[51]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[51]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRevisionsResponse) String() string {
@@ -3375,7 +3271,7 @@ func (*ListRevisionsResponse) ProtoMessage() {}
 
 func (x *ListRevisionsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[51]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3409,11 +3305,9 @@ type ArchiveRequest struct {
 
 func (x *ArchiveRequest) Reset() {
 	*x = ArchiveRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[52]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[52]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ArchiveRequest) String() string {
@@ -3424,7 +3318,7 @@ func (*ArchiveRequest) ProtoMessage() {}
 
 func (x *ArchiveRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[52]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3456,11 +3350,9 @@ type UnarchiveRequest struct {
 
 func (x *UnarchiveRequest) Reset() {
 	*x = UnarchiveRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[53]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[53]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UnarchiveRequest) String() string {
@@ -3471,7 +3363,7 @@ func (*UnarchiveRequest) ProtoMessage() {}
 
 func (x *UnarchiveRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[53]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3507,11 +3399,9 @@ type FindArchivedRequest struct {
 
 func (x *FindArchivedRequest) Reset() {
 	*x = FindArchivedRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[54]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[54]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindArchivedRequest) String() string {
@@ -3522,7 +3412,7 @@ func (*FindArchivedRequest) ProtoMessage() {}
 
 func (x *FindArchivedRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[54]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3583,11 +3473,9 @@ type FindArchivedResponse struct {
 
 func (x *FindArchivedResponse) Reset() {
 	*x = FindArchivedResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[55]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_items_items_proto_msgTypes[55]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindArchivedResponse) String() string {
@@ -3598,7 +3486,7 @@ func (*FindArchivedResponse) ProtoMessage() {}
 
 func (x *FindArchivedResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_items_items_proto_msgTypes[55]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -3627,36 +3515,478 @@ func (x *FindArchivedResponse) GetTotal() int32 {
 	return 0
 }
 
-var File_items_items_proto protoreflect.FileDescriptor
+type ItemEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-var file_items_items_proto_rawDesc = []byte{
-	0x0a, 0x11, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
-	0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72,
-	0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63,
-	0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72,
-	0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69,
-	0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64,
-	0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
-	0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x3f, 0x0a,
-	0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72,
-	0x12, 0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x41,
-	0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72,
-	0x72, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
-	0x65, 0x6d, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x73, 0x22, 0x97, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	ItemId       string `protobuf:"bytes,4,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*ItemEvent_Create
+	//	*ItemEvent_Update
+	//	*ItemEvent_Delete
+	//	*ItemEvent_Publish
+	//	*ItemEvent_Unpublish
+	//	*ItemEvent_Archive
+	//	*ItemEvent_Unarchive
+	Event isItemEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *ItemEvent) Reset() {
+	*x = ItemEvent{}
+	mi := &file_items_items_proto_msgTypes[56]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent) ProtoMessage() {}
+
+func (x *ItemEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[56]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56}
+}
+
+func (x *ItemEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *ItemEvent) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+func (x *ItemEvent) GetCollectionId() string {
+	if x != nil {
+		return x.CollectionId
+	}
+	return ""
+}
+
+func (x *ItemEvent) GetItemId() string {
+	if x != nil {
+		return x.ItemId
+	}
+	return ""
+}
+
+func (m *ItemEvent) GetEvent() isItemEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetCreate() *ItemEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetUpdate() *ItemEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetDelete() *ItemEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetPublish() *ItemEvent_PublishEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Publish); ok {
+		return x.Publish
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetUnpublish() *ItemEvent_UnpublishEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Unpublish); ok {
+		return x.Unpublish
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetArchive() *ItemEvent_ArchiveEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Archive); ok {
+		return x.Archive
+	}
+	return nil
+}
+
+func (x *ItemEvent) GetUnarchive() *ItemEvent_UnarchiveEvent {
+	if x, ok := x.GetEvent().(*ItemEvent_Unarchive); ok {
+		return x.Unarchive
+	}
+	return nil
+}
+
+type isItemEvent_Event interface {
+	isItemEvent_Event()
+}
+
+type ItemEvent_Create struct {
+	Create *ItemEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type ItemEvent_Update struct {
+	Update *ItemEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type ItemEvent_Delete struct {
+	Delete *ItemEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+type ItemEvent_Publish struct {
+	Publish *ItemEvent_PublishEvent `protobuf:"bytes,103,opt,name=publish,proto3,oneof"`
+}
+
+type ItemEvent_Unpublish struct {
+	Unpublish *ItemEvent_UnpublishEvent `protobuf:"bytes,104,opt,name=unpublish,proto3,oneof"`
+}
+
+type ItemEvent_Archive struct {
+	Archive *ItemEvent_ArchiveEvent `protobuf:"bytes,105,opt,name=archive,proto3,oneof"`
+}
+
+type ItemEvent_Unarchive struct {
+	Unarchive *ItemEvent_UnarchiveEvent `protobuf:"bytes,106,opt,name=unarchive,proto3,oneof"`
+}
+
+func (*ItemEvent_Create) isItemEvent_Event() {}
+
+func (*ItemEvent_Update) isItemEvent_Event() {}
+
+func (*ItemEvent_Delete) isItemEvent_Event() {}
+
+func (*ItemEvent_Publish) isItemEvent_Event() {}
+
+func (*ItemEvent_Unpublish) isItemEvent_Event() {}
+
+func (*ItemEvent_Archive) isItemEvent_Event() {}
+
+func (*ItemEvent_Unarchive) isItemEvent_Event() {}
+
+type ItemEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_CreateEvent) Reset() {
+	*x = ItemEvent_CreateEvent{}
+	mi := &file_items_items_proto_msgTypes[60]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_CreateEvent) ProtoMessage() {}
+
+func (x *ItemEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[60]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 0}
+}
+
+type ItemEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ChangedFields []string `protobuf:"bytes,1,rep,name=changed_fields,json=changedFields,proto3" json:"changed_fields,omitempty"`
+}
+
+func (x *ItemEvent_UpdateEvent) Reset() {
+	*x = ItemEvent_UpdateEvent{}
+	mi := &file_items_items_proto_msgTypes[61]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *ItemEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[61]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 1}
+}
+
+func (x *ItemEvent_UpdateEvent) GetChangedFields() []string {
+	if x != nil {
+		return x.ChangedFields
+	}
+	return nil
+}
+
+type ItemEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_DeleteEvent) Reset() {
+	*x = ItemEvent_DeleteEvent{}
+	mi := &file_items_items_proto_msgTypes[62]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *ItemEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[62]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 2}
+}
+
+type ItemEvent_PublishEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_PublishEvent) Reset() {
+	*x = ItemEvent_PublishEvent{}
+	mi := &file_items_items_proto_msgTypes[63]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_PublishEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_PublishEvent) ProtoMessage() {}
+
+func (x *ItemEvent_PublishEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[63]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_PublishEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_PublishEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 3}
+}
+
+type ItemEvent_UnpublishEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_UnpublishEvent) Reset() {
+	*x = ItemEvent_UnpublishEvent{}
+	mi := &file_items_items_proto_msgTypes[64]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_UnpublishEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_UnpublishEvent) ProtoMessage() {}
+
+func (x *ItemEvent_UnpublishEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[64]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_UnpublishEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_UnpublishEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 4}
+}
+
+type ItemEvent_ArchiveEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_ArchiveEvent) Reset() {
+	*x = ItemEvent_ArchiveEvent{}
+	mi := &file_items_items_proto_msgTypes[65]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_ArchiveEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_ArchiveEvent) ProtoMessage() {}
+
+func (x *ItemEvent_ArchiveEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[65]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_ArchiveEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_ArchiveEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 5}
+}
+
+type ItemEvent_UnarchiveEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ItemEvent_UnarchiveEvent) Reset() {
+	*x = ItemEvent_UnarchiveEvent{}
+	mi := &file_items_items_proto_msgTypes[66]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ItemEvent_UnarchiveEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemEvent_UnarchiveEvent) ProtoMessage() {}
+
+func (x *ItemEvent_UnarchiveEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[66]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ItemEvent_UnarchiveEvent.ProtoReflect.Descriptor instead.
+func (*ItemEvent_UnarchiveEvent) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{56, 6}
+}
+
+var File_items_items_proto protoreflect.FileDescriptor
+
+var file_items_items_proto_rawDesc = []byte{
+	0x0a, 0x11, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+	0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63,
+	0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x37, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72,
+	0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69,
+	0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64,
+	0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
+	0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
+	0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x3f, 0x0a,
+	0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72,
+	0x12, 0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x41,
+	0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72,
+	0x72, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x22, 0x97, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
 	0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x64, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
 	0x04, 0x65, 0x64, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
 	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12,
@@ -4108,100 +4438,148 @@ var file_items_items_proto_rawDesc = []byte{
 	0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
 	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69,
 	0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x32, 0x93, 0x0b, 0x0a, 0x05, 0x49,
-	0x74, 0x65, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43,
-	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a,
-	0x0a, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72,
-	0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e,
-	0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12,
-	0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x55, 0x6e, 0x64,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
-	0x42, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69,
-	0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
-	0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x47,
-	0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50,
-	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75,
-	0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e,
-	0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x09, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74,
-	0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,
-	0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67,
-	0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65,
-	0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
-	0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
-	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x4c,
-	0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x07, 0x41, 0x72, 0x63,
-	0x68, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a,
-	0x0c, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x22, 0x2e,
+	0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf4, 0x05, 0x0a, 0x09, 0x49,
+	0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12,
+	0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c,
+	0x69, 0x73, 0x68, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x48, 0x00, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x47, 0x0a, 0x09, 0x75,
+	0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49,
+	0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69,
+	0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x70, 0x75, 0x62,
+	0x6c, 0x69, 0x73, 0x68, 0x12, 0x41, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18,
+	0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+	0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07,
+	0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x75, 0x6e, 0x61, 0x72, 0x63,
+	0x68, 0x69, 0x76, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+	0x1a, 0x0d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a,
+	0x34, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25,
+	0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x46,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0e, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x10, 0x0a, 0x0e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0e, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76,
+	0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x10, 0x0a, 0x0e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68,
+	0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e,
+	0x74, 0x32, 0x93, 0x0b, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65,
+	0x63, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74,
+	0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x46, 0x69, 0x6e,
+	0x64, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,
 	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69,
-	0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e, 0x61, 0x72,
-	0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52,
+	0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40,
+	0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
-	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3b, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x12, 0x44, 0x0a, 0x08, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e,
+	0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
+	0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a,
+	0x0d, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x23,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46,
+	0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65,
+	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x09, 0x41,
+	0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a,
+	0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x65, 0x64, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62,
+	0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67,
+	0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0b, 0x47, 0x65,
+	0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76,
+	0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74,
+	0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76,
+	0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x42, 0x0a, 0x07, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x72, 0x63, 0x68,
+	0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68,
+	0x69, 0x76, 0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63,
+	0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x46, 0x0a, 0x09, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x61,
+	0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70,
+	0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65,
+	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
 var (
@@ -4217,7 +4595,7 @@ func file_items_items_proto_rawDescGZIP() []byte {
 }
 
 var file_items_items_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_items_items_proto_msgTypes = make([]protoimpl.MessageInfo, 59)
+var file_items_items_proto_msgTypes = make([]protoimpl.MessageInfo, 67)
 var file_items_items_proto_goTypes = []any{
 	(Item_State)(0),                                // 0: content.items.Item.State
 	(*Error)(nil),                                  // 1: content.items.Error
@@ -4276,40 +4654,48 @@ var file_items_items_proto_goTypes = []any{
 	(*UnarchiveRequest)(nil),                       // 54: content.items.UnarchiveRequest
 	(*FindArchivedRequest)(nil),                    // 55: content.items.FindArchivedRequest
 	(*FindArchivedResponse)(nil),                   // 56: content.items.FindArchivedResponse
-	nil,                                            // 57: content.items.Item.TranslationsEntry
-	nil,                                            // 58: content.items.AggregateOptions.FieldsEntry
-	nil,                                            // 59: content.items.AggregatePublishedOptions.FieldsEntry
-	(*timestamppb.Timestamp)(nil),                  // 60: google.protobuf.Timestamp
-	(*structpb.Struct)(nil),                        // 61: google.protobuf.Struct
-	(*common.Filter)(nil),                          // 62: common.Filter
-	(*common.FindOptions)(nil),                     // 63: common.FindOptions
-	(*common.Error_BadRequest_FieldViolation)(nil), // 64: common.Error.BadRequest.FieldViolation
-	(*emptypb.Empty)(nil),                          // 65: google.protobuf.Empty
+	(*ItemEvent)(nil),                              // 57: content.items.ItemEvent
+	nil,                                            // 58: content.items.Item.TranslationsEntry
+	nil,                                            // 59: content.items.AggregateOptions.FieldsEntry
+	nil,                                            // 60: content.items.AggregatePublishedOptions.FieldsEntry
+	(*ItemEvent_CreateEvent)(nil),                  // 61: content.items.ItemEvent.CreateEvent
+	(*ItemEvent_UpdateEvent)(nil),                  // 62: content.items.ItemEvent.UpdateEvent
+	(*ItemEvent_DeleteEvent)(nil),                  // 63: content.items.ItemEvent.DeleteEvent
+	(*ItemEvent_PublishEvent)(nil),                 // 64: content.items.ItemEvent.PublishEvent
+	(*ItemEvent_UnpublishEvent)(nil),               // 65: content.items.ItemEvent.UnpublishEvent
+	(*ItemEvent_ArchiveEvent)(nil),                 // 66: content.items.ItemEvent.ArchiveEvent
+	(*ItemEvent_UnarchiveEvent)(nil),               // 67: content.items.ItemEvent.UnarchiveEvent
+	(*timestamppb.Timestamp)(nil),                  // 68: google.protobuf.Timestamp
+	(*structpb.Struct)(nil),                        // 69: google.protobuf.Struct
+	(*common.Filter)(nil),                          // 70: common.Filter
+	(*common.FindOptions)(nil),                     // 71: common.FindOptions
+	(*common.Error_BadRequest_FieldViolation)(nil), // 72: common.Error.BadRequest.FieldViolation
+	(*emptypb.Empty)(nil),                          // 73: google.protobuf.Empty
 }
 var file_items_items_proto_depIdxs = []int32{
 	1,  // 0: content.items.DecodeError.errors:type_name -> content.items.Error
 	1,  // 1: content.items.ValidationError.errors:type_name -> content.items.Error
 	1,  // 2: content.items.ModificationError.errors:type_name -> content.items.Error
 	0,  // 3: content.items.Item.state:type_name -> content.items.Item.State
-	60, // 4: content.items.Item.created_rev_at:type_name -> google.protobuf.Timestamp
-	60, // 5: content.items.Item.created_at:type_name -> google.protobuf.Timestamp
-	60, // 6: content.items.Item.updated_at:type_name -> google.protobuf.Timestamp
-	61, // 7: content.items.Item.data:type_name -> google.protobuf.Struct
+	68, // 4: content.items.Item.created_rev_at:type_name -> google.protobuf.Timestamp
+	68, // 5: content.items.Item.created_at:type_name -> google.protobuf.Timestamp
+	68, // 6: content.items.Item.updated_at:type_name -> google.protobuf.Timestamp
+	69, // 7: content.items.Item.data:type_name -> google.protobuf.Struct
 	5,  // 8: content.items.Item.permissions:type_name -> content.items.Permissions
-	57, // 9: content.items.Item.translations:type_name -> content.items.Item.TranslationsEntry
-	62, // 10: content.items.Filter.data:type_name -> common.Filter
-	63, // 11: content.items.FindOptions.options:type_name -> common.FindOptions
-	63, // 12: content.items.FindPublishedOptions.options:type_name -> common.FindOptions
-	63, // 13: content.items.FindArchivedOptions.options:type_name -> common.FindOptions
-	63, // 14: content.items.ListRevisionsOptions.options:type_name -> common.FindOptions
-	58, // 15: content.items.AggregateOptions.fields:type_name -> content.items.AggregateOptions.FieldsEntry
-	59, // 16: content.items.AggregatePublishedOptions.fields:type_name -> content.items.AggregatePublishedOptions.FieldsEntry
+	58, // 9: content.items.Item.translations:type_name -> content.items.Item.TranslationsEntry
+	70, // 10: content.items.Filter.data:type_name -> common.Filter
+	71, // 11: content.items.FindOptions.options:type_name -> common.FindOptions
+	71, // 12: content.items.FindPublishedOptions.options:type_name -> common.FindOptions
+	71, // 13: content.items.FindArchivedOptions.options:type_name -> common.FindOptions
+	71, // 14: content.items.ListRevisionsOptions.options:type_name -> common.FindOptions
+	59, // 15: content.items.AggregateOptions.fields:type_name -> content.items.AggregateOptions.FieldsEntry
+	60, // 16: content.items.AggregatePublishedOptions.fields:type_name -> content.items.AggregatePublishedOptions.FieldsEntry
 	6,  // 17: content.items.CreateRequest.item:type_name -> content.items.Item
 	13, // 18: content.items.CreateRequest.options:type_name -> content.items.CreateOptions
 	6,  // 19: content.items.CreateResponse.created:type_name -> content.items.Item
 	6,  // 20: content.items.IntrospectRequest.item:type_name -> content.items.Item
 	6,  // 21: content.items.IntrospectResponse.item:type_name -> content.items.Item
-	64, // 22: content.items.IntrospectResponse.validation_errors:type_name -> common.Error.BadRequest.FieldViolation
+	72, // 22: content.items.IntrospectResponse.validation_errors:type_name -> common.Error.BadRequest.FieldViolation
 	31, // 23: content.items.GetRequest.options:type_name -> content.items.GetOptions
 	6,  // 24: content.items.GetResponse.item:type_name -> content.items.Item
 	12, // 25: content.items.FindRequest.filter:type_name -> content.items.Filter
@@ -4332,10 +4718,10 @@ var file_items_items_proto_depIdxs = []int32{
 	6,  // 42: content.items.FindPublishedResponse.items:type_name -> content.items.Item
 	12, // 43: content.items.AggregateRequest.filter:type_name -> content.items.Filter
 	25, // 44: content.items.AggregateRequest.options:type_name -> content.items.AggregateOptions
-	61, // 45: content.items.AggregateResponse.result:type_name -> google.protobuf.Struct
+	69, // 45: content.items.AggregateResponse.result:type_name -> google.protobuf.Struct
 	12, // 46: content.items.AggregatePublishedRequest.filter:type_name -> content.items.Filter
 	26, // 47: content.items.AggregatePublishedRequest.options:type_name -> content.items.AggregatePublishedOptions
-	61, // 48: content.items.AggregatePublishedResponse.result:type_name -> google.protobuf.Struct
+	69, // 48: content.items.AggregatePublishedResponse.result:type_name -> google.protobuf.Struct
 	24, // 49: content.items.GetRevisionRequest.options:type_name -> content.items.GetRevisionOptions
 	6,  // 50: content.items.GetRevisionResponse.item:type_name -> content.items.Item
 	23, // 51: content.items.ListRevisionsRequest.options:type_name -> content.items.ListRevisionsOptions
@@ -4345,48 +4731,55 @@ var file_items_items_proto_depIdxs = []int32{
 	12, // 55: content.items.FindArchivedRequest.filter:type_name -> content.items.Filter
 	22, // 56: content.items.FindArchivedRequest.options:type_name -> content.items.FindArchivedOptions
 	6,  // 57: content.items.FindArchivedResponse.items:type_name -> content.items.Item
-	61, // 58: content.items.Item.TranslationsEntry.value:type_name -> google.protobuf.Struct
-	27, // 59: content.items.Items.Create:input_type -> content.items.CreateRequest
-	29, // 60: content.items.Items.Introspect:input_type -> content.items.IntrospectRequest
-	32, // 61: content.items.Items.Get:input_type -> content.items.GetRequest
-	34, // 62: content.items.Items.Find:input_type -> content.items.FindRequest
-	36, // 63: content.items.Items.Update:input_type -> content.items.UpdateRequest
-	37, // 64: content.items.Items.Delete:input_type -> content.items.DeleteRequest
-	38, // 65: content.items.Items.Undelete:input_type -> content.items.UndeleteRequest
-	39, // 66: content.items.Items.Publish:input_type -> content.items.PublishRequest
-	40, // 67: content.items.Items.Unpublish:input_type -> content.items.UnpublishRequest
-	41, // 68: content.items.Items.GetPublished:input_type -> content.items.GetPublishedRequest
-	43, // 69: content.items.Items.FindPublished:input_type -> content.items.FindPublishedRequest
-	45, // 70: content.items.Items.Aggregate:input_type -> content.items.AggregateRequest
-	47, // 71: content.items.Items.AggregatePublished:input_type -> content.items.AggregatePublishedRequest
-	49, // 72: content.items.Items.GetRevision:input_type -> content.items.GetRevisionRequest
-	51, // 73: content.items.Items.ListRevisions:input_type -> content.items.ListRevisionsRequest
-	53, // 74: content.items.Items.Archive:input_type -> content.items.ArchiveRequest
-	55, // 75: content.items.Items.FindArchived:input_type -> content.items.FindArchivedRequest
-	54, // 76: content.items.Items.Unarchive:input_type -> content.items.UnarchiveRequest
-	28, // 77: content.items.Items.Create:output_type -> content.items.CreateResponse
-	30, // 78: content.items.Items.Introspect:output_type -> content.items.IntrospectResponse
-	33, // 79: content.items.Items.Get:output_type -> content.items.GetResponse
-	35, // 80: content.items.Items.Find:output_type -> content.items.FindResponse
-	65, // 81: content.items.Items.Update:output_type -> google.protobuf.Empty
-	65, // 82: content.items.Items.Delete:output_type -> google.protobuf.Empty
-	65, // 83: content.items.Items.Undelete:output_type -> google.protobuf.Empty
-	65, // 84: content.items.Items.Publish:output_type -> google.protobuf.Empty
-	65, // 85: content.items.Items.Unpublish:output_type -> google.protobuf.Empty
-	42, // 86: content.items.Items.GetPublished:output_type -> content.items.GetPublishedResponse
-	44, // 87: content.items.Items.FindPublished:output_type -> content.items.FindPublishedResponse
-	46, // 88: content.items.Items.Aggregate:output_type -> content.items.AggregateResponse
-	48, // 89: content.items.Items.AggregatePublished:output_type -> content.items.AggregatePublishedResponse
-	50, // 90: content.items.Items.GetRevision:output_type -> content.items.GetRevisionResponse
-	52, // 91: content.items.Items.ListRevisions:output_type -> content.items.ListRevisionsResponse
-	65, // 92: content.items.Items.Archive:output_type -> google.protobuf.Empty
-	56, // 93: content.items.Items.FindArchived:output_type -> content.items.FindArchivedResponse
-	65, // 94: content.items.Items.Unarchive:output_type -> google.protobuf.Empty
-	77, // [77:95] is the sub-list for method output_type
-	59, // [59:77] is the sub-list for method input_type
-	59, // [59:59] is the sub-list for extension type_name
-	59, // [59:59] is the sub-list for extension extendee
-	0,  // [0:59] is the sub-list for field type_name
+	61, // 58: content.items.ItemEvent.create:type_name -> content.items.ItemEvent.CreateEvent
+	62, // 59: content.items.ItemEvent.update:type_name -> content.items.ItemEvent.UpdateEvent
+	63, // 60: content.items.ItemEvent.delete:type_name -> content.items.ItemEvent.DeleteEvent
+	64, // 61: content.items.ItemEvent.publish:type_name -> content.items.ItemEvent.PublishEvent
+	65, // 62: content.items.ItemEvent.unpublish:type_name -> content.items.ItemEvent.UnpublishEvent
+	66, // 63: content.items.ItemEvent.archive:type_name -> content.items.ItemEvent.ArchiveEvent
+	67, // 64: content.items.ItemEvent.unarchive:type_name -> content.items.ItemEvent.UnarchiveEvent
+	69, // 65: content.items.Item.TranslationsEntry.value:type_name -> google.protobuf.Struct
+	27, // 66: content.items.Items.Create:input_type -> content.items.CreateRequest
+	29, // 67: content.items.Items.Introspect:input_type -> content.items.IntrospectRequest
+	32, // 68: content.items.Items.Get:input_type -> content.items.GetRequest
+	34, // 69: content.items.Items.Find:input_type -> content.items.FindRequest
+	36, // 70: content.items.Items.Update:input_type -> content.items.UpdateRequest
+	37, // 71: content.items.Items.Delete:input_type -> content.items.DeleteRequest
+	38, // 72: content.items.Items.Undelete:input_type -> content.items.UndeleteRequest
+	39, // 73: content.items.Items.Publish:input_type -> content.items.PublishRequest
+	40, // 74: content.items.Items.Unpublish:input_type -> content.items.UnpublishRequest
+	41, // 75: content.items.Items.GetPublished:input_type -> content.items.GetPublishedRequest
+	43, // 76: content.items.Items.FindPublished:input_type -> content.items.FindPublishedRequest
+	45, // 77: content.items.Items.Aggregate:input_type -> content.items.AggregateRequest
+	47, // 78: content.items.Items.AggregatePublished:input_type -> content.items.AggregatePublishedRequest
+	49, // 79: content.items.Items.GetRevision:input_type -> content.items.GetRevisionRequest
+	51, // 80: content.items.Items.ListRevisions:input_type -> content.items.ListRevisionsRequest
+	53, // 81: content.items.Items.Archive:input_type -> content.items.ArchiveRequest
+	55, // 82: content.items.Items.FindArchived:input_type -> content.items.FindArchivedRequest
+	54, // 83: content.items.Items.Unarchive:input_type -> content.items.UnarchiveRequest
+	28, // 84: content.items.Items.Create:output_type -> content.items.CreateResponse
+	30, // 85: content.items.Items.Introspect:output_type -> content.items.IntrospectResponse
+	33, // 86: content.items.Items.Get:output_type -> content.items.GetResponse
+	35, // 87: content.items.Items.Find:output_type -> content.items.FindResponse
+	73, // 88: content.items.Items.Update:output_type -> google.protobuf.Empty
+	73, // 89: content.items.Items.Delete:output_type -> google.protobuf.Empty
+	73, // 90: content.items.Items.Undelete:output_type -> google.protobuf.Empty
+	73, // 91: content.items.Items.Publish:output_type -> google.protobuf.Empty
+	73, // 92: content.items.Items.Unpublish:output_type -> google.protobuf.Empty
+	42, // 93: content.items.Items.GetPublished:output_type -> content.items.GetPublishedResponse
+	44, // 94: content.items.Items.FindPublished:output_type -> content.items.FindPublishedResponse
+	46, // 95: content.items.Items.Aggregate:output_type -> content.items.AggregateResponse
+	48, // 96: content.items.Items.AggregatePublished:output_type -> content.items.AggregatePublishedResponse
+	50, // 97: content.items.Items.GetRevision:output_type -> content.items.GetRevisionResponse
+	52, // 98: content.items.Items.ListRevisions:output_type -> content.items.ListRevisionsResponse
+	73, // 99: content.items.Items.Archive:output_type -> google.protobuf.Empty
+	56, // 100: content.items.Items.FindArchived:output_type -> content.items.FindArchivedResponse
+	73, // 101: content.items.Items.Unarchive:output_type -> google.protobuf.Empty
+	84, // [84:102] is the sub-list for method output_type
+	66, // [66:84] is the sub-list for method input_type
+	66, // [66:66] is the sub-list for extension type_name
+	66, // [66:66] is the sub-list for extension extendee
+	0,  // [0:66] is the sub-list for field type_name
 }
 
 func init() { file_items_items_proto_init() }
@@ -4394,679 +4787,14 @@ func file_items_items_proto_init() {
 	if File_items_items_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_items_items_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Error); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*DecodeError); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*ValidationError); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*ModificationError); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*Permissions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*Item); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*EventCreate); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*EventUpdate); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*EventPublish); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*EventUnpublish); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*EventDelete); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*FindOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[15].Exporter = func(v any, i int) any {
-			switch v := v.(*GetPublishedOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[16].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[17].Exporter = func(v any, i int) any {
-			switch v := v.(*UndeleteOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[18].Exporter = func(v any, i int) any {
-			switch v := v.(*PublishOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[19].Exporter = func(v any, i int) any {
-			switch v := v.(*UnpublishOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[20].Exporter = func(v any, i int) any {
-			switch v := v.(*FindPublishedOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[21].Exporter = func(v any, i int) any {
-			switch v := v.(*FindArchivedOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[22].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRevisionsOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[23].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRevisionOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[24].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[25].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregatePublishedOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[26].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[27].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[28].Exporter = func(v any, i int) any {
-			switch v := v.(*IntrospectRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[29].Exporter = func(v any, i int) any {
-			switch v := v.(*IntrospectResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[30].Exporter = func(v any, i int) any {
-			switch v := v.(*GetOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[31].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[32].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[33].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[34].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[35].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[36].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[37].Exporter = func(v any, i int) any {
-			switch v := v.(*UndeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[38].Exporter = func(v any, i int) any {
-			switch v := v.(*PublishRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[39].Exporter = func(v any, i int) any {
-			switch v := v.(*UnpublishRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[40].Exporter = func(v any, i int) any {
-			switch v := v.(*GetPublishedRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[41].Exporter = func(v any, i int) any {
-			switch v := v.(*GetPublishedResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[42].Exporter = func(v any, i int) any {
-			switch v := v.(*FindPublishedRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[43].Exporter = func(v any, i int) any {
-			switch v := v.(*FindPublishedResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[44].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[45].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[46].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregatePublishedRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[47].Exporter = func(v any, i int) any {
-			switch v := v.(*AggregatePublishedResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[48].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRevisionRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[49].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRevisionResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[50].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRevisionsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[51].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRevisionsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[52].Exporter = func(v any, i int) any {
-			switch v := v.(*ArchiveRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[53].Exporter = func(v any, i int) any {
-			switch v := v.(*UnarchiveRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[54].Exporter = func(v any, i int) any {
-			switch v := v.(*FindArchivedRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_items_items_proto_msgTypes[55].Exporter = func(v any, i int) any {
-			switch v := v.(*FindArchivedResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_items_items_proto_msgTypes[56].OneofWrappers = []any{
+		(*ItemEvent_Create)(nil),
+		(*ItemEvent_Update)(nil),
+		(*ItemEvent_Delete)(nil),
+		(*ItemEvent_Publish)(nil),
+		(*ItemEvent_Unpublish)(nil),
+		(*ItemEvent_Archive)(nil),
+		(*ItemEvent_Unarchive)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -5074,7 +4802,7 @@ func file_items_items_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_items_items_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   59,
+			NumMessages:   67,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/items/items_grpc.pb.go b/proto/items/items_grpc.pb.go
index 16b48642..db82008d 100644
--- a/proto/items/items_grpc.pb.go
+++ b/proto/items/items_grpc.pb.go
@@ -9,7 +9,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: items/items.proto
 
 package items
diff --git a/proto/locales/locales.pb.go b/proto/locales/locales.pb.go
index a1a301ae..3e923ee9 100644
--- a/proto/locales/locales.pb.go
+++ b/proto/locales/locales.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: locales/locales.proto
 
 package locales
@@ -40,11 +40,9 @@ type Locale struct {
 
 func (x *Locale) Reset() {
 	*x = Locale{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Locale) String() string {
@@ -55,7 +53,7 @@ func (*Locale) ProtoMessage() {}
 
 func (x *Locale) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -150,11 +148,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -165,7 +161,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -197,11 +193,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -212,7 +206,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -244,11 +238,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -259,7 +251,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -291,11 +283,9 @@ type ListRequest struct {
 
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRequest) String() string {
@@ -306,7 +296,7 @@ func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -338,11 +328,9 @@ type ListResponse struct {
 
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListResponse) String() string {
@@ -353,7 +341,7 @@ func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -386,11 +374,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_locales_locales_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_locales_locales_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -401,7 +387,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_locales_locales_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -430,6 +416,223 @@ func (x *DeleteRequest) GetSpaceId() string {
 	return ""
 }
 
+type LocaleEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	LocaleId string `protobuf:"bytes,1,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`
+	SpaceId  string `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*LocaleEvent_Create
+	//	*LocaleEvent_Update
+	//	*LocaleEvent_Delete
+	Event isLocaleEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *LocaleEvent) Reset() {
+	*x = LocaleEvent{}
+	mi := &file_locales_locales_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LocaleEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocaleEvent) ProtoMessage() {}
+
+func (x *LocaleEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_locales_locales_proto_msgTypes[7]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocaleEvent.ProtoReflect.Descriptor instead.
+func (*LocaleEvent) Descriptor() ([]byte, []int) {
+	return file_locales_locales_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *LocaleEvent) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *LocaleEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (m *LocaleEvent) GetEvent() isLocaleEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *LocaleEvent) GetCreate() *LocaleEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*LocaleEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *LocaleEvent) GetUpdate() *LocaleEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*LocaleEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *LocaleEvent) GetDelete() *LocaleEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*LocaleEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+type isLocaleEvent_Event interface {
+	isLocaleEvent_Event()
+}
+
+type LocaleEvent_Create struct {
+	Create *LocaleEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type LocaleEvent_Update struct {
+	Update *LocaleEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type LocaleEvent_Delete struct {
+	Delete *LocaleEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+func (*LocaleEvent_Create) isLocaleEvent_Event() {}
+
+func (*LocaleEvent_Update) isLocaleEvent_Event() {}
+
+func (*LocaleEvent_Delete) isLocaleEvent_Event() {}
+
+type LocaleEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *LocaleEvent_CreateEvent) Reset() {
+	*x = LocaleEvent_CreateEvent{}
+	mi := &file_locales_locales_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LocaleEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocaleEvent_CreateEvent) ProtoMessage() {}
+
+func (x *LocaleEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_locales_locales_proto_msgTypes[8]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocaleEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*LocaleEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_locales_locales_proto_rawDescGZIP(), []int{7, 0}
+}
+
+type LocaleEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *LocaleEvent_UpdateEvent) Reset() {
+	*x = LocaleEvent_UpdateEvent{}
+	mi := &file_locales_locales_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LocaleEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocaleEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *LocaleEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_locales_locales_proto_msgTypes[9]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocaleEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*LocaleEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_locales_locales_proto_rawDescGZIP(), []int{7, 1}
+}
+
+type LocaleEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *LocaleEvent_DeleteEvent) Reset() {
+	*x = LocaleEvent_DeleteEvent{}
+	mi := &file_locales_locales_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LocaleEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocaleEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *LocaleEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_locales_locales_proto_msgTypes[10]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocaleEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*LocaleEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_locales_locales_proto_rawDescGZIP(), []int{7, 2}
+}
+
 var File_locales_locales_proto protoreflect.FileDescriptor
 
 var file_locales_locales_proto_rawDesc = []byte{
@@ -477,29 +680,50 @@ var file_locales_locales_proto_rawDesc = []byte{
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
 	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49,
-	0x64, 0x32, 0xa5, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x12, 0x4b, 0x0a,
-	0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c,
-	0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45,
-	0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c,
-	0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12,
-	0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,
-	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74,
-	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x64, 0x22, 0xc7, 0x02, 0x0a, 0x0b, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x19,
+	0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x6f, 0x63, 0x61,
+	0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a,
+	0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e,
+	0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x12, 0x42, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61,
+	0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xa5, 0x02, 0x0a, 0x07,
+	0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61,
+	0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61,
+	0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73,
+	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+	0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x42, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e,
+	0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73,
+	0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,
+	0x73, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
 var (
@@ -514,35 +738,42 @@ func file_locales_locales_proto_rawDescGZIP() []byte {
 	return file_locales_locales_proto_rawDescData
 }
 
-var file_locales_locales_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_locales_locales_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
 var file_locales_locales_proto_goTypes = []any{
-	(*Locale)(nil),         // 0: content.locales.Locale
-	(*CreateRequest)(nil),  // 1: content.locales.CreateRequest
-	(*CreateResponse)(nil), // 2: content.locales.CreateResponse
-	(*UpdateRequest)(nil),  // 3: content.locales.UpdateRequest
-	(*ListRequest)(nil),    // 4: content.locales.ListRequest
-	(*ListResponse)(nil),   // 5: content.locales.ListResponse
-	(*DeleteRequest)(nil),  // 6: content.locales.DeleteRequest
-	(*emptypb.Empty)(nil),  // 7: google.protobuf.Empty
+	(*Locale)(nil),                  // 0: content.locales.Locale
+	(*CreateRequest)(nil),           // 1: content.locales.CreateRequest
+	(*CreateResponse)(nil),          // 2: content.locales.CreateResponse
+	(*UpdateRequest)(nil),           // 3: content.locales.UpdateRequest
+	(*ListRequest)(nil),             // 4: content.locales.ListRequest
+	(*ListResponse)(nil),            // 5: content.locales.ListResponse
+	(*DeleteRequest)(nil),           // 6: content.locales.DeleteRequest
+	(*LocaleEvent)(nil),             // 7: content.locales.LocaleEvent
+	(*LocaleEvent_CreateEvent)(nil), // 8: content.locales.LocaleEvent.CreateEvent
+	(*LocaleEvent_UpdateEvent)(nil), // 9: content.locales.LocaleEvent.UpdateEvent
+	(*LocaleEvent_DeleteEvent)(nil), // 10: content.locales.LocaleEvent.DeleteEvent
+	(*emptypb.Empty)(nil),           // 11: google.protobuf.Empty
 }
 var file_locales_locales_proto_depIdxs = []int32{
-	0, // 0: content.locales.CreateRequest.locale:type_name -> content.locales.Locale
-	0, // 1: content.locales.CreateResponse.locale:type_name -> content.locales.Locale
-	0, // 2: content.locales.UpdateRequest.locale:type_name -> content.locales.Locale
-	0, // 3: content.locales.ListResponse.locales:type_name -> content.locales.Locale
-	1, // 4: content.locales.Locales.Create:input_type -> content.locales.CreateRequest
-	3, // 5: content.locales.Locales.Update:input_type -> content.locales.UpdateRequest
-	4, // 6: content.locales.Locales.List:input_type -> content.locales.ListRequest
-	6, // 7: content.locales.Locales.Delete:input_type -> content.locales.DeleteRequest
-	2, // 8: content.locales.Locales.Create:output_type -> content.locales.CreateResponse
-	7, // 9: content.locales.Locales.Update:output_type -> google.protobuf.Empty
-	5, // 10: content.locales.Locales.List:output_type -> content.locales.ListResponse
-	7, // 11: content.locales.Locales.Delete:output_type -> google.protobuf.Empty
-	8, // [8:12] is the sub-list for method output_type
-	4, // [4:8] is the sub-list for method input_type
-	4, // [4:4] is the sub-list for extension type_name
-	4, // [4:4] is the sub-list for extension extendee
-	0, // [0:4] is the sub-list for field type_name
+	0,  // 0: content.locales.CreateRequest.locale:type_name -> content.locales.Locale
+	0,  // 1: content.locales.CreateResponse.locale:type_name -> content.locales.Locale
+	0,  // 2: content.locales.UpdateRequest.locale:type_name -> content.locales.Locale
+	0,  // 3: content.locales.ListResponse.locales:type_name -> content.locales.Locale
+	8,  // 4: content.locales.LocaleEvent.create:type_name -> content.locales.LocaleEvent.CreateEvent
+	9,  // 5: content.locales.LocaleEvent.update:type_name -> content.locales.LocaleEvent.UpdateEvent
+	10, // 6: content.locales.LocaleEvent.delete:type_name -> content.locales.LocaleEvent.DeleteEvent
+	1,  // 7: content.locales.Locales.Create:input_type -> content.locales.CreateRequest
+	3,  // 8: content.locales.Locales.Update:input_type -> content.locales.UpdateRequest
+	4,  // 9: content.locales.Locales.List:input_type -> content.locales.ListRequest
+	6,  // 10: content.locales.Locales.Delete:input_type -> content.locales.DeleteRequest
+	2,  // 11: content.locales.Locales.Create:output_type -> content.locales.CreateResponse
+	11, // 12: content.locales.Locales.Update:output_type -> google.protobuf.Empty
+	5,  // 13: content.locales.Locales.List:output_type -> content.locales.ListResponse
+	11, // 14: content.locales.Locales.Delete:output_type -> google.protobuf.Empty
+	11, // [11:15] is the sub-list for method output_type
+	7,  // [7:11] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
 }
 
 func init() { file_locales_locales_proto_init() }
@@ -550,91 +781,10 @@ func file_locales_locales_proto_init() {
 	if File_locales_locales_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_locales_locales_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Locale); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*ListResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_locales_locales_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_locales_locales_proto_msgTypes[7].OneofWrappers = []any{
+		(*LocaleEvent_Create)(nil),
+		(*LocaleEvent_Update)(nil),
+		(*LocaleEvent_Delete)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -642,7 +792,7 @@ func file_locales_locales_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_locales_locales_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   7,
+			NumMessages:   11,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/locales/locales_grpc.pb.go b/proto/locales/locales_grpc.pb.go
index 1e6d289f..d7a8509a 100644
--- a/proto/locales/locales_grpc.pb.go
+++ b/proto/locales/locales_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: locales/locales.proto
 
 package locales
diff --git a/proto/logs/log.pb.go b/proto/logs/log.pb.go
index deb2d4fc..0bdfd47e 100644
--- a/proto/logs/log.pb.go
+++ b/proto/logs/log.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: logs/log.proto
 
 package logs
@@ -152,11 +152,9 @@ type LogEntry struct {
 
 func (x *LogEntry) Reset() {
 	*x = LogEntry{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *LogEntry) String() string {
@@ -167,7 +165,7 @@ func (*LogEntry) ProtoMessage() {}
 
 func (x *LogEntry) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -346,20 +344,6 @@ func file_logs_log_proto_init() {
 	if File_logs_log_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_logs_log_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*LogEntry); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/logs/log_service.pb.go b/proto/logs/log_service.pb.go
index 114d5229..9e15beab 100644
--- a/proto/logs/log_service.pb.go
+++ b/proto/logs/log_service.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: logs/log_service.proto
 
 package logs
@@ -34,11 +34,9 @@ type LogRequest struct {
 
 func (x *LogRequest) Reset() {
 	*x = LogRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *LogRequest) String() string {
@@ -49,7 +47,7 @@ func (*LogRequest) ProtoMessage() {}
 
 func (x *LogRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -83,11 +81,9 @@ type LogResponse struct {
 
 func (x *LogResponse) Reset() {
 	*x = LogResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *LogResponse) String() string {
@@ -98,7 +94,7 @@ func (*LogResponse) ProtoMessage() {}
 
 func (x *LogResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -136,11 +132,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -151,7 +145,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -187,11 +181,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -202,7 +194,7 @@ func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -250,11 +242,9 @@ type FindResult struct {
 
 func (x *FindResult) Reset() {
 	*x = FindResult{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResult) String() string {
@@ -265,7 +255,7 @@ func (*FindResult) ProtoMessage() {}
 
 func (x *FindResult) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -323,11 +313,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -338,7 +326,7 @@ func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -404,11 +392,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -419,7 +405,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -453,11 +439,9 @@ type DeleteResponse struct {
 
 func (x *DeleteResponse) Reset() {
 	*x = DeleteResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_logs_log_service_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_logs_log_service_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteResponse) String() string {
@@ -468,7 +452,7 @@ func (*DeleteResponse) ProtoMessage() {}
 
 func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_logs_log_service_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -612,104 +596,6 @@ func file_logs_log_service_proto_init() {
 		return
 	}
 	file_logs_log_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_logs_log_service_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*LogRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*LogResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResult); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_logs_log_service_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	file_logs_log_service_proto_msgTypes[5].OneofWrappers = []any{
 		(*FindResponse_Result)(nil),
 		(*FindResponse_Error)(nil),
diff --git a/proto/logs/log_service_grpc.pb.go b/proto/logs/log_service_grpc.pb.go
index c8fd4bc4..723d8640 100644
--- a/proto/logs/log_service_grpc.pb.go
+++ b/proto/logs/log_service_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: logs/log_service.proto
 
 package logs
diff --git a/proto/members/members.pb.go b/proto/members/members.pb.go
index deb1ac55..3217ef13 100644
--- a/proto/members/members.pb.go
+++ b/proto/members/members.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: members/members.proto
 
 package members
@@ -87,11 +87,9 @@ type Member struct {
 
 func (x *Member) Reset() {
 	*x = Member{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Member) String() string {
@@ -102,7 +100,7 @@ func (*Member) ProtoMessage() {}
 
 func (x *Member) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -150,11 +148,9 @@ type SetRequest struct {
 
 func (x *SetRequest) Reset() {
 	*x = SetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *SetRequest) String() string {
@@ -165,7 +161,7 @@ func (*SetRequest) ProtoMessage() {}
 
 func (x *SetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -212,11 +208,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -227,7 +221,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -266,11 +260,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -281,7 +273,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -314,11 +306,9 @@ type RemoveRequest struct {
 
 func (x *RemoveRequest) Reset() {
 	*x = RemoveRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *RemoveRequest) String() string {
@@ -329,7 +319,7 @@ func (*RemoveRequest) ProtoMessage() {}
 
 func (x *RemoveRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -368,11 +358,9 @@ type ListMembersRequest struct {
 
 func (x *ListMembersRequest) Reset() {
 	*x = ListMembersRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListMembersRequest) String() string {
@@ -383,7 +371,7 @@ func (*ListMembersRequest) ProtoMessage() {}
 
 func (x *ListMembersRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -415,11 +403,9 @@ type ListMembersResponse struct {
 
 func (x *ListMembersResponse) Reset() {
 	*x = ListMembersResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListMembersResponse) String() string {
@@ -430,7 +416,7 @@ func (*ListMembersResponse) ProtoMessage() {}
 
 func (x *ListMembersResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -462,11 +448,9 @@ type ListOrganizationsRequest struct {
 
 func (x *ListOrganizationsRequest) Reset() {
 	*x = ListOrganizationsRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListOrganizationsRequest) String() string {
@@ -477,7 +461,7 @@ func (*ListOrganizationsRequest) ProtoMessage() {}
 
 func (x *ListOrganizationsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -509,11 +493,9 @@ type ListOrganizationsResponse struct {
 
 func (x *ListOrganizationsResponse) Reset() {
 	*x = ListOrganizationsResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListOrganizationsResponse) String() string {
@@ -524,7 +506,7 @@ func (*ListOrganizationsResponse) ProtoMessage() {}
 
 func (x *ListOrganizationsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -558,11 +540,9 @@ type OnCollaboratorSetRequest struct {
 
 func (x *OnCollaboratorSetRequest) Reset() {
 	*x = OnCollaboratorSetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *OnCollaboratorSetRequest) String() string {
@@ -573,7 +553,7 @@ func (*OnCollaboratorSetRequest) ProtoMessage() {}
 
 func (x *OnCollaboratorSetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -605,11 +585,9 @@ type OnCollaboratorSetResponse struct {
 
 func (x *OnCollaboratorSetResponse) Reset() {
 	*x = OnCollaboratorSetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_members_members_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_members_members_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *OnCollaboratorSetResponse) String() string {
@@ -620,7 +598,7 @@ func (*OnCollaboratorSetResponse) ProtoMessage() {}
 
 func (x *OnCollaboratorSetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_members_members_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -642,6 +620,181 @@ func (x *OnCollaboratorSetResponse) GetDelayedTaskId() string {
 	return ""
 }
 
+type MemberEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	OrgId  string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	Role   Role   `protobuf:"varint,3,opt,name=role,proto3,enum=account.members.Role" json:"role,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*MemberEvent_Set
+	//	*MemberEvent_Remove
+	Event isMemberEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *MemberEvent) Reset() {
+	*x = MemberEvent{}
+	mi := &file_members_members_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MemberEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MemberEvent) ProtoMessage() {}
+
+func (x *MemberEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_members_members_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 MemberEvent.ProtoReflect.Descriptor instead.
+func (*MemberEvent) Descriptor() ([]byte, []int) {
+	return file_members_members_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *MemberEvent) GetOrgId() string {
+	if x != nil {
+		return x.OrgId
+	}
+	return ""
+}
+
+func (x *MemberEvent) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+func (x *MemberEvent) GetRole() Role {
+	if x != nil {
+		return x.Role
+	}
+	return Role_NOT_MEMBER
+}
+
+func (m *MemberEvent) GetEvent() isMemberEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *MemberEvent) GetSet() *MemberEvent_SetEvent {
+	if x, ok := x.GetEvent().(*MemberEvent_Set); ok {
+		return x.Set
+	}
+	return nil
+}
+
+func (x *MemberEvent) GetRemove() *MemberEvent_RemoveEvent {
+	if x, ok := x.GetEvent().(*MemberEvent_Remove); ok {
+		return x.Remove
+	}
+	return nil
+}
+
+type isMemberEvent_Event interface {
+	isMemberEvent_Event()
+}
+
+type MemberEvent_Set struct {
+	Set *MemberEvent_SetEvent `protobuf:"bytes,100,opt,name=set,proto3,oneof"`
+}
+
+type MemberEvent_Remove struct {
+	Remove *MemberEvent_RemoveEvent `protobuf:"bytes,101,opt,name=remove,proto3,oneof"`
+}
+
+func (*MemberEvent_Set) isMemberEvent_Event() {}
+
+func (*MemberEvent_Remove) isMemberEvent_Event() {}
+
+type MemberEvent_SetEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *MemberEvent_SetEvent) Reset() {
+	*x = MemberEvent_SetEvent{}
+	mi := &file_members_members_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MemberEvent_SetEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MemberEvent_SetEvent) ProtoMessage() {}
+
+func (x *MemberEvent_SetEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_members_members_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 MemberEvent_SetEvent.ProtoReflect.Descriptor instead.
+func (*MemberEvent_SetEvent) Descriptor() ([]byte, []int) {
+	return file_members_members_proto_rawDescGZIP(), []int{11, 0}
+}
+
+type MemberEvent_RemoveEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *MemberEvent_RemoveEvent) Reset() {
+	*x = MemberEvent_RemoveEvent{}
+	mi := &file_members_members_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MemberEvent_RemoveEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MemberEvent_RemoveEvent) ProtoMessage() {}
+
+func (x *MemberEvent_RemoveEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_members_members_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 MemberEvent_RemoveEvent.ProtoReflect.Descriptor instead.
+func (*MemberEvent_RemoveEvent) Descriptor() ([]byte, []int) {
+	return file_members_members_proto_rawDescGZIP(), []int{11, 1}
+}
+
 var File_members_members_proto protoreflect.FileDescriptor
 
 var file_members_members_proto_rawDesc = []byte{
@@ -701,48 +854,64 @@ var file_members_members_proto_rawDesc = []byte{
 	0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f,
 	0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x54, 0x61,
-	0x73, 0x6b, 0x49, 0x64, 0x2a, 0x38, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x0a,
-	0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06,
-	0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x57, 0x4e, 0x45,
-	0x52, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x03, 0x32, 0x99,
-	0x03, 0x0a, 0x07, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x3c, 0x0a, 0x03, 0x53, 0x65,
-	0x74, 0x12, 0x1b, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62,
-	0x65, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,
+	0x73, 0x6b, 0x49, 0x64, 0x22, 0x8b, 0x02, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12,
+	0x39, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61,
+	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4d,
+	0x65, 0x6d, 0x62, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x72, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x0a,
+	0x0a, 0x08, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65,
+	0x6e, 0x74, 0x2a, 0x38, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f,
+	0x54, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45,
+	0x4d, 0x42, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10,
+	0x02, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x03, 0x32, 0x99, 0x03, 0x0a,
+	0x07, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x3c, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12,
 	0x1b, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
-	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61,
-	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x47,
-	0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06,
-	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
-	0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12,
-	0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
-	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d,
-	0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65,
-	0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11,
-	0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62,
-	0x65, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61,
-	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4c,
-	0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x78, 0x0a, 0x08, 0x4f, 0x62,
-	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x6c, 0x0a, 0x11, 0x4f, 0x6e, 0x43, 0x6f, 0x6c, 0x6c,
-	0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x63,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x6e,
-	0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
-	0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x61,
-	0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
-	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
-	0x72, 0x73, 0x3b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
+	0x73, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1b, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e,
+	0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x06, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d,
+	0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a,
+	0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x23, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e,
+	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x4c, 0x69,
+	0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x29, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x78, 0x0a, 0x08, 0x4f, 0x62, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x12, 0x6c, 0x0a, 0x11, 0x4f, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62,
+	0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x6e, 0x43, 0x6f,
+	0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6d,
+	0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f,
+	0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72,
+	0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d,
+	0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73,
+	0x3b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -758,7 +927,7 @@ func file_members_members_proto_rawDescGZIP() []byte {
 }
 
 var file_members_members_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_members_members_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
+var file_members_members_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
 var file_members_members_proto_goTypes = []any{
 	(Role)(0),                         // 0: account.members.Role
 	(*Member)(nil),                    // 1: account.members.Member
@@ -772,8 +941,11 @@ var file_members_members_proto_goTypes = []any{
 	(*ListOrganizationsResponse)(nil), // 9: account.members.ListOrganizationsResponse
 	(*OnCollaboratorSetRequest)(nil),  // 10: account.members.OnCollaboratorSetRequest
 	(*OnCollaboratorSetResponse)(nil), // 11: account.members.OnCollaboratorSetResponse
-	(*common.Collaborator)(nil),       // 12: common.Collaborator
-	(*emptypb.Empty)(nil),             // 13: google.protobuf.Empty
+	(*MemberEvent)(nil),               // 12: account.members.MemberEvent
+	(*MemberEvent_SetEvent)(nil),      // 13: account.members.MemberEvent.SetEvent
+	(*MemberEvent_RemoveEvent)(nil),   // 14: account.members.MemberEvent.RemoveEvent
+	(*common.Collaborator)(nil),       // 15: common.Collaborator
+	(*emptypb.Empty)(nil),             // 16: google.protobuf.Empty
 }
 var file_members_members_proto_depIdxs = []int32{
 	0,  // 0: account.members.Member.role:type_name -> account.members.Role
@@ -781,24 +953,27 @@ var file_members_members_proto_depIdxs = []int32{
 	0,  // 2: account.members.GetResponse.role:type_name -> account.members.Role
 	1,  // 3: account.members.ListMembersResponse.members:type_name -> account.members.Member
 	1,  // 4: account.members.ListOrganizationsResponse.organizations:type_name -> account.members.Member
-	12, // 5: account.members.OnCollaboratorSetRequest.collaborator:type_name -> common.Collaborator
-	2,  // 6: account.members.Members.Set:input_type -> account.members.SetRequest
-	3,  // 7: account.members.Members.Get:input_type -> account.members.GetRequest
-	5,  // 8: account.members.Members.Remove:input_type -> account.members.RemoveRequest
-	6,  // 9: account.members.Members.ListMembers:input_type -> account.members.ListMembersRequest
-	8,  // 10: account.members.Members.ListOrganizations:input_type -> account.members.ListOrganizationsRequest
-	10, // 11: account.members.Observer.OnCollaboratorSet:input_type -> account.members.OnCollaboratorSetRequest
-	13, // 12: account.members.Members.Set:output_type -> google.protobuf.Empty
-	4,  // 13: account.members.Members.Get:output_type -> account.members.GetResponse
-	13, // 14: account.members.Members.Remove:output_type -> google.protobuf.Empty
-	7,  // 15: account.members.Members.ListMembers:output_type -> account.members.ListMembersResponse
-	9,  // 16: account.members.Members.ListOrganizations:output_type -> account.members.ListOrganizationsResponse
-	11, // 17: account.members.Observer.OnCollaboratorSet:output_type -> account.members.OnCollaboratorSetResponse
-	12, // [12:18] is the sub-list for method output_type
-	6,  // [6:12] 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
+	15, // 5: account.members.OnCollaboratorSetRequest.collaborator:type_name -> common.Collaborator
+	0,  // 6: account.members.MemberEvent.role:type_name -> account.members.Role
+	13, // 7: account.members.MemberEvent.set:type_name -> account.members.MemberEvent.SetEvent
+	14, // 8: account.members.MemberEvent.remove:type_name -> account.members.MemberEvent.RemoveEvent
+	2,  // 9: account.members.Members.Set:input_type -> account.members.SetRequest
+	3,  // 10: account.members.Members.Get:input_type -> account.members.GetRequest
+	5,  // 11: account.members.Members.Remove:input_type -> account.members.RemoveRequest
+	6,  // 12: account.members.Members.ListMembers:input_type -> account.members.ListMembersRequest
+	8,  // 13: account.members.Members.ListOrganizations:input_type -> account.members.ListOrganizationsRequest
+	10, // 14: account.members.Observer.OnCollaboratorSet:input_type -> account.members.OnCollaboratorSetRequest
+	16, // 15: account.members.Members.Set:output_type -> google.protobuf.Empty
+	4,  // 16: account.members.Members.Get:output_type -> account.members.GetResponse
+	16, // 17: account.members.Members.Remove:output_type -> google.protobuf.Empty
+	7,  // 18: account.members.Members.ListMembers:output_type -> account.members.ListMembersResponse
+	9,  // 19: account.members.Members.ListOrganizations:output_type -> account.members.ListOrganizationsResponse
+	11, // 20: account.members.Observer.OnCollaboratorSet:output_type -> account.members.OnCollaboratorSetResponse
+	15, // [15:21] is the sub-list for method output_type
+	9,  // [9:15] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
 }
 
 func init() { file_members_members_proto_init() }
@@ -806,139 +981,9 @@ func file_members_members_proto_init() {
 	if File_members_members_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_members_members_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Member); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*SetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*RemoveRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*ListMembersRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*ListMembersResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*ListOrganizationsRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*ListOrganizationsResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*OnCollaboratorSetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_members_members_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*OnCollaboratorSetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_members_members_proto_msgTypes[11].OneofWrappers = []any{
+		(*MemberEvent_Set)(nil),
+		(*MemberEvent_Remove)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -946,7 +991,7 @@ func file_members_members_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_members_members_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   11,
+			NumMessages:   14,
 			NumExtensions: 0,
 			NumServices:   2,
 		},
diff --git a/proto/members/members_grpc.pb.go b/proto/members/members_grpc.pb.go
index 8b6677f4..61b93856 100644
--- a/proto/members/members_grpc.pb.go
+++ b/proto/members/members_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: members/members.proto
 
 package members
diff --git a/proto/organizations/organizations.pb.go b/proto/organizations/organizations.pb.go
index d2a220a1..25ca82e8 100644
--- a/proto/organizations/organizations.pb.go
+++ b/proto/organizations/organizations.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: organizations/organizations.proto
 
 package organizations
@@ -37,11 +37,9 @@ type Organization struct {
 
 func (x *Organization) Reset() {
 	*x = Organization{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Organization) String() string {
@@ -52,7 +50,7 @@ func (*Organization) ProtoMessage() {}
 
 func (x *Organization) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -112,11 +110,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -127,7 +123,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -159,11 +155,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -174,7 +168,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -201,16 +195,14 @@ type GetRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -221,7 +213,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -236,9 +228,9 @@ func (*GetRequest) Descriptor() ([]byte, []int) {
 	return file_organizations_organizations_proto_rawDescGZIP(), []int{3}
 }
 
-func (x *GetRequest) GetOrgId() string {
+func (x *GetRequest) GetId() string {
 	if x != nil {
-		return x.OrgId
+		return x.Id
 	}
 	return ""
 }
@@ -253,11 +245,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -268,7 +258,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -300,11 +290,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -315,7 +303,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -342,16 +330,14 @@ type DeleteRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -362,7 +348,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -377,9 +363,9 @@ func (*DeleteRequest) Descriptor() ([]byte, []int) {
 	return file_organizations_organizations_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *DeleteRequest) GetOrgId() string {
+func (x *DeleteRequest) GetId() string {
 	if x != nil {
-		return x.OrgId
+		return x.Id
 	}
 	return ""
 }
@@ -395,11 +381,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -410,7 +394,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -450,11 +434,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -465,7 +447,7 @@ func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -505,11 +487,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_organizations_organizations_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_organizations_organizations_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -520,7 +500,7 @@ func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_organizations_organizations_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -549,6 +529,215 @@ func (x *FindResponse) GetTotal() int64 {
 	return 0
 }
 
+type OrganizationEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*OrganizationEvent_Create
+	//	*OrganizationEvent_Update
+	//	*OrganizationEvent_Delete
+	Event isOrganizationEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *OrganizationEvent) Reset() {
+	*x = OrganizationEvent{}
+	mi := &file_organizations_organizations_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OrganizationEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrganizationEvent) ProtoMessage() {}
+
+func (x *OrganizationEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_organizations_organizations_proto_msgTypes[10]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OrganizationEvent.ProtoReflect.Descriptor instead.
+func (*OrganizationEvent) Descriptor() ([]byte, []int) {
+	return file_organizations_organizations_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *OrganizationEvent) GetOrgId() string {
+	if x != nil {
+		return x.OrgId
+	}
+	return ""
+}
+
+func (m *OrganizationEvent) GetEvent() isOrganizationEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *OrganizationEvent) GetCreate() *OrganizationEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*OrganizationEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *OrganizationEvent) GetUpdate() *OrganizationEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*OrganizationEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *OrganizationEvent) GetDelete() *OrganizationEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*OrganizationEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+type isOrganizationEvent_Event interface {
+	isOrganizationEvent_Event()
+}
+
+type OrganizationEvent_Create struct {
+	Create *OrganizationEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type OrganizationEvent_Update struct {
+	Update *OrganizationEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type OrganizationEvent_Delete struct {
+	Delete *OrganizationEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+func (*OrganizationEvent_Create) isOrganizationEvent_Event() {}
+
+func (*OrganizationEvent_Update) isOrganizationEvent_Event() {}
+
+func (*OrganizationEvent_Delete) isOrganizationEvent_Event() {}
+
+type OrganizationEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *OrganizationEvent_CreateEvent) Reset() {
+	*x = OrganizationEvent_CreateEvent{}
+	mi := &file_organizations_organizations_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OrganizationEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrganizationEvent_CreateEvent) ProtoMessage() {}
+
+func (x *OrganizationEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_organizations_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 OrganizationEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*OrganizationEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_organizations_organizations_proto_rawDescGZIP(), []int{10, 0}
+}
+
+type OrganizationEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *OrganizationEvent_UpdateEvent) Reset() {
+	*x = OrganizationEvent_UpdateEvent{}
+	mi := &file_organizations_organizations_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OrganizationEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrganizationEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *OrganizationEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_organizations_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 OrganizationEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*OrganizationEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_organizations_organizations_proto_rawDescGZIP(), []int{10, 1}
+}
+
+type OrganizationEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *OrganizationEvent_DeleteEvent) Reset() {
+	*x = OrganizationEvent_DeleteEvent{}
+	mi := &file_organizations_organizations_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OrganizationEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrganizationEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *OrganizationEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_organizations_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 OrganizationEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*OrganizationEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_organizations_organizations_proto_rawDescGZIP(), []int{10, 2}
+}
+
 var File_organizations_organizations_proto protoreflect.FileDescriptor
 
 var file_organizations_organizations_proto_rawDesc = []byte{
@@ -578,67 +767,87 @@ var file_organizations_organizations_proto_rawDesc = []byte{
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
 	0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f,
 	0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x64, 0x22, 0x23, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x0b, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
-	0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72,
-	0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6f, 0x72, 0x67, 0x22,
-	0x46, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x35, 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
-	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x03, 0x6f, 0x72, 0x67, 0x22, 0x26, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22,
-	0x30, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73,
-	0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e,
-	0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65,
-	0x73, 0x22, 0x6d, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x35, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1d, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e,
-	0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52,
-	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x04, 0x6f, 0x70, 0x74, 0x73, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46,
-	0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70, 0x74, 0x73,
-	0x22, 0x5d, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x37, 0x0a, 0x04, 0x6f, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23,
+	0x61, 0x74, 0x65, 0x64, 0x22, 0x1c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x22, 0x44, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x35, 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
+	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6f, 0x72, 0x67, 0x22, 0x46, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x6f, 0x72, 0x67,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f,
+	0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6f, 0x72, 0x67,
+	0x22, 0x1f, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+	0x64, 0x22, 0x30, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x69,
+	0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x14, 0x0a,
+	0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61,
+	0x6d, 0x65, 0x73, 0x22, 0x6d, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67,
+	0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x04, 0x6f, 0x70, 0x74,
+	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70,
+	0x74, 0x73, 0x22, 0x5d, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6f, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e,
+	0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6f, 0x72, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x22, 0xd0, 0x02, 0x0a, 0x11, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x4e,
+	0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34,
 	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
 	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6f, 0x72, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74,
-	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x32,
-	0x9f, 0x03, 0x0a, 0x0d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x12, 0x57, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x63,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x25, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61,
-	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x03, 0x47, 0x65,
-	0x74, 0x12, 0x21, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61,
-	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f,
-	0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x06, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f,
-	0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c,
-	0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61,
-	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e,
-	0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61,
-	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
-	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67,
-	0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x4e,
+	0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34,
+	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4e,
+	0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34,
+	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x0d,
+	0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a,
+	0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65,
+	0x76, 0x65, 0x6e, 0x74, 0x32, 0x9f, 0x03, 0x0a, 0x0d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x57, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e,
+	0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x4e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47,
+	0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x48, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x04, 0x46, 0x69, 0x6e,
+	0x64, 0x12, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x61,
+	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
+	0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69,
+	0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x06,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65,
+	0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72,
+	0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x72, 0x67,
+	0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x6f, 0x72, 0x67, 0x61, 0x6e,
+	0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -653,20 +862,24 @@ func file_organizations_organizations_proto_rawDescGZIP() []byte {
 	return file_organizations_organizations_proto_rawDescData
 }
 
-var file_organizations_organizations_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_organizations_organizations_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
 var file_organizations_organizations_proto_goTypes = []any{
-	(*Organization)(nil),       // 0: account.organizations.Organization
-	(*CreateRequest)(nil),      // 1: account.organizations.CreateRequest
-	(*CreateResponse)(nil),     // 2: account.organizations.CreateResponse
-	(*GetRequest)(nil),         // 3: account.organizations.GetRequest
-	(*GetResponse)(nil),        // 4: account.organizations.GetResponse
-	(*UpdateRequest)(nil),      // 5: account.organizations.UpdateRequest
-	(*DeleteRequest)(nil),      // 6: account.organizations.DeleteRequest
-	(*Filter)(nil),             // 7: account.organizations.Filter
-	(*FindRequest)(nil),        // 8: account.organizations.FindRequest
-	(*FindResponse)(nil),       // 9: account.organizations.FindResponse
-	(*common.FindOptions)(nil), // 10: common.FindOptions
-	(*emptypb.Empty)(nil),      // 11: google.protobuf.Empty
+	(*Organization)(nil),                  // 0: account.organizations.Organization
+	(*CreateRequest)(nil),                 // 1: account.organizations.CreateRequest
+	(*CreateResponse)(nil),                // 2: account.organizations.CreateResponse
+	(*GetRequest)(nil),                    // 3: account.organizations.GetRequest
+	(*GetResponse)(nil),                   // 4: account.organizations.GetResponse
+	(*UpdateRequest)(nil),                 // 5: account.organizations.UpdateRequest
+	(*DeleteRequest)(nil),                 // 6: account.organizations.DeleteRequest
+	(*Filter)(nil),                        // 7: account.organizations.Filter
+	(*FindRequest)(nil),                   // 8: account.organizations.FindRequest
+	(*FindResponse)(nil),                  // 9: account.organizations.FindResponse
+	(*OrganizationEvent)(nil),             // 10: account.organizations.OrganizationEvent
+	(*OrganizationEvent_CreateEvent)(nil), // 11: account.organizations.OrganizationEvent.CreateEvent
+	(*OrganizationEvent_UpdateEvent)(nil), // 12: account.organizations.OrganizationEvent.UpdateEvent
+	(*OrganizationEvent_DeleteEvent)(nil), // 13: account.organizations.OrganizationEvent.DeleteEvent
+	(*common.FindOptions)(nil),            // 14: common.FindOptions
+	(*emptypb.Empty)(nil),                 // 15: google.protobuf.Empty
 }
 var file_organizations_organizations_proto_depIdxs = []int32{
 	0,  // 0: account.organizations.CreateRequest.org:type_name -> account.organizations.Organization
@@ -674,23 +887,26 @@ var file_organizations_organizations_proto_depIdxs = []int32{
 	0,  // 2: account.organizations.GetResponse.org:type_name -> account.organizations.Organization
 	0,  // 3: account.organizations.UpdateRequest.org:type_name -> account.organizations.Organization
 	7,  // 4: account.organizations.FindRequest.filter:type_name -> account.organizations.Filter
-	10, // 5: account.organizations.FindRequest.opts:type_name -> common.FindOptions
+	14, // 5: account.organizations.FindRequest.opts:type_name -> common.FindOptions
 	0,  // 6: account.organizations.FindResponse.orgs:type_name -> account.organizations.Organization
-	1,  // 7: account.organizations.Organizations.Create:input_type -> account.organizations.CreateRequest
-	3,  // 8: account.organizations.Organizations.Get:input_type -> account.organizations.GetRequest
-	6,  // 9: account.organizations.Organizations.Delete:input_type -> account.organizations.DeleteRequest
-	8,  // 10: account.organizations.Organizations.Find:input_type -> account.organizations.FindRequest
-	5,  // 11: account.organizations.Organizations.Update:input_type -> account.organizations.UpdateRequest
-	2,  // 12: account.organizations.Organizations.Create:output_type -> account.organizations.CreateResponse
-	4,  // 13: account.organizations.Organizations.Get:output_type -> account.organizations.GetResponse
-	11, // 14: account.organizations.Organizations.Delete:output_type -> google.protobuf.Empty
-	9,  // 15: account.organizations.Organizations.Find:output_type -> account.organizations.FindResponse
-	11, // 16: account.organizations.Organizations.Update:output_type -> google.protobuf.Empty
-	12, // [12:17] is the sub-list for method output_type
-	7,  // [7:12] is the sub-list for method input_type
-	7,  // [7:7] is the sub-list for extension type_name
-	7,  // [7:7] is the sub-list for extension extendee
-	0,  // [0:7] is the sub-list for field type_name
+	11, // 7: account.organizations.OrganizationEvent.create:type_name -> account.organizations.OrganizationEvent.CreateEvent
+	12, // 8: account.organizations.OrganizationEvent.update:type_name -> account.organizations.OrganizationEvent.UpdateEvent
+	13, // 9: account.organizations.OrganizationEvent.delete:type_name -> account.organizations.OrganizationEvent.DeleteEvent
+	1,  // 10: account.organizations.Organizations.Create:input_type -> account.organizations.CreateRequest
+	3,  // 11: account.organizations.Organizations.Get:input_type -> account.organizations.GetRequest
+	6,  // 12: account.organizations.Organizations.Delete:input_type -> account.organizations.DeleteRequest
+	8,  // 13: account.organizations.Organizations.Find:input_type -> account.organizations.FindRequest
+	5,  // 14: account.organizations.Organizations.Update:input_type -> account.organizations.UpdateRequest
+	2,  // 15: account.organizations.Organizations.Create:output_type -> account.organizations.CreateResponse
+	4,  // 16: account.organizations.Organizations.Get:output_type -> account.organizations.GetResponse
+	15, // 17: account.organizations.Organizations.Delete:output_type -> google.protobuf.Empty
+	9,  // 18: account.organizations.Organizations.Find:output_type -> account.organizations.FindResponse
+	15, // 19: account.organizations.Organizations.Update:output_type -> google.protobuf.Empty
+	15, // [15:20] is the sub-list for method output_type
+	10, // [10:15] is the sub-list for method input_type
+	10, // [10:10] is the sub-list for extension type_name
+	10, // [10:10] is the sub-list for extension extendee
+	0,  // [0:10] is the sub-list for field type_name
 }
 
 func init() { file_organizations_organizations_proto_init() }
@@ -698,136 +914,19 @@ func file_organizations_organizations_proto_init() {
 	if File_organizations_organizations_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_organizations_organizations_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Organization); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_organizations_organizations_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	file_organizations_organizations_proto_msgTypes[0].OneofWrappers = []any{}
+	file_organizations_organizations_proto_msgTypes[10].OneofWrappers = []any{
+		(*OrganizationEvent_Create)(nil),
+		(*OrganizationEvent_Update)(nil),
+		(*OrganizationEvent_Delete)(nil),
+	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_organizations_organizations_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   10,
+			NumMessages:   14,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/organizations/organizations_grpc.pb.go b/proto/organizations/organizations_grpc.pb.go
index 09aa7525..f24f8f6e 100644
--- a/proto/organizations/organizations_grpc.pb.go
+++ b/proto/organizations/organizations_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: organizations/organizations.proto
 
 package organizations
diff --git a/proto/references/references.pb.go b/proto/references/references.pb.go
index 235312d9..51fefaea 100644
--- a/proto/references/references.pb.go
+++ b/proto/references/references.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: references/references.proto
 
 package references
@@ -33,11 +33,9 @@ type Reference struct {
 
 func (x *Reference) Reset() {
 	*x = Reference{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Reference) String() string {
@@ -48,7 +46,7 @@ func (*Reference) ProtoMessage() {}
 
 func (x *Reference) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -97,11 +95,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -112,7 +108,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -166,11 +162,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -181,7 +175,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -225,11 +219,9 @@ type PublishRequest struct {
 
 func (x *PublishRequest) Reset() {
 	*x = PublishRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *PublishRequest) String() string {
@@ -240,7 +232,7 @@ func (*PublishRequest) ProtoMessage() {}
 
 func (x *PublishRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -303,11 +295,9 @@ type PublishResponse struct {
 
 func (x *PublishResponse) Reset() {
 	*x = PublishResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *PublishResponse) String() string {
@@ -318,7 +308,7 @@ func (*PublishResponse) ProtoMessage() {}
 
 func (x *PublishResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -365,11 +355,9 @@ type GetOptions struct {
 
 func (x *GetOptions) Reset() {
 	*x = GetOptions{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_references_references_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_references_references_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetOptions) String() string {
@@ -380,7 +368,7 @@ func (*GetOptions) ProtoMessage() {}
 
 func (x *GetOptions) ProtoReflect() protoreflect.Message {
 	mi := &file_references_references_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -535,80 +523,6 @@ func file_references_references_proto_init() {
 	if File_references_references_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_references_references_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Reference); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_references_references_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_references_references_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_references_references_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*PublishRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_references_references_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*PublishResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_references_references_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*GetOptions); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/references/references_grpc.pb.go b/proto/references/references_grpc.pb.go
index f6b37c16..889c4e7c 100644
--- a/proto/references/references_grpc.pb.go
+++ b/proto/references/references_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: references/references.proto
 
 package references
diff --git a/proto/roles/roles.pb.go b/proto/roles/roles.pb.go
index 380ce70f..24576243 100644
--- a/proto/roles/roles.pb.go
+++ b/proto/roles/roles.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: roles/roles.proto
 
 package roles
@@ -50,11 +50,9 @@ type Role struct {
 
 func (x *Role) Reset() {
 	*x = Role{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Role) String() string {
@@ -65,7 +63,7 @@ func (*Role) ProtoMessage() {}
 
 func (x *Role) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -132,11 +130,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -147,7 +143,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -179,11 +175,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -194,7 +188,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -222,16 +216,14 @@ type GetRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	RoleId  string `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -242,7 +234,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -264,9 +256,9 @@ func (x *GetRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *GetRequest) GetRoleId() string {
+func (x *GetRequest) GetId() string {
 	if x != nil {
-		return x.RoleId
+		return x.Id
 	}
 	return ""
 }
@@ -281,11 +273,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -296,7 +286,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -328,11 +318,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -343,7 +331,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -375,11 +363,9 @@ type ListRequest struct {
 
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRequest) String() string {
@@ -390,7 +376,7 @@ func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -422,11 +408,9 @@ type ListResponse struct {
 
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListResponse) String() string {
@@ -437,7 +421,7 @@ func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -465,16 +449,14 @@ type DeleteRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	RoleId  string `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	Id      string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_roles_roles_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_roles_roles_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -485,7 +467,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_roles_roles_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -507,13 +489,230 @@ func (x *DeleteRequest) GetSpaceId() string {
 	return ""
 }
 
-func (x *DeleteRequest) GetRoleId() string {
+func (x *DeleteRequest) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+type RoleEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	RoleId  string `protobuf:"bytes,1,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	SpaceId string `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*RoleEvent_Create
+	//	*RoleEvent_Update
+	//	*RoleEvent_Delete
+	Event isRoleEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *RoleEvent) Reset() {
+	*x = RoleEvent{}
+	mi := &file_roles_roles_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RoleEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RoleEvent) ProtoMessage() {}
+
+func (x *RoleEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_roles_roles_proto_msgTypes[9]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RoleEvent.ProtoReflect.Descriptor instead.
+func (*RoleEvent) Descriptor() ([]byte, []int) {
+	return file_roles_roles_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *RoleEvent) GetRoleId() string {
 	if x != nil {
 		return x.RoleId
 	}
 	return ""
 }
 
+func (x *RoleEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (m *RoleEvent) GetEvent() isRoleEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *RoleEvent) GetCreate() *RoleEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*RoleEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *RoleEvent) GetUpdate() *RoleEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*RoleEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *RoleEvent) GetDelete() *RoleEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*RoleEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+type isRoleEvent_Event interface {
+	isRoleEvent_Event()
+}
+
+type RoleEvent_Create struct {
+	Create *RoleEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type RoleEvent_Update struct {
+	Update *RoleEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type RoleEvent_Delete struct {
+	Delete *RoleEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+func (*RoleEvent_Create) isRoleEvent_Event() {}
+
+func (*RoleEvent_Update) isRoleEvent_Event() {}
+
+func (*RoleEvent_Delete) isRoleEvent_Event() {}
+
+type RoleEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RoleEvent_CreateEvent) Reset() {
+	*x = RoleEvent_CreateEvent{}
+	mi := &file_roles_roles_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RoleEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RoleEvent_CreateEvent) ProtoMessage() {}
+
+func (x *RoleEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_roles_roles_proto_msgTypes[10]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RoleEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*RoleEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_roles_roles_proto_rawDescGZIP(), []int{9, 0}
+}
+
+type RoleEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RoleEvent_UpdateEvent) Reset() {
+	*x = RoleEvent_UpdateEvent{}
+	mi := &file_roles_roles_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RoleEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RoleEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *RoleEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_roles_roles_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 RoleEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*RoleEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_roles_roles_proto_rawDescGZIP(), []int{9, 1}
+}
+
+type RoleEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RoleEvent_DeleteEvent) Reset() {
+	*x = RoleEvent_DeleteEvent{}
+	mi := &file_roles_roles_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RoleEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RoleEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *RoleEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_roles_roles_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 RoleEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*RoleEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_roles_roles_proto_rawDescGZIP(), []int{9, 2}
+}
+
 var File_roles_roles_proto protoreflect.FileDescriptor
 
 var file_roles_roles_proto_rawDesc = []byte{
@@ -542,54 +741,72 @@ var file_roles_roles_proto_rawDesc = []byte{
 	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x72, 0x65,
 	0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e,
 	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52,
-	0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52,
+	0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x37, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
 	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49,
-	0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x0b, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x6f, 0x6c,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f,
-	0x6c, 0x65, 0x22, 0x38, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65,
-	0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x28, 0x0a, 0x0b,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18,
-	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65,
-	0x73, 0x22, 0x43, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+	0x64, 0x22, 0x36, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x27, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52,
+	0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x38, 0x0a, 0x0d, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x6f,
+	0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72,
+	0x6f, 0x6c, 0x65, 0x22, 0x28, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
 	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a,
-	0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x32, 0xd7, 0x02, 0x0a, 0x05, 0x52, 0x6f, 0x6c, 0x65, 0x73,
-	0x12, 0x47, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74,
-	0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73,
-	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x55, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f,
-	0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x4c,
-	0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f,
-	0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40,
-	0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
-	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x72, 0x6f, 0x6c,
-	0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x39, 0x0a,
+	0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
+	0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c,
+	0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x02, 0x69, 0x64, 0x22, 0xb5, 0x02, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xd7, 0x02, 0x0a,
+	0x05, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73,
+	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65,
+	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x40, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x41, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65,
+	0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72,
+	0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x6c,
+	0x65, 0x73, 0x3b, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -604,42 +821,49 @@ func file_roles_roles_proto_rawDescGZIP() []byte {
 	return file_roles_roles_proto_rawDescData
 }
 
-var file_roles_roles_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_roles_roles_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
 var file_roles_roles_proto_goTypes = []any{
-	(*Role)(nil),           // 0: content.roles.Role
-	(*CreateRequest)(nil),  // 1: content.roles.CreateRequest
-	(*CreateResponse)(nil), // 2: content.roles.CreateResponse
-	(*GetRequest)(nil),     // 3: content.roles.GetRequest
-	(*GetResponse)(nil),    // 4: content.roles.GetResponse
-	(*UpdateRequest)(nil),  // 5: content.roles.UpdateRequest
-	(*ListRequest)(nil),    // 6: content.roles.ListRequest
-	(*ListResponse)(nil),   // 7: content.roles.ListResponse
-	(*DeleteRequest)(nil),  // 8: content.roles.DeleteRequest
-	(*common.Rule)(nil),    // 9: common.Rule
-	(*emptypb.Empty)(nil),  // 10: google.protobuf.Empty
+	(*Role)(nil),                  // 0: content.roles.Role
+	(*CreateRequest)(nil),         // 1: content.roles.CreateRequest
+	(*CreateResponse)(nil),        // 2: content.roles.CreateResponse
+	(*GetRequest)(nil),            // 3: content.roles.GetRequest
+	(*GetResponse)(nil),           // 4: content.roles.GetResponse
+	(*UpdateRequest)(nil),         // 5: content.roles.UpdateRequest
+	(*ListRequest)(nil),           // 6: content.roles.ListRequest
+	(*ListResponse)(nil),          // 7: content.roles.ListResponse
+	(*DeleteRequest)(nil),         // 8: content.roles.DeleteRequest
+	(*RoleEvent)(nil),             // 9: content.roles.RoleEvent
+	(*RoleEvent_CreateEvent)(nil), // 10: content.roles.RoleEvent.CreateEvent
+	(*RoleEvent_UpdateEvent)(nil), // 11: content.roles.RoleEvent.UpdateEvent
+	(*RoleEvent_DeleteEvent)(nil), // 12: content.roles.RoleEvent.DeleteEvent
+	(*common.Rule)(nil),           // 13: common.Rule
+	(*emptypb.Empty)(nil),         // 14: google.protobuf.Empty
 }
 var file_roles_roles_proto_depIdxs = []int32{
-	9,  // 0: content.roles.Role.rules:type_name -> common.Rule
+	13, // 0: content.roles.Role.rules:type_name -> common.Rule
 	0,  // 1: content.roles.CreateRequest.role:type_name -> content.roles.Role
 	0,  // 2: content.roles.CreateResponse.created:type_name -> content.roles.Role
 	0,  // 3: content.roles.GetResponse.role:type_name -> content.roles.Role
 	0,  // 4: content.roles.UpdateRequest.role:type_name -> content.roles.Role
 	0,  // 5: content.roles.ListResponse.roles:type_name -> content.roles.Role
-	1,  // 6: content.roles.Roles.Create:input_type -> content.roles.CreateRequest
-	3,  // 7: content.roles.Roles.Get:input_type -> content.roles.GetRequest
-	5,  // 8: content.roles.Roles.Update:input_type -> content.roles.UpdateRequest
-	6,  // 9: content.roles.Roles.List:input_type -> content.roles.ListRequest
-	8,  // 10: content.roles.Roles.Delete:input_type -> content.roles.DeleteRequest
-	2,  // 11: content.roles.Roles.Create:output_type -> content.roles.CreateResponse
-	4,  // 12: content.roles.Roles.Get:output_type -> content.roles.GetResponse
-	10, // 13: content.roles.Roles.Update:output_type -> google.protobuf.Empty
-	7,  // 14: content.roles.Roles.List:output_type -> content.roles.ListResponse
-	10, // 15: content.roles.Roles.Delete:output_type -> google.protobuf.Empty
-	11, // [11:16] is the sub-list for method output_type
-	6,  // [6:11] 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
+	10, // 6: content.roles.RoleEvent.create:type_name -> content.roles.RoleEvent.CreateEvent
+	11, // 7: content.roles.RoleEvent.update:type_name -> content.roles.RoleEvent.UpdateEvent
+	12, // 8: content.roles.RoleEvent.delete:type_name -> content.roles.RoleEvent.DeleteEvent
+	1,  // 9: content.roles.Roles.Create:input_type -> content.roles.CreateRequest
+	3,  // 10: content.roles.Roles.Get:input_type -> content.roles.GetRequest
+	5,  // 11: content.roles.Roles.Update:input_type -> content.roles.UpdateRequest
+	6,  // 12: content.roles.Roles.List:input_type -> content.roles.ListRequest
+	8,  // 13: content.roles.Roles.Delete:input_type -> content.roles.DeleteRequest
+	2,  // 14: content.roles.Roles.Create:output_type -> content.roles.CreateResponse
+	4,  // 15: content.roles.Roles.Get:output_type -> content.roles.GetResponse
+	14, // 16: content.roles.Roles.Update:output_type -> google.protobuf.Empty
+	7,  // 17: content.roles.Roles.List:output_type -> content.roles.ListResponse
+	14, // 18: content.roles.Roles.Delete:output_type -> google.protobuf.Empty
+	14, // [14:19] is the sub-list for method output_type
+	9,  // [9:14] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
 }
 
 func init() { file_roles_roles_proto_init() }
@@ -647,115 +871,10 @@ func file_roles_roles_proto_init() {
 	if File_roles_roles_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_roles_roles_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Role); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*ListResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_roles_roles_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_roles_roles_proto_msgTypes[9].OneofWrappers = []any{
+		(*RoleEvent_Create)(nil),
+		(*RoleEvent_Update)(nil),
+		(*RoleEvent_Delete)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -763,7 +882,7 @@ func file_roles_roles_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_roles_roles_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   9,
+			NumMessages:   13,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/roles/roles_grpc.pb.go b/proto/roles/roles_grpc.pb.go
index e8228433..291af15a 100644
--- a/proto/roles/roles_grpc.pb.go
+++ b/proto/roles/roles_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: roles/roles.proto
 
 package roles
diff --git a/proto/spaces/spaces.pb.go b/proto/spaces/spaces.pb.go
index 32a78ef8..face9c37 100644
--- a/proto/spaces/spaces.pb.go
+++ b/proto/spaces/spaces.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: spaces/spaces.proto
 
 package spaces
@@ -105,11 +105,9 @@ type Space struct {
 
 func (x *Space) Reset() {
 	*x = Space{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Space) String() string {
@@ -120,7 +118,7 @@ func (*Space) ProtoMessage() {}
 
 func (x *Space) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -204,11 +202,9 @@ type StateInfo struct {
 
 func (x *StateInfo) Reset() {
 	*x = StateInfo{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *StateInfo) String() string {
@@ -219,7 +215,7 @@ func (*StateInfo) ProtoMessage() {}
 
 func (x *StateInfo) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -273,11 +269,9 @@ type Config struct {
 
 func (x *Config) Reset() {
 	*x = Config{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Config) String() string {
@@ -288,7 +282,7 @@ func (*Config) ProtoMessage() {}
 
 func (x *Config) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -320,11 +314,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -335,7 +327,7 @@ func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -367,11 +359,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -382,7 +372,7 @@ func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -414,11 +404,9 @@ type GetRequest struct {
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -429,7 +417,7 @@ func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -461,11 +449,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -476,7 +462,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -508,11 +494,9 @@ type ListRequest struct {
 
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListRequest) String() string {
@@ -523,7 +507,7 @@ func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -555,11 +539,9 @@ type ListResponse struct {
 
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListResponse) String() string {
@@ -570,7 +552,7 @@ func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -602,11 +584,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -617,7 +597,7 @@ func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -644,17 +624,15 @@ type UpdateConfigRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId string  `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	Config  *Config `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
+	Id     string  `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Config *Config `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
 }
 
 func (x *UpdateConfigRequest) Reset() {
 	*x = UpdateConfigRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateConfigRequest) String() string {
@@ -665,7 +643,7 @@ func (*UpdateConfigRequest) ProtoMessage() {}
 
 func (x *UpdateConfigRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -680,9 +658,9 @@ func (*UpdateConfigRequest) Descriptor() ([]byte, []int) {
 	return file_spaces_spaces_proto_rawDescGZIP(), []int{10}
 }
 
-func (x *UpdateConfigRequest) GetSpaceId() string {
+func (x *UpdateConfigRequest) GetId() string {
 	if x != nil {
-		return x.SpaceId
+		return x.Id
 	}
 	return ""
 }
@@ -699,16 +677,14 @@ type DeleteRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -719,7 +695,7 @@ func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -734,9 +710,9 @@ func (*DeleteRequest) Descriptor() ([]byte, []int) {
 	return file_spaces_spaces_proto_rawDescGZIP(), []int{11}
 }
 
-func (x *DeleteRequest) GetSpaceId() string {
+func (x *DeleteRequest) GetId() string {
 	if x != nil {
-		return x.SpaceId
+		return x.Id
 	}
 	return ""
 }
@@ -746,17 +722,15 @@ type TransferRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId       string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`                     // Идентификатор перемещаемого пространства
+	Id            string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                                              // Идентификатор перемещаемого пространства
 	TransferToOrg string `protobuf:"bytes,2,opt,name=transfer_to_org,json=transferToOrg,proto3" json:"transfer_to_org,omitempty"` // Идентификатор организации, в которую пространство должно быть перемещено
 }
 
 func (x *TransferRequest) Reset() {
 	*x = TransferRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[12]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *TransferRequest) String() string {
@@ -767,7 +741,7 @@ func (*TransferRequest) ProtoMessage() {}
 
 func (x *TransferRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[12]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -782,9 +756,9 @@ func (*TransferRequest) Descriptor() ([]byte, []int) {
 	return file_spaces_spaces_proto_rawDescGZIP(), []int{12}
 }
 
-func (x *TransferRequest) GetSpaceId() string {
+func (x *TransferRequest) GetId() string {
 	if x != nil {
-		return x.SpaceId
+		return x.Id
 	}
 	return ""
 }
@@ -801,16 +775,14 @@ type AbortTransferRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Идентификатор перемещаемого пространства
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Идентификатор перемещаемого пространства
 }
 
 func (x *AbortTransferRequest) Reset() {
 	*x = AbortTransferRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[13]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *AbortTransferRequest) String() string {
@@ -821,7 +793,7 @@ func (*AbortTransferRequest) ProtoMessage() {}
 
 func (x *AbortTransferRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[13]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -836,9 +808,9 @@ func (*AbortTransferRequest) Descriptor() ([]byte, []int) {
 	return file_spaces_spaces_proto_rawDescGZIP(), []int{13}
 }
 
-func (x *AbortTransferRequest) GetSpaceId() string {
+func (x *AbortTransferRequest) GetId() string {
 	if x != nil {
-		return x.SpaceId
+		return x.Id
 	}
 	return ""
 }
@@ -853,11 +825,9 @@ type ListTransfersRequest struct {
 
 func (x *ListTransfersRequest) Reset() {
 	*x = ListTransfersRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[14]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListTransfersRequest) String() string {
@@ -868,7 +838,7 @@ func (*ListTransfersRequest) ProtoMessage() {}
 
 func (x *ListTransfersRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[14]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -900,11 +870,9 @@ type ListTransfersResponse struct {
 
 func (x *ListTransfersResponse) Reset() {
 	*x = ListTransfersResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[15]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *ListTransfersResponse) String() string {
@@ -915,7 +883,7 @@ func (*ListTransfersResponse) ProtoMessage() {}
 
 func (x *ListTransfersResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[15]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -942,17 +910,15 @@ type MoveRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Идентификатор перемещаемого пространства
-	OrgId   string `protobuf:"bytes,2,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`       // Идентификатор организации, в которую пространство должно быть перемещено. Обязателен для заполнения только в случае запросов с системным уровнем доступа, в остальных случаях опционален
+	Id    string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                    // Идентификатор перемещаемого пространства
+	OrgId string `protobuf:"bytes,2,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` // Идентификатор организации, в которую пространство должно быть перемещено. Обязателен для заполнения только в случае запросов с системным уровнем доступа, в остальных случаях опционален
 }
 
 func (x *MoveRequest) Reset() {
 	*x = MoveRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[16]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *MoveRequest) String() string {
@@ -963,7 +929,7 @@ func (*MoveRequest) ProtoMessage() {}
 
 func (x *MoveRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[16]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -978,9 +944,9 @@ func (*MoveRequest) Descriptor() ([]byte, []int) {
 	return file_spaces_spaces_proto_rawDescGZIP(), []int{16}
 }
 
-func (x *MoveRequest) GetSpaceId() string {
+func (x *MoveRequest) GetId() string {
 	if x != nil {
-		return x.SpaceId
+		return x.Id
 	}
 	return ""
 }
@@ -1006,11 +972,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[17]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -1021,7 +985,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[17]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1084,11 +1048,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[18]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -1099,7 +1061,7 @@ func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[18]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1139,11 +1101,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[19]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_spaces_spaces_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -1154,7 +1114,7 @@ func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_spaces_spaces_proto_msgTypes[19]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -1183,6 +1143,357 @@ func (x *FindResponse) GetTotal() int32 {
 	return 0
 }
 
+// SpacesEvent описывает события сервиса Spaces, связанные с пространствами
+type SpaceEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Идентификатор пространства
+	SpaceId string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	// Идентификатор организации
+	OrgId string `protobuf:"bytes,2,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*SpaceEvent_Create
+	//	*SpaceEvent_Update
+	//	*SpaceEvent_Delete
+	//	*SpaceEvent_Move
+	//	*SpaceEvent_StateChange
+	Event isSpaceEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *SpaceEvent) Reset() {
+	*x = SpaceEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent) ProtoMessage() {}
+
+func (x *SpaceEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_proto_msgTypes[20]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SpaceEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *SpaceEvent) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *SpaceEvent) GetOrgId() string {
+	if x != nil {
+		return x.OrgId
+	}
+	return ""
+}
+
+func (m *SpaceEvent) GetEvent() isSpaceEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *SpaceEvent) GetCreate() *SpaceEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*SpaceEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *SpaceEvent) GetUpdate() *SpaceEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*SpaceEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *SpaceEvent) GetDelete() *SpaceEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*SpaceEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+func (x *SpaceEvent) GetMove() *SpaceEvent_MoveEvent {
+	if x, ok := x.GetEvent().(*SpaceEvent_Move); ok {
+		return x.Move
+	}
+	return nil
+}
+
+func (x *SpaceEvent) GetStateChange() *SpaceEvent_StateChangeEvent {
+	if x, ok := x.GetEvent().(*SpaceEvent_StateChange); ok {
+		return x.StateChange
+	}
+	return nil
+}
+
+type isSpaceEvent_Event interface {
+	isSpaceEvent_Event()
+}
+
+type SpaceEvent_Create struct {
+	Create *SpaceEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type SpaceEvent_Update struct {
+	Update *SpaceEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type SpaceEvent_Delete struct {
+	Delete *SpaceEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+type SpaceEvent_Move struct {
+	Move *SpaceEvent_MoveEvent `protobuf:"bytes,103,opt,name=move,proto3,oneof"`
+}
+
+type SpaceEvent_StateChange struct {
+	StateChange *SpaceEvent_StateChangeEvent `protobuf:"bytes,104,opt,name=state_change,json=stateChange,proto3,oneof"`
+}
+
+func (*SpaceEvent_Create) isSpaceEvent_Event() {}
+
+func (*SpaceEvent_Update) isSpaceEvent_Event() {}
+
+func (*SpaceEvent_Delete) isSpaceEvent_Event() {}
+
+func (*SpaceEvent_Move) isSpaceEvent_Event() {}
+
+func (*SpaceEvent_StateChange) isSpaceEvent_Event() {}
+
+// Событие создания пространства
+type SpaceEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SpaceEvent_CreateEvent) Reset() {
+	*x = SpaceEvent_CreateEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent_CreateEvent) ProtoMessage() {}
+
+func (x *SpaceEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_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 SpaceEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20, 0}
+}
+
+// Событие обновления пространства
+type SpaceEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SpaceEvent_UpdateEvent) Reset() {
+	*x = SpaceEvent_UpdateEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[22]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *SpaceEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_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 SpaceEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20, 1}
+}
+
+// Событие удаления пространства
+type SpaceEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SpaceEvent_DeleteEvent) Reset() {
+	*x = SpaceEvent_DeleteEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[23]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *SpaceEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_proto_msgTypes[23]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SpaceEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20, 2}
+}
+
+// Событие перемещения пространства между организациями
+type SpaceEvent_MoveEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PrevOrgId string `protobuf:"bytes,1,opt,name=prev_org_id,json=prevOrgId,proto3" json:"prev_org_id,omitempty"`
+}
+
+func (x *SpaceEvent_MoveEvent) Reset() {
+	*x = SpaceEvent_MoveEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[24]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent_MoveEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent_MoveEvent) ProtoMessage() {}
+
+func (x *SpaceEvent_MoveEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_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 SpaceEvent_MoveEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent_MoveEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20, 3}
+}
+
+func (x *SpaceEvent_MoveEvent) GetPrevOrgId() string {
+	if x != nil {
+		return x.PrevOrgId
+	}
+	return ""
+}
+
+// Событие изменения состояния пространства
+type SpaceEvent_StateChangeEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State *StateInfo `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
+	Prev  *StateInfo `protobuf:"bytes,2,opt,name=prev,proto3" json:"prev,omitempty"`
+}
+
+func (x *SpaceEvent_StateChangeEvent) Reset() {
+	*x = SpaceEvent_StateChangeEvent{}
+	mi := &file_spaces_spaces_proto_msgTypes[25]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SpaceEvent_StateChangeEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceEvent_StateChangeEvent) ProtoMessage() {}
+
+func (x *SpaceEvent_StateChangeEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_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 SpaceEvent_StateChangeEvent.ProtoReflect.Descriptor instead.
+func (*SpaceEvent_StateChangeEvent) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{20, 4}
+}
+
+func (x *SpaceEvent_StateChangeEvent) GetState() *StateInfo {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+func (x *SpaceEvent_StateChangeEvent) GetPrev() *StateInfo {
+	if x != nil {
+		return x.Prev
+	}
+	return nil
+}
+
 var File_spaces_spaces_proto protoreflect.FileDescriptor
 
 var file_spaces_spaces_proto_rawDesc = []byte{
@@ -1248,120 +1559,155 @@ var file_spaces_spaces_proto_rawDesc = []byte{
 	0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b,
 	0x0a, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
 	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
-	0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x13, 0x55,
+	0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x55, 0x0a, 0x13, 0x55,
 	0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a,
-	0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x43,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2a, 0x0a,
-	0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
-	0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x0f, 0x54, 0x72, 0x61,
-	0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73,
-	0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x22,
-	0x31, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66,
-	0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72,
-	0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49,
-	0x64, 0x22, 0x46, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65,
-	0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63,
-	0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x4d, 0x6f, 0x76,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x06, 0x46,
-	0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28,
-	0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18,
-	0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32,
-	0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a,
-	0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67,
-	0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72,
-	0x54, 0x6f, 0x4f, 0x72, 0x67, 0x22, 0x6c, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69,
-	0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46,
-	0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x22, 0x53, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x2a, 0x70, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07,
-	0x0a, 0x03, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59,
-	0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10,
-	0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45,
-	0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x49, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10,
-	0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12,
-	0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x07, 0x32, 0xab, 0x06, 0x0a, 0x06, 0x53,
-	0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12,
-	0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e,
+	0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x22, 0x1f, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x64, 0x22, 0x49, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
+	0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x22, 0x26,
+	0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15,
+	0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61,
+	0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d,
+	0x0a, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15,
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
-	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x43, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12,
+	0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x34, 0x0a,
+	0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06,
+	0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72,
+	0x67, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0e,
+	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15,
+	0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05,
+	0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
+	0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x22, 0x6c,
+	0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a,
+	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x46,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a,
+	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x53, 0x0a, 0x0c,
+	0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70,
+	0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x22, 0xe9, 0x04, 0x0a, 0x0a, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f,
+	0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67,
+	0x49, 0x64, 0x12, 0x40, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x64, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65,
+	0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04,
+	0x6d, 0x6f, 0x76, 0x65, 0x12, 0x50, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63,
+	0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x1a, 0x2b, 0x0a, 0x09, 0x4d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x72, 0x67, 0x49, 0x64,
+	0x1a, 0x72, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x70, 0x72, 0x65, 0x76, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04,
+	0x70, 0x72, 0x65, 0x76, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2a, 0x70, 0x0a,
+	0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
+	0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05,
+	0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41,
+	0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45,
+	0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x49, 0x47, 0x52, 0x41,
+	0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x07, 0x32,
+	0xab, 0x06, 0x0a, 0x06, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x06, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12,
 	0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x46, 0x69,
-	0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
-	0x4d, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
-	0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x04,
+	0x46, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x41, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66,
+	0x65, 0x72, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a,
+	0x0d, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x24,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71,
 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41,
-	0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x00, 0x12, 0x45, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x54,
-	0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0d, 0x41, 0x62, 0x6f, 0x72,
-	0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74,
-	0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x4c, 0x69, 0x73,
-	0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74,
-	0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x04, 0x4d, 0x6f, 0x76,
-	0x65, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e,
-	0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70,
-	0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5e,
+	0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12,
+	0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73,
+	0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d,
+	0x0a, 0x04, 0x4d, 0x6f, 0x76, 0x65, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x32, 0x5a,
+	0x30, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72,
+	0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1377,39 +1723,45 @@ func file_spaces_spaces_proto_rawDescGZIP() []byte {
 }
 
 var file_spaces_spaces_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_spaces_spaces_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
+var file_spaces_spaces_proto_msgTypes = make([]protoimpl.MessageInfo, 26)
 var file_spaces_spaces_proto_goTypes = []any{
-	(State)(0),                    // 0: content.spaces.State
-	(*Space)(nil),                 // 1: content.spaces.Space
-	(*StateInfo)(nil),             // 2: content.spaces.StateInfo
-	(*Config)(nil),                // 3: content.spaces.Config
-	(*CreateRequest)(nil),         // 4: content.spaces.CreateRequest
-	(*CreateResponse)(nil),        // 5: content.spaces.CreateResponse
-	(*GetRequest)(nil),            // 6: content.spaces.GetRequest
-	(*GetResponse)(nil),           // 7: content.spaces.GetResponse
-	(*ListRequest)(nil),           // 8: content.spaces.ListRequest
-	(*ListResponse)(nil),          // 9: content.spaces.ListResponse
-	(*UpdateRequest)(nil),         // 10: content.spaces.UpdateRequest
-	(*UpdateConfigRequest)(nil),   // 11: content.spaces.UpdateConfigRequest
-	(*DeleteRequest)(nil),         // 12: content.spaces.DeleteRequest
-	(*TransferRequest)(nil),       // 13: content.spaces.TransferRequest
-	(*AbortTransferRequest)(nil),  // 14: content.spaces.AbortTransferRequest
-	(*ListTransfersRequest)(nil),  // 15: content.spaces.ListTransfersRequest
-	(*ListTransfersResponse)(nil), // 16: content.spaces.ListTransfersResponse
-	(*MoveRequest)(nil),           // 17: content.spaces.MoveRequest
-	(*Filter)(nil),                // 18: content.spaces.Filter
-	(*FindRequest)(nil),           // 19: content.spaces.FindRequest
-	(*FindResponse)(nil),          // 20: content.spaces.FindResponse
-	(*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp
-	(*common.FindOptions)(nil),    // 22: common.FindOptions
-	(*emptypb.Empty)(nil),         // 23: google.protobuf.Empty
+	(State)(0),                          // 0: content.spaces.State
+	(*Space)(nil),                       // 1: content.spaces.Space
+	(*StateInfo)(nil),                   // 2: content.spaces.StateInfo
+	(*Config)(nil),                      // 3: content.spaces.Config
+	(*CreateRequest)(nil),               // 4: content.spaces.CreateRequest
+	(*CreateResponse)(nil),              // 5: content.spaces.CreateResponse
+	(*GetRequest)(nil),                  // 6: content.spaces.GetRequest
+	(*GetResponse)(nil),                 // 7: content.spaces.GetResponse
+	(*ListRequest)(nil),                 // 8: content.spaces.ListRequest
+	(*ListResponse)(nil),                // 9: content.spaces.ListResponse
+	(*UpdateRequest)(nil),               // 10: content.spaces.UpdateRequest
+	(*UpdateConfigRequest)(nil),         // 11: content.spaces.UpdateConfigRequest
+	(*DeleteRequest)(nil),               // 12: content.spaces.DeleteRequest
+	(*TransferRequest)(nil),             // 13: content.spaces.TransferRequest
+	(*AbortTransferRequest)(nil),        // 14: content.spaces.AbortTransferRequest
+	(*ListTransfersRequest)(nil),        // 15: content.spaces.ListTransfersRequest
+	(*ListTransfersResponse)(nil),       // 16: content.spaces.ListTransfersResponse
+	(*MoveRequest)(nil),                 // 17: content.spaces.MoveRequest
+	(*Filter)(nil),                      // 18: content.spaces.Filter
+	(*FindRequest)(nil),                 // 19: content.spaces.FindRequest
+	(*FindResponse)(nil),                // 20: content.spaces.FindResponse
+	(*SpaceEvent)(nil),                  // 21: content.spaces.SpaceEvent
+	(*SpaceEvent_CreateEvent)(nil),      // 22: content.spaces.SpaceEvent.CreateEvent
+	(*SpaceEvent_UpdateEvent)(nil),      // 23: content.spaces.SpaceEvent.UpdateEvent
+	(*SpaceEvent_DeleteEvent)(nil),      // 24: content.spaces.SpaceEvent.DeleteEvent
+	(*SpaceEvent_MoveEvent)(nil),        // 25: content.spaces.SpaceEvent.MoveEvent
+	(*SpaceEvent_StateChangeEvent)(nil), // 26: content.spaces.SpaceEvent.StateChangeEvent
+	(*timestamppb.Timestamp)(nil),       // 27: google.protobuf.Timestamp
+	(*common.FindOptions)(nil),          // 28: common.FindOptions
+	(*emptypb.Empty)(nil),               // 29: google.protobuf.Empty
 }
 var file_spaces_spaces_proto_depIdxs = []int32{
 	0,  // 0: content.spaces.Space.state:type_name -> content.spaces.State
 	3,  // 1: content.spaces.Space.config:type_name -> content.spaces.Config
 	2,  // 2: content.spaces.Space.state_info:type_name -> content.spaces.StateInfo
 	0,  // 3: content.spaces.StateInfo.state:type_name -> content.spaces.State
-	21, // 4: content.spaces.StateInfo.time:type_name -> google.protobuf.Timestamp
+	27, // 4: content.spaces.StateInfo.time:type_name -> google.protobuf.Timestamp
 	1,  // 5: content.spaces.CreateRequest.space:type_name -> content.spaces.Space
 	1,  // 6: content.spaces.CreateResponse.created:type_name -> content.spaces.Space
 	1,  // 7: content.spaces.GetResponse.space:type_name -> content.spaces.Space
@@ -1419,35 +1771,42 @@ var file_spaces_spaces_proto_depIdxs = []int32{
 	1,  // 11: content.spaces.ListTransfersResponse.spaces:type_name -> content.spaces.Space
 	0,  // 12: content.spaces.Filter.state:type_name -> content.spaces.State
 	18, // 13: content.spaces.FindRequest.filter:type_name -> content.spaces.Filter
-	22, // 14: content.spaces.FindRequest.options:type_name -> common.FindOptions
+	28, // 14: content.spaces.FindRequest.options:type_name -> common.FindOptions
 	1,  // 15: content.spaces.FindResponse.spaces:type_name -> content.spaces.Space
-	4,  // 16: content.spaces.Spaces.Create:input_type -> content.spaces.CreateRequest
-	6,  // 17: content.spaces.Spaces.Get:input_type -> content.spaces.GetRequest
-	8,  // 18: content.spaces.Spaces.List:input_type -> content.spaces.ListRequest
-	19, // 19: content.spaces.Spaces.Find:input_type -> content.spaces.FindRequest
-	10, // 20: content.spaces.Spaces.Update:input_type -> content.spaces.UpdateRequest
-	11, // 21: content.spaces.Spaces.UpdateConfig:input_type -> content.spaces.UpdateConfigRequest
-	12, // 22: content.spaces.Spaces.Delete:input_type -> content.spaces.DeleteRequest
-	13, // 23: content.spaces.Spaces.Transfer:input_type -> content.spaces.TransferRequest
-	14, // 24: content.spaces.Spaces.AbortTransfer:input_type -> content.spaces.AbortTransferRequest
-	15, // 25: content.spaces.Spaces.ListTransfers:input_type -> content.spaces.ListTransfersRequest
-	17, // 26: content.spaces.Spaces.Move:input_type -> content.spaces.MoveRequest
-	5,  // 27: content.spaces.Spaces.Create:output_type -> content.spaces.CreateResponse
-	7,  // 28: content.spaces.Spaces.Get:output_type -> content.spaces.GetResponse
-	9,  // 29: content.spaces.Spaces.List:output_type -> content.spaces.ListResponse
-	20, // 30: content.spaces.Spaces.Find:output_type -> content.spaces.FindResponse
-	23, // 31: content.spaces.Spaces.Update:output_type -> google.protobuf.Empty
-	23, // 32: content.spaces.Spaces.UpdateConfig:output_type -> google.protobuf.Empty
-	23, // 33: content.spaces.Spaces.Delete:output_type -> google.protobuf.Empty
-	23, // 34: content.spaces.Spaces.Transfer:output_type -> google.protobuf.Empty
-	23, // 35: content.spaces.Spaces.AbortTransfer:output_type -> google.protobuf.Empty
-	16, // 36: content.spaces.Spaces.ListTransfers:output_type -> content.spaces.ListTransfersResponse
-	23, // 37: content.spaces.Spaces.Move:output_type -> google.protobuf.Empty
-	27, // [27:38] is the sub-list for method output_type
-	16, // [16:27] is the sub-list for method input_type
-	16, // [16:16] is the sub-list for extension type_name
-	16, // [16:16] is the sub-list for extension extendee
-	0,  // [0:16] is the sub-list for field type_name
+	22, // 16: content.spaces.SpaceEvent.create:type_name -> content.spaces.SpaceEvent.CreateEvent
+	23, // 17: content.spaces.SpaceEvent.update:type_name -> content.spaces.SpaceEvent.UpdateEvent
+	24, // 18: content.spaces.SpaceEvent.delete:type_name -> content.spaces.SpaceEvent.DeleteEvent
+	25, // 19: content.spaces.SpaceEvent.move:type_name -> content.spaces.SpaceEvent.MoveEvent
+	26, // 20: content.spaces.SpaceEvent.state_change:type_name -> content.spaces.SpaceEvent.StateChangeEvent
+	2,  // 21: content.spaces.SpaceEvent.StateChangeEvent.state:type_name -> content.spaces.StateInfo
+	2,  // 22: content.spaces.SpaceEvent.StateChangeEvent.prev:type_name -> content.spaces.StateInfo
+	4,  // 23: content.spaces.Spaces.Create:input_type -> content.spaces.CreateRequest
+	6,  // 24: content.spaces.Spaces.Get:input_type -> content.spaces.GetRequest
+	8,  // 25: content.spaces.Spaces.List:input_type -> content.spaces.ListRequest
+	19, // 26: content.spaces.Spaces.Find:input_type -> content.spaces.FindRequest
+	10, // 27: content.spaces.Spaces.Update:input_type -> content.spaces.UpdateRequest
+	11, // 28: content.spaces.Spaces.UpdateConfig:input_type -> content.spaces.UpdateConfigRequest
+	12, // 29: content.spaces.Spaces.Delete:input_type -> content.spaces.DeleteRequest
+	13, // 30: content.spaces.Spaces.Transfer:input_type -> content.spaces.TransferRequest
+	14, // 31: content.spaces.Spaces.AbortTransfer:input_type -> content.spaces.AbortTransferRequest
+	15, // 32: content.spaces.Spaces.ListTransfers:input_type -> content.spaces.ListTransfersRequest
+	17, // 33: content.spaces.Spaces.Move:input_type -> content.spaces.MoveRequest
+	5,  // 34: content.spaces.Spaces.Create:output_type -> content.spaces.CreateResponse
+	7,  // 35: content.spaces.Spaces.Get:output_type -> content.spaces.GetResponse
+	9,  // 36: content.spaces.Spaces.List:output_type -> content.spaces.ListResponse
+	20, // 37: content.spaces.Spaces.Find:output_type -> content.spaces.FindResponse
+	29, // 38: content.spaces.Spaces.Update:output_type -> google.protobuf.Empty
+	29, // 39: content.spaces.Spaces.UpdateConfig:output_type -> google.protobuf.Empty
+	29, // 40: content.spaces.Spaces.Delete:output_type -> google.protobuf.Empty
+	29, // 41: content.spaces.Spaces.Transfer:output_type -> google.protobuf.Empty
+	29, // 42: content.spaces.Spaces.AbortTransfer:output_type -> google.protobuf.Empty
+	16, // 43: content.spaces.Spaces.ListTransfers:output_type -> content.spaces.ListTransfersResponse
+	29, // 44: content.spaces.Spaces.Move:output_type -> google.protobuf.Empty
+	34, // [34:45] is the sub-list for method output_type
+	23, // [23:34] is the sub-list for method input_type
+	23, // [23:23] is the sub-list for extension type_name
+	23, // [23:23] is the sub-list for extension extendee
+	0,  // [0:23] is the sub-list for field type_name
 }
 
 func init() { file_spaces_spaces_proto_init() }
@@ -1455,247 +1814,12 @@ func file_spaces_spaces_proto_init() {
 	if File_spaces_spaces_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_spaces_spaces_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*Space); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*StateInfo); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*Config); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*ListRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*ListResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateConfigRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[12].Exporter = func(v any, i int) any {
-			switch v := v.(*TransferRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[13].Exporter = func(v any, i int) any {
-			switch v := v.(*AbortTransferRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[14].Exporter = func(v any, i int) any {
-			switch v := v.(*ListTransfersRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[15].Exporter = func(v any, i int) any {
-			switch v := v.(*ListTransfersResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[16].Exporter = func(v any, i int) any {
-			switch v := v.(*MoveRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[17].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[18].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_spaces_spaces_proto_msgTypes[19].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_spaces_spaces_proto_msgTypes[20].OneofWrappers = []any{
+		(*SpaceEvent_Create)(nil),
+		(*SpaceEvent_Update)(nil),
+		(*SpaceEvent_Delete)(nil),
+		(*SpaceEvent_Move)(nil),
+		(*SpaceEvent_StateChange)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -1703,7 +1827,7 @@ func file_spaces_spaces_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_spaces_spaces_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   20,
+			NumMessages:   26,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/spaces/spaces_grpc.pb.go b/proto/spaces/spaces_grpc.pb.go
index a7d50aee..45352259 100644
--- a/proto/spaces/spaces_grpc.pb.go
+++ b/proto/spaces/spaces_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: spaces/spaces.proto
 
 package spaces
diff --git a/proto/users/users.pb.go b/proto/users/users.pb.go
index 23f9b300..42b0de69 100644
--- a/proto/users/users.pb.go
+++ b/proto/users/users.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: users/users.proto
 
 package users
@@ -40,11 +40,9 @@ type User struct {
 
 func (x *User) Reset() {
 	*x = User{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *User) String() string {
@@ -55,7 +53,7 @@ func (*User) ProtoMessage() {}
 
 func (x *User) ProtoReflect() protoreflect.Message {
 	mi := &file_users_users_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -142,11 +140,9 @@ type Filter struct {
 
 func (x *Filter) Reset() {
 	*x = Filter{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *Filter) String() string {
@@ -157,7 +153,7 @@ func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
 	mi := &file_users_users_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -221,6 +217,104 @@ func (x *Filter) GetSystem() *wrapperspb.BoolValue {
 	return nil
 }
 
+type LoginRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Email    string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
+	Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"`
+}
+
+func (x *LoginRequest) Reset() {
+	*x = LoginRequest{}
+	mi := &file_users_users_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LoginRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginRequest) ProtoMessage() {}
+
+func (x *LoginRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[2]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
+func (*LoginRequest) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *LoginRequest) GetEmail() string {
+	if x != nil {
+		return x.Email
+	}
+	return ""
+}
+
+func (x *LoginRequest) GetIdentity() string {
+	if x != nil {
+		return x.Identity
+	}
+	return ""
+}
+
+type LoginResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
+}
+
+func (x *LoginResponse) Reset() {
+	*x = LoginResponse{}
+	mi := &file_users_users_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LoginResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginResponse) ProtoMessage() {}
+
+func (x *LoginResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[3]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead.
+func (*LoginResponse) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *LoginResponse) GetUser() *User {
+	if x != nil {
+		return x.User
+	}
+	return nil
+}
+
 type CreateRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -231,11 +325,9 @@ type CreateRequest struct {
 
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateRequest) String() string {
@@ -245,8 +337,8 @@ func (x *CreateRequest) String() string {
 func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[4]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -258,7 +350,7 @@ func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead.
 func (*CreateRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{2}
+	return file_users_users_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *CreateRequest) GetCreate() *User {
@@ -278,11 +370,9 @@ type CreateResponse struct {
 
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *CreateResponse) String() string {
@@ -292,8 +382,8 @@ func (x *CreateResponse) String() string {
 func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[5]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -305,7 +395,7 @@ func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead.
 func (*CreateResponse) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{3}
+	return file_users_users_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *CreateResponse) GetUser() *User {
@@ -321,16 +411,14 @@ type GetRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetRequest) String() string {
@@ -340,8 +428,8 @@ func (x *GetRequest) String() string {
 func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[6]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -353,12 +441,12 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
 func (*GetRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{4}
+	return file_users_users_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *GetRequest) GetUserId() string {
+func (x *GetRequest) GetId() string {
 	if x != nil {
-		return x.UserId
+		return x.Id
 	}
 	return ""
 }
@@ -373,11 +461,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -387,8 +473,8 @@ func (x *GetResponse) String() string {
 func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[7]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -400,7 +486,7 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
 func (*GetResponse) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{5}
+	return file_users_users_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *GetResponse) GetUser() *User {
@@ -421,11 +507,9 @@ type FindRequest struct {
 
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindRequest) String() string {
@@ -435,8 +519,8 @@ func (x *FindRequest) String() string {
 func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[8]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -448,7 +532,7 @@ func (x *FindRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindRequest.ProtoReflect.Descriptor instead.
 func (*FindRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{6}
+	return file_users_users_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *FindRequest) GetFilter() *Filter {
@@ -476,11 +560,9 @@ type FindResponse struct {
 
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *FindResponse) String() string {
@@ -490,8 +572,8 @@ func (x *FindResponse) String() string {
 func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[9]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -503,7 +585,7 @@ func (x *FindResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindResponse.ProtoReflect.Descriptor instead.
 func (*FindResponse) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{7}
+	return file_users_users_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *FindResponse) GetUsers() []*User {
@@ -531,11 +613,9 @@ type UpdateRequest struct {
 
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *UpdateRequest) String() string {
@@ -545,8 +625,8 @@ func (x *UpdateRequest) String() string {
 func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[10]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -558,7 +638,7 @@ func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead.
 func (*UpdateRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{8}
+	return file_users_users_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *UpdateRequest) GetUpdate() *User {
@@ -578,11 +658,9 @@ type DeleteRequest struct {
 
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *DeleteRequest) String() string {
@@ -592,8 +670,8 @@ func (x *DeleteRequest) String() string {
 func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[11]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -605,7 +683,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{9}
+	return file_users_users_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *DeleteRequest) GetUserId() string {
@@ -625,11 +703,9 @@ type GetByIdentityRequest struct {
 
 func (x *GetByIdentityRequest) Reset() {
 	*x = GetByIdentityRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetByIdentityRequest) String() string {
@@ -639,8 +715,8 @@ func (x *GetByIdentityRequest) String() string {
 func (*GetByIdentityRequest) ProtoMessage() {}
 
 func (x *GetByIdentityRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[12]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -652,7 +728,7 @@ func (x *GetByIdentityRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetByIdentityRequest.ProtoReflect.Descriptor instead.
 func (*GetByIdentityRequest) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{10}
+	return file_users_users_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *GetByIdentityRequest) GetIdentity() string {
@@ -672,11 +748,9 @@ type GetByIdentityResponse struct {
 
 func (x *GetByIdentityResponse) Reset() {
 	*x = GetByIdentityResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_users_users_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_users_users_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetByIdentityResponse) String() string {
@@ -686,8 +760,8 @@ func (x *GetByIdentityResponse) String() string {
 func (*GetByIdentityResponse) ProtoMessage() {}
 
 func (x *GetByIdentityResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_users_users_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
+	mi := &file_users_users_proto_msgTypes[13]
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -699,7 +773,7 @@ func (x *GetByIdentityResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetByIdentityResponse.ProtoReflect.Descriptor instead.
 func (*GetByIdentityResponse) Descriptor() ([]byte, []int) {
-	return file_users_users_proto_rawDescGZIP(), []int{11}
+	return file_users_users_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *GetByIdentityResponse) GetUser() *User {
@@ -709,6 +783,215 @@ func (x *GetByIdentityResponse) GetUser() *User {
 	return nil
 }
 
+type UserEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// Types that are assignable to Event:
+	//
+	//	*UserEvent_Create
+	//	*UserEvent_Update
+	//	*UserEvent_Delete
+	Event isUserEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *UserEvent) Reset() {
+	*x = UserEvent{}
+	mi := &file_users_users_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UserEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserEvent) ProtoMessage() {}
+
+func (x *UserEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[14]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserEvent.ProtoReflect.Descriptor instead.
+func (*UserEvent) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *UserEvent) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+func (m *UserEvent) GetEvent() isUserEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *UserEvent) GetCreate() *UserEvent_CreateEvent {
+	if x, ok := x.GetEvent().(*UserEvent_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (x *UserEvent) GetUpdate() *UserEvent_UpdateEvent {
+	if x, ok := x.GetEvent().(*UserEvent_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (x *UserEvent) GetDelete() *UserEvent_DeleteEvent {
+	if x, ok := x.GetEvent().(*UserEvent_Delete); ok {
+		return x.Delete
+	}
+	return nil
+}
+
+type isUserEvent_Event interface {
+	isUserEvent_Event()
+}
+
+type UserEvent_Create struct {
+	Create *UserEvent_CreateEvent `protobuf:"bytes,100,opt,name=create,proto3,oneof"`
+}
+
+type UserEvent_Update struct {
+	Update *UserEvent_UpdateEvent `protobuf:"bytes,101,opt,name=update,proto3,oneof"`
+}
+
+type UserEvent_Delete struct {
+	Delete *UserEvent_DeleteEvent `protobuf:"bytes,102,opt,name=delete,proto3,oneof"`
+}
+
+func (*UserEvent_Create) isUserEvent_Event() {}
+
+func (*UserEvent_Update) isUserEvent_Event() {}
+
+func (*UserEvent_Delete) isUserEvent_Event() {}
+
+type UserEvent_CreateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UserEvent_CreateEvent) Reset() {
+	*x = UserEvent_CreateEvent{}
+	mi := &file_users_users_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UserEvent_CreateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserEvent_CreateEvent) ProtoMessage() {}
+
+func (x *UserEvent_CreateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[15]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserEvent_CreateEvent.ProtoReflect.Descriptor instead.
+func (*UserEvent_CreateEvent) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{14, 0}
+}
+
+type UserEvent_UpdateEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UserEvent_UpdateEvent) Reset() {
+	*x = UserEvent_UpdateEvent{}
+	mi := &file_users_users_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UserEvent_UpdateEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserEvent_UpdateEvent) ProtoMessage() {}
+
+func (x *UserEvent_UpdateEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[16]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserEvent_UpdateEvent.ProtoReflect.Descriptor instead.
+func (*UserEvent_UpdateEvent) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{14, 1}
+}
+
+type UserEvent_DeleteEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UserEvent_DeleteEvent) Reset() {
+	*x = UserEvent_DeleteEvent{}
+	mi := &file_users_users_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UserEvent_DeleteEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserEvent_DeleteEvent) ProtoMessage() {}
+
+func (x *UserEvent_DeleteEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_users_users_proto_msgTypes[17]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserEvent_DeleteEvent.ProtoReflect.Descriptor instead.
+func (*UserEvent_DeleteEvent) Descriptor() ([]byte, []int) {
+	return file_users_users_proto_rawDescGZIP(), []int{14, 2}
+}
+
 var File_users_users_proto protoreflect.FileDescriptor
 
 var file_users_users_proto_rawDesc = []byte{
@@ -753,77 +1036,106 @@ var file_users_users_proto_rawDesc = []byte{
 	0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f,
 	0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22,
-	0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x2b, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x40, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
+	0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
+	0x79, 0x22, 0x38, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
 	0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73,
-	0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x22, 0x39, 0x0a,
-	0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
-	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73,
-	0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x25, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22,
-	0x36, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27,
-	0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61,
+	0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x0d, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61,
 	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65,
-	0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x6b, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
-	0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66,
-	0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
-	0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
-	0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12,
-	0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05,
-	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
-	0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x75, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x22, 0x28, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x32, 0x0a,
-	0x14, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x22, 0x40, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69,
-	0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73,
-	0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75,
-	0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75,
-	0x73, 0x65, 0x72, 0x32, 0xb5, 0x03, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a,
-	0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
-	0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
-	0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e,
-	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75,
-	0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x1a,
-	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x46,
-	0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x63, 0x63,
-	0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x55, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
-	0x65, 0x72, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
-	0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5c, 0x0a,
-	0x0d, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x23,
+	0x72, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x22, 0x39, 0x0a, 0x0e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75,
+	0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04,
+	0x75, 0x73, 0x65, 0x72, 0x22, 0x1c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x22, 0x36, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e,
+	0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x6b, 0x0a, 0x0b, 0x46, 0x69,
+	0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+	0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07,
+	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65,
+	0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, 0x75, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x28, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
+	0x22, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
+	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65,
+	0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a,
+	0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72,
+	0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x9a, 0x02, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a,
+	0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a,
+	0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a,
+	0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x0d, 0x0a,
+	0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76,
+	0x65, 0x6e, 0x74, 0x32, 0xfb, 0x03, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a,
+	0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
+	0x65, 0x72, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e,
+	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03,
+	0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
+	0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a,
 	0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x47,
-	0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
-	0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67,
-	0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x04,
+	0x46, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75,
+	0x73, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1b, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73,
+	0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x40, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x40, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x74, 0x79, 0x12, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75,
+	0x73, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69,
+	0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
+	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67,
+	0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3b, 0x75, 0x73,
+	0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -838,54 +1150,66 @@ func file_users_users_proto_rawDescGZIP() []byte {
 	return file_users_users_proto_rawDescData
 }
 
-var file_users_users_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
+var file_users_users_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
 var file_users_users_proto_goTypes = []any{
 	(*User)(nil),                  // 0: account.users.User
 	(*Filter)(nil),                // 1: account.users.Filter
-	(*CreateRequest)(nil),         // 2: account.users.CreateRequest
-	(*CreateResponse)(nil),        // 3: account.users.CreateResponse
-	(*GetRequest)(nil),            // 4: account.users.GetRequest
-	(*GetResponse)(nil),           // 5: account.users.GetResponse
-	(*FindRequest)(nil),           // 6: account.users.FindRequest
-	(*FindResponse)(nil),          // 7: account.users.FindResponse
-	(*UpdateRequest)(nil),         // 8: account.users.UpdateRequest
-	(*DeleteRequest)(nil),         // 9: account.users.DeleteRequest
-	(*GetByIdentityRequest)(nil),  // 10: account.users.GetByIdentityRequest
-	(*GetByIdentityResponse)(nil), // 11: account.users.GetByIdentityResponse
-	(*wrapperspb.BoolValue)(nil),  // 12: google.protobuf.BoolValue
-	(*common.FindOptions)(nil),    // 13: common.FindOptions
-	(*emptypb.Empty)(nil),         // 14: google.protobuf.Empty
+	(*LoginRequest)(nil),          // 2: account.users.LoginRequest
+	(*LoginResponse)(nil),         // 3: account.users.LoginResponse
+	(*CreateRequest)(nil),         // 4: account.users.CreateRequest
+	(*CreateResponse)(nil),        // 5: account.users.CreateResponse
+	(*GetRequest)(nil),            // 6: account.users.GetRequest
+	(*GetResponse)(nil),           // 7: account.users.GetResponse
+	(*FindRequest)(nil),           // 8: account.users.FindRequest
+	(*FindResponse)(nil),          // 9: account.users.FindResponse
+	(*UpdateRequest)(nil),         // 10: account.users.UpdateRequest
+	(*DeleteRequest)(nil),         // 11: account.users.DeleteRequest
+	(*GetByIdentityRequest)(nil),  // 12: account.users.GetByIdentityRequest
+	(*GetByIdentityResponse)(nil), // 13: account.users.GetByIdentityResponse
+	(*UserEvent)(nil),             // 14: account.users.UserEvent
+	(*UserEvent_CreateEvent)(nil), // 15: account.users.UserEvent.CreateEvent
+	(*UserEvent_UpdateEvent)(nil), // 16: account.users.UserEvent.UpdateEvent
+	(*UserEvent_DeleteEvent)(nil), // 17: account.users.UserEvent.DeleteEvent
+	(*wrapperspb.BoolValue)(nil),  // 18: google.protobuf.BoolValue
+	(*common.FindOptions)(nil),    // 19: common.FindOptions
+	(*emptypb.Empty)(nil),         // 20: google.protobuf.Empty
 }
 var file_users_users_proto_depIdxs = []int32{
-	12, // 0: account.users.User.email_verified:type_name -> google.protobuf.BoolValue
-	12, // 1: account.users.User.system:type_name -> google.protobuf.BoolValue
-	12, // 2: account.users.Filter.email_verified:type_name -> google.protobuf.BoolValue
-	12, // 3: account.users.Filter.system:type_name -> google.protobuf.BoolValue
-	0,  // 4: account.users.CreateRequest.create:type_name -> account.users.User
-	0,  // 5: account.users.CreateResponse.user:type_name -> account.users.User
-	0,  // 6: account.users.GetResponse.user:type_name -> account.users.User
-	1,  // 7: account.users.FindRequest.filter:type_name -> account.users.Filter
-	13, // 8: account.users.FindRequest.options:type_name -> common.FindOptions
-	0,  // 9: account.users.FindResponse.users:type_name -> account.users.User
-	0,  // 10: account.users.UpdateRequest.update:type_name -> account.users.User
-	0,  // 11: account.users.GetByIdentityResponse.user:type_name -> account.users.User
-	2,  // 12: account.users.Users.Create:input_type -> account.users.CreateRequest
-	4,  // 13: account.users.Users.Get:input_type -> account.users.GetRequest
-	6,  // 14: account.users.Users.Find:input_type -> account.users.FindRequest
-	8,  // 15: account.users.Users.Update:input_type -> account.users.UpdateRequest
-	9,  // 16: account.users.Users.Delete:input_type -> account.users.DeleteRequest
-	10, // 17: account.users.Users.GetByIdentity:input_type -> account.users.GetByIdentityRequest
-	3,  // 18: account.users.Users.Create:output_type -> account.users.CreateResponse
-	5,  // 19: account.users.Users.Get:output_type -> account.users.GetResponse
-	7,  // 20: account.users.Users.Find:output_type -> account.users.FindResponse
-	14, // 21: account.users.Users.Update:output_type -> google.protobuf.Empty
-	14, // 22: account.users.Users.Delete:output_type -> google.protobuf.Empty
-	11, // 23: account.users.Users.GetByIdentity:output_type -> account.users.GetByIdentityResponse
-	18, // [18:24] is the sub-list for method output_type
-	12, // [12:18] is the sub-list for method input_type
-	12, // [12:12] is the sub-list for extension type_name
-	12, // [12:12] is the sub-list for extension extendee
-	0,  // [0:12] is the sub-list for field type_name
+	18, // 0: account.users.User.email_verified:type_name -> google.protobuf.BoolValue
+	18, // 1: account.users.User.system:type_name -> google.protobuf.BoolValue
+	18, // 2: account.users.Filter.email_verified:type_name -> google.protobuf.BoolValue
+	18, // 3: account.users.Filter.system:type_name -> google.protobuf.BoolValue
+	0,  // 4: account.users.LoginResponse.user:type_name -> account.users.User
+	0,  // 5: account.users.CreateRequest.create:type_name -> account.users.User
+	0,  // 6: account.users.CreateResponse.user:type_name -> account.users.User
+	0,  // 7: account.users.GetResponse.user:type_name -> account.users.User
+	1,  // 8: account.users.FindRequest.filter:type_name -> account.users.Filter
+	19, // 9: account.users.FindRequest.options:type_name -> common.FindOptions
+	0,  // 10: account.users.FindResponse.users:type_name -> account.users.User
+	0,  // 11: account.users.UpdateRequest.update:type_name -> account.users.User
+	0,  // 12: account.users.GetByIdentityResponse.user:type_name -> account.users.User
+	15, // 13: account.users.UserEvent.create:type_name -> account.users.UserEvent.CreateEvent
+	16, // 14: account.users.UserEvent.update:type_name -> account.users.UserEvent.UpdateEvent
+	17, // 15: account.users.UserEvent.delete:type_name -> account.users.UserEvent.DeleteEvent
+	2,  // 16: account.users.Users.Login:input_type -> account.users.LoginRequest
+	4,  // 17: account.users.Users.Create:input_type -> account.users.CreateRequest
+	6,  // 18: account.users.Users.Get:input_type -> account.users.GetRequest
+	8,  // 19: account.users.Users.Find:input_type -> account.users.FindRequest
+	10, // 20: account.users.Users.Update:input_type -> account.users.UpdateRequest
+	11, // 21: account.users.Users.Delete:input_type -> account.users.DeleteRequest
+	12, // 22: account.users.Users.GetByIdentity:input_type -> account.users.GetByIdentityRequest
+	3,  // 23: account.users.Users.Login:output_type -> account.users.LoginResponse
+	5,  // 24: account.users.Users.Create:output_type -> account.users.CreateResponse
+	7,  // 25: account.users.Users.Get:output_type -> account.users.GetResponse
+	9,  // 26: account.users.Users.Find:output_type -> account.users.FindResponse
+	20, // 27: account.users.Users.Update:output_type -> google.protobuf.Empty
+	20, // 28: account.users.Users.Delete:output_type -> google.protobuf.Empty
+	13, // 29: account.users.Users.GetByIdentity:output_type -> account.users.GetByIdentityResponse
+	23, // [23:30] is the sub-list for method output_type
+	16, // [16:23] is the sub-list for method input_type
+	16, // [16:16] is the sub-list for extension type_name
+	16, // [16:16] is the sub-list for extension extendee
+	0,  // [0:16] is the sub-list for field type_name
 }
 
 func init() { file_users_users_proto_init() }
@@ -893,151 +1217,10 @@ func file_users_users_proto_init() {
 	if File_users_users_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_users_users_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*User); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[1].Exporter = func(v any, i int) any {
-			switch v := v.(*Filter); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[2].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[3].Exporter = func(v any, i int) any {
-			switch v := v.(*CreateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[4].Exporter = func(v any, i int) any {
-			switch v := v.(*GetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[5].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[6].Exporter = func(v any, i int) any {
-			switch v := v.(*FindRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[7].Exporter = func(v any, i int) any {
-			switch v := v.(*FindResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[8].Exporter = func(v any, i int) any {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[9].Exporter = func(v any, i int) any {
-			switch v := v.(*DeleteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[10].Exporter = func(v any, i int) any {
-			switch v := v.(*GetByIdentityRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_users_users_proto_msgTypes[11].Exporter = func(v any, i int) any {
-			switch v := v.(*GetByIdentityResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
+	file_users_users_proto_msgTypes[14].OneofWrappers = []any{
+		(*UserEvent_Create)(nil),
+		(*UserEvent_Update)(nil),
+		(*UserEvent_Delete)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -1045,7 +1228,7 @@ func file_users_users_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_users_users_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   12,
+			NumMessages:   18,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/users/users_grpc.pb.go b/proto/users/users_grpc.pb.go
index 20bc9b68..1e1e9326 100644
--- a/proto/users/users_grpc.pb.go
+++ b/proto/users/users_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: users/users.proto
 
 package users
@@ -20,6 +20,7 @@ import (
 const _ = grpc.SupportPackageIsVersion9
 
 const (
+	Users_Login_FullMethodName         = "/account.users.Users/Login"
 	Users_Create_FullMethodName        = "/account.users.Users/Create"
 	Users_Get_FullMethodName           = "/account.users.Users/Get"
 	Users_Find_FullMethodName          = "/account.users.Users/Find"
@@ -32,6 +33,11 @@ const (
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type UsersClient interface {
+	// Метод для авторизации пользователя. Возвращает информацию о пользователе
+	// Пользователь может быть авторизован в разных системах IdP, поэтому
+	// авторизация происходит по email и identity. Если для одного email есть
+	// несколько identity, то они будут объединены в одного пользователя
+	Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error)
 	// Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
 	// - Получение любого пользователя по идентификатору
@@ -58,6 +64,16 @@ func NewUsersClient(cc grpc.ClientConnInterface) UsersClient {
 	return &usersClient{cc}
 }
 
+func (c *usersClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(LoginResponse)
+	err := c.cc.Invoke(ctx, Users_Login_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *usersClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(CreateResponse)
@@ -122,6 +138,11 @@ func (c *usersClient) GetByIdentity(ctx context.Context, in *GetByIdentityReques
 // All implementations must embed UnimplementedUsersServer
 // for forward compatibility.
 type UsersServer interface {
+	// Метод для авторизации пользователя. Возвращает информацию о пользователе
+	// Пользователь может быть авторизован в разных системах IdP, поэтому
+	// авторизация происходит по email и identity. Если для одного email есть
+	// несколько identity, то они будут объединены в одного пользователя
+	Login(context.Context, *LoginRequest) (*LoginResponse, error)
 	// Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
 	// - Получение любого пользователя по идентификатору
@@ -148,6 +169,9 @@ type UsersServer interface {
 // pointer dereference when methods are called.
 type UnimplementedUsersServer struct{}
 
+func (UnimplementedUsersServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Login not implemented")
+}
 func (UnimplementedUsersServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
 }
@@ -187,6 +211,24 @@ func RegisterUsersServer(s grpc.ServiceRegistrar, srv UsersServer) {
 	s.RegisterService(&Users_ServiceDesc, srv)
 }
 
+func _Users_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LoginRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(UsersServer).Login(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: Users_Login_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(UsersServer).Login(ctx, req.(*LoginRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Users_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(CreateRequest)
 	if err := dec(in); err != nil {
@@ -302,6 +344,10 @@ var Users_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "account.users.Users",
 	HandlerType: (*UsersServer)(nil),
 	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Login",
+			Handler:    _Users_Login_Handler,
+		},
 		{
 			MethodName: "Create",
 			Handler:    _Users_Create_Handler,
diff --git a/proto/versions/account/versions.pb.go b/proto/versions/account/versions.pb.go
index b1c95aba..87b76d21 100644
--- a/proto/versions/account/versions.pb.go
+++ b/proto/versions/account/versions.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: versions/account/versions.proto
 
 package account
@@ -32,11 +32,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_versions_account_versions_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_versions_account_versions_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -47,7 +45,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_versions_account_versions_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -126,20 +124,6 @@ func file_versions_account_versions_proto_init() {
 	if File_versions_account_versions_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_versions_account_versions_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/versions/account/versions_grpc.pb.go b/proto/versions/account/versions_grpc.pb.go
index 06fb7914..21585ad4 100644
--- a/proto/versions/account/versions_grpc.pb.go
+++ b/proto/versions/account/versions_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: versions/account/versions.proto
 
 package account
diff --git a/proto/versions/content/versions.pb.go b/proto/versions/content/versions.pb.go
index fd3d05b8..807cd841 100644
--- a/proto/versions/content/versions.pb.go
+++ b/proto/versions/content/versions.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.34.2
-// 	protoc        v5.27.3
+// 	protoc-gen-go v1.35.1
+// 	protoc        v5.28.2
 // source: versions/content/versions.proto
 
 package content
@@ -32,11 +32,9 @@ type GetResponse struct {
 
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_versions_content_versions_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
+	mi := &file_versions_content_versions_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
 func (x *GetResponse) String() string {
@@ -47,7 +45,7 @@ func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_versions_content_versions_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
+	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 			ms.StoreMessageInfo(mi)
@@ -126,20 +124,6 @@ func file_versions_content_versions_proto_init() {
 	if File_versions_content_versions_proto != nil {
 		return
 	}
-	if !protoimpl.UnsafeEnabled {
-		file_versions_content_versions_proto_msgTypes[0].Exporter = func(v any, i int) any {
-			switch v := v.(*GetResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/proto/versions/content/versions_grpc.pb.go b/proto/versions/content/versions_grpc.pb.go
index d2afb289..579687a5 100644
--- a/proto/versions/content/versions_grpc.pb.go
+++ b/proto/versions/content/versions_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.27.3
+// - protoc             v5.28.2
 // source: versions/content/versions.proto
 
 package content
-- 
GitLab