diff --git a/pkg/environments/options.go b/pkg/environments/options.go
index 02f1a1fea3229ccfe702401c2dfa06e5094d9671..bdb0f7ed77175729335021479b57528bb993a723 100644
--- a/pkg/environments/options.go
+++ b/pkg/environments/options.go
@@ -1,16 +1,15 @@
 package environments
 
 type MigrateOptions struct {
-
-	// Ожидать завершения миграции в синхронном режиме
-	Wait bool
+	// Async - запустить миграцию в асинхронном режиме
+	Async bool
 }
 
 func MergeMigrateOptions(opts ...*MigrateOptions) *MigrateOptions {
 	o := &MigrateOptions{}
 	for _, opt := range opts {
-		if opt.Wait {
-			o.Wait = true
+		if opt.Async {
+			o.Async = true
 		}
 	}
 	return o
diff --git a/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go b/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
index cb9ee820f529f6ae1389415735dccbcdcd1bfee5..c29d7987f8f656b562b9260436e03d3b7c35edc2 100644
--- a/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
@@ -88,12 +88,12 @@ func ProtoToListPtrEnvironment(protoEnvs []*pb.Environment) ([]*service.Environm
 
 func ElPtrMigrateOptionsToProto(options []*service.MigrateOptions) (*pb.MigrateOptions, error) {
 	opts := service.MergeMigrateOptions(options...)
-	return &pb.MigrateOptions{Wait: opts.Wait}, nil
+	return &pb.MigrateOptions{Async: opts.Async}, nil
 }
 
 func ProtoToElPtrMigrateOptions(protoOptions *pb.MigrateOptions) ([]*service.MigrateOptions, error) {
 	if protoOptions == nil {
 		return nil, nil
 	}
-	return []*service.MigrateOptions{{Wait: protoOptions.Wait}}, nil
+	return []*service.MigrateOptions{{Async: protoOptions.Async}}, nil
 }
diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go
index 6d4a2333438f070e3c59aa7e602820a3814039ab..db7a919e29aae3e1517739f4adedb00bc66f41ce 100644
--- a/pkg/setup/collection.go
+++ b/pkg/setup/collection.go
@@ -7,7 +7,6 @@ import (
 
 	"git.perx.ru/perxis/perxis-go/pkg/collections"
 	"git.perx.ru/perxis/perxis-go/pkg/data"
-	"git.perx.ru/perxis/perxis-go/pkg/environments"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
 	"git.perx.ru/perxis/perxis-go/pkg/schema"
@@ -140,7 +139,7 @@ func (s *Setup) InstallCollections(ctx context.Context) (err error) {
 	}
 
 	if migrate {
-		if err = s.content.Environments.Migrate(ctx, s.SpaceID, s.EnvironmentID, &environments.MigrateOptions{Wait: true}); err != nil {
+		if err = s.content.Environments.Migrate(ctx, s.SpaceID, s.EnvironmentID); err != nil {
 			s.logger.Error(
 				"Failed to migrate environment",
 				zap.String("Space ID", s.SpaceID),
diff --git a/pkg/setup/collection_test.go b/pkg/setup/collection_test.go
index 20867b2d13fc031875a5627dabca8f06c0830106..5edb94e1b00671264a82401a4c648fed5cc1405d 100644
--- a/pkg/setup/collection_test.go
+++ b/pkg/setup/collection_test.go
@@ -43,7 +43,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String())).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -57,7 +57,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("Create", mock.Anything, &collections.Collection{ID: "1", SpaceID: "sp", Name: "space", EnvID: "env", View: &collections.View{SpaceID: "sp", EnvID: "env", CollectionID: "3"}}).Return(&collections.Collection{ID: "1", SpaceID: "sp", Name: "space", EnvID: "env", View: &collections.View{SpaceID: "sp", EnvID: "env", CollectionID: "3"}}, nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -88,7 +88,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "2", schema.New("name", field.String())).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Twice()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Twice()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -116,7 +116,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test-extension")).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -143,7 +143,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test-extension")).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -159,7 +159,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String()).WithMetadata(extension.ExtensionMetadataKey, "test-extension")).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -174,7 +174,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("Update", mock.Anything, &collections.Collection{ID: "1", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp3", EnvID: environments.DefaultEnvironment, CollectionID: "3"}}).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(nil).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(nil).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.NoError(t, err)
@@ -189,7 +189,7 @@ func TestSetup_InstallCollections(t *testing.T) {
 				svc.On("SetSchema", mock.Anything, "sp", "env", "1", schema.New("name", field.String())).Return(nil).Once()
 			},
 			envsCall: func(svc *envmocks.Environments) {
-				svc.On("Migrate", mock.Anything, "sp", "env", &environments.MigrateOptions{Wait: true}).Return(errors.New("migrate error")).Once()
+				svc.On("Migrate", mock.Anything, "sp", "env").Return(errors.New("migrate error")).Once()
 			},
 			wantErr: func(t *testing.T, err error) {
 				assert.Error(t, err)
diff --git a/pkg/setup/setup_test.go b/pkg/setup/setup_test.go
index 6a1b6f7ba6884fa2f09a826a08a695219b23e142..a4084a17859023c32edf90bd493d177176a7eef4 100644
--- a/pkg/setup/setup_test.go
+++ b/pkg/setup/setup_test.go
@@ -10,7 +10,6 @@ import (
 	collectionMock "git.perx.ru/perxis/perxis-go/pkg/collections/mocks"
 	"git.perx.ru/perxis/perxis-go/pkg/content"
 	"git.perx.ru/perxis/perxis-go/pkg/data"
-	"git.perx.ru/perxis/perxis-go/pkg/environments"
 	environmentMock "git.perx.ru/perxis/perxis-go/pkg/environments/mocks"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
@@ -102,7 +101,7 @@ func TestSetupInstall(t *testing.T) {
 
 	t.Run("Success, no force", func(t *testing.T) {
 		envMocks := &environmentMock.Environments{}
-		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
+		envMocks.On("Migrate", mock.Anything, spaceID, envID).
 			Return(nil).
 			Once()
 
@@ -180,7 +179,7 @@ func TestSetupInstall(t *testing.T) {
 	t.Run("Success, update existing records", func(t *testing.T) {
 		envMocks := &environmentMock.Environments{}
 		//todo после удаления флага _alwaysSetSchema убрать лишний вызов
-		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
+		envMocks.On("Migrate", mock.Anything, spaceID, envID).
 			Return(nil).Once()
 
 		collsMock := &collectionMock.Collections{}
@@ -247,7 +246,7 @@ func TestSetupInstall(t *testing.T) {
 	t.Run("Success, with force", func(t *testing.T) {
 		//todo после удаления флага _alwaysSetSchema убрать лишний вызов
 		envMocks := &environmentMock.Environments{}
-		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
+		envMocks.On("Migrate", mock.Anything, spaceID, envID).
 			Return(nil).Once()
 
 		collsMock := &collectionMock.Collections{}
@@ -552,7 +551,7 @@ func TestSetupInstall(t *testing.T) {
 
 	t.Run("Can't migrate, storage returns error", func(t *testing.T) {
 		envMocks := &environmentMock.Environments{}
-		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
+		envMocks.On("Migrate", mock.Anything, spaceID, envID).
 			Return(errors.New("can't migrate")).
 			Once()
 
@@ -612,7 +611,7 @@ func TestSetupInstall(t *testing.T) {
 
 	t.Run("Can't find action, storage returns error", func(t *testing.T) {
 		envMocks := &environmentMock.Environments{}
-		envMocks.On("Migrate", mock.Anything, spaceID, envID, &environments.MigrateOptions{Wait: true}).
+		envMocks.On("Migrate", mock.Anything, spaceID, envID).
 			Return(nil).
 			Once()
 
diff --git a/proto/clients/clients.pb.go b/proto/clients/clients.pb.go
index b9b1cea0655d744c267d3aeeb2b816a4c6451d12..4c75762d6119e199e3113a4086a198f102ef09aa 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: clients/clients.proto
 
 package clients
@@ -35,11 +35,12 @@ type Client struct {
 	// Описание клиента, назначение
 	Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"`
 	// Приложение отключено и не может авторизоваться
-	Disabled *bool          `protobuf:"varint,7,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"`
-	RoleId   string         `protobuf:"bytes,8,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
-	Oauth    *Client_OAuth  `protobuf:"bytes,10,opt,name=oauth,proto3" json:"oauth,omitempty"`
-	Tls      *Client_TLS    `protobuf:"bytes,11,opt,name=tls,proto3" json:"tls,omitempty"`
-	ApiKey   *Client_APIKey `protobuf:"bytes,12,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"`
+	Disabled *bool `protobuf:"varint,7,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"`
+	// Идентификатор роли клиента
+	RoleId string         `protobuf:"bytes,8,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	Oauth  *Client_OAuth  `protobuf:"bytes,10,opt,name=oauth,proto3" json:"oauth,omitempty"`
+	Tls    *Client_TLS    `protobuf:"bytes,11,opt,name=tls,proto3" json:"tls,omitempty"`
+	ApiKey *Client_APIKey `protobuf:"bytes,12,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"`
 }
 
 func (x *Client) Reset() {
diff --git a/proto/clients/clients_grpc.pb.go b/proto/clients/clients_grpc.pb.go
index f442fc157b74957f29c2559b616154fb7167abe4..9b701db881a10acc1021de4e49cbf3b5ff4acd8a 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: clients/clients.proto
 
 package clients
diff --git a/proto/collections/collections.pb.go b/proto/collections/collections.pb.go
index 9c70451d3ba2ea24fad8b403a27564d426b89594..71712728599d799f2bbeb975196a8fc75b77e042 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: collections/collections.proto
 
 package collections
@@ -154,19 +154,23 @@ type Collection struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id        string                `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	SpaceId   string                `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId     string                `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	Name      string                `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
-	Single    *bool                 `protobuf:"varint,5,opt,name=single,proto3,oneof" json:"single,omitempty"`
-	System    *bool                 `protobuf:"varint,6,opt,name=system,proto3,oneof" json:"system,omitempty"`
+	Id      string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	SpaceId string `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Name    string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Коллекция может содержать ровно одну запись. При работе с записью в такой коллекции идентификатор записи в
+	// обращениях в API можно не указывать и предполагать, что запись всегда есть (ее не нужно создавать)
+	Single *bool `protobuf:"varint,5,opt,name=single,proto3,oneof" json:"single,omitempty"`
+	System *bool `protobuf:"varint,6,opt,name=system,proto3,oneof" json:"system,omitempty"`
+	// Коллекция не содержит данных. Возможно создание таких коллекций для использования как подключаемые подсхемы в
+	// других коллекциях
 	NoData    *bool                 `protobuf:"varint,12,opt,name=no_data,json=noData,proto3,oneof" json:"no_data,omitempty"`
 	Schema    string                `protobuf:"bytes,7,opt,name=schema,proto3" json:"schema,omitempty"`
 	Hidden    bool                  `protobuf:"varint,13,opt,name=hidden,proto3" json:"hidden,omitempty"`
 	View      *Collection_View      `protobuf:"bytes,9,opt,name=view,proto3" json:"view,omitempty"`
 	StateInfo *Collection_StateInfo `protobuf:"bytes,10,opt,name=state_info,json=stateInfo,proto3" json:"state_info,omitempty"`
 	Tags      []string              `protobuf:"bytes,16,rep,name=tags,proto3" json:"tags,omitempty"`
-	Access    *Access               `protobuf:"bytes,20,opt,name=access,proto3" json:"access,omitempty"`
+	Access    *Access               `protobuf:"bytes,20,opt,name=access,proto3" json:"access,omitempty"` // Возможные действия с коллекцией на основе контекста запроса
 }
 
 func (x *Collection) Reset() {
diff --git a/proto/collections/collections_grpc.pb.go b/proto/collections/collections_grpc.pb.go
index 824303740bd9b178f09b627052dbf464b75a3d95..eef27369eed0b0501ee45365e6195e4c52ea85c5 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: collections/collections.proto
 
 package collections
@@ -32,11 +32,25 @@ 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 CollectionsClient interface {
+	// Создать коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Create` игнорируется
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
+	// Получить коллекцию. Схема коллекции возвращается полная, т.е. включая все подключаемые подсхемы, если не указано
+	// обратное в `GetRequest.options`
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
+	// Возвращает список коллекций, отсортированных в алфавитном порядке. По умолчанию не возвращает коллекции без данных
+	// и скрытые коллекции, подробнее см. `ListRequest.filter`
 	List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error)
+	// Обновить коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Update` игнорируется
 	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Установить схему коллекции. По результатам вызова метода не происходит *применение* схемы - например,
+	// не перестраиваются индексы БД коллекции, поскольку это может быть длительный процесс. После редактирования всех
+	// необходимых схем окружения необходимо их применить - выполнить миграцию путем вызова метода `Environments.Migrate`.
+	// Если схема коллекции изменена, но миграция еще не была запущена, коллекция будет находиться в состоянии `CHANGED`.
+	//
+	// Если в процессе миграции возникли ошибки, в соответствующие коллекции в поле `Collection.state_info` будет записано
+	// содержание ошибки и установлено состояние `ERROR`
 	SetSchema(ctx context.Context, in *SetSchemaRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Удалить коллекцию
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 }
 
@@ -106,11 +120,25 @@ func (c *collectionsClient) Delete(ctx context.Context, in *DeleteRequest, opts
 // All implementations must embed UnimplementedCollectionsServer
 // for forward compatibility
 type CollectionsServer interface {
+	// Создать коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Create` игнорируется
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
+	// Получить коллекцию. Схема коллекции возвращается полная, т.е. включая все подключаемые подсхемы, если не указано
+	// обратное в `GetRequest.options`
 	Get(context.Context, *GetRequest) (*GetResponse, error)
+	// Возвращает список коллекций, отсортированных в алфавитном порядке. По умолчанию не возвращает коллекции без данных
+	// и скрытые коллекции, подробнее см. `ListRequest.filter`
 	List(context.Context, *ListRequest) (*ListResponse, error)
+	// Обновить коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Update` игнорируется
 	Update(context.Context, *UpdateRequest) (*emptypb.Empty, error)
+	// Установить схему коллекции. По результатам вызова метода не происходит *применение* схемы - например,
+	// не перестраиваются индексы БД коллекции, поскольку это может быть длительный процесс. После редактирования всех
+	// необходимых схем окружения необходимо их применить - выполнить миграцию путем вызова метода `Environments.Migrate`.
+	// Если схема коллекции изменена, но миграция еще не была запущена, коллекция будет находиться в состоянии `CHANGED`.
+	//
+	// Если в процессе миграции возникли ошибки, в соответствующие коллекции в поле `Collection.state_info` будет записано
+	// содержание ошибки и установлено состояние `ERROR`
 	SetSchema(context.Context, *SetSchemaRequest) (*emptypb.Empty, error)
+	// Удалить коллекцию
 	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
 	mustEmbedUnimplementedCollectionsServer()
 }
diff --git a/proto/environments/environments.pb.go b/proto/environments/environments.pb.go
index fdae1371c354aa97141b6f23598730e3656c9fd0..cec837936e68784f4edc1615f8139194fb1e7027 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: environments/environments.proto
 
 package environments
@@ -871,7 +871,8 @@ type MigrateOptions struct {
 
 	// Ожидать завершения миграции в синхронном режиме. Если в запрос передан контекст с таймаутом,
 	// то после истечения таймаута миграция продолжится в асинхронном режиме
-	Wait bool `protobuf:"varint,1,opt,name=wait,proto3" json:"wait,omitempty"`
+	Wait  bool `protobuf:"varint,1,opt,name=wait,proto3" json:"wait,omitempty"`   // Deprecated - миграция по умолчанию выполняется синхронно
+	Async bool `protobuf:"varint,2,opt,name=async,proto3" json:"async,omitempty"` // Выполнить миграцию в асинхронном режиме
 }
 
 func (x *MigrateOptions) Reset() {
@@ -913,6 +914,13 @@ func (x *MigrateOptions) GetWait() bool {
 	return false
 }
 
+func (x *MigrateOptions) GetAsync() bool {
+	if x != nil {
+		return x.Async
+	}
+	return false
+}
+
 var File_environments_environments_proto protoreflect.FileDescriptor
 
 var file_environments_environments_proto_rawDesc = []byte{
@@ -1009,54 +1017,55 @@ var file_environments_environments_proto_rawDesc = []byte{
 	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, 0x24, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x4f,
+	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, 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,
+	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, 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, 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,
+	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, 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,
+	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,
+	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 (
diff --git a/proto/environments/environments_grpc.pb.go b/proto/environments/environments_grpc.pb.go
index 6679d70738a62e277e9c41c6bd237246d7b88e76..c71798565954f2f7cfc10b170fa34e31c1ae6abe 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: environments/environments.proto
 
 package environments
@@ -41,6 +41,13 @@ type EnvironmentsClient interface {
 	SetAlias(ctx context.Context, in *SetAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	RemoveAlias(ctx context.Context, in *RemoveAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Выполнить миграцию окружения. По умолчанию выполняется в синхронном режиме, для асинхронного выполнения можно
+	// передать соответствующую настройку в опциях `MigrateRequest.options`
+	//
+	// При вызове миграции:
+	// - выполняются миграции для всех коллекций окружения
+	//
+	// В случае возникновения ошибок миграции они записываются в поле `Environment.state`
 	Migrate(ctx context.Context, in *MigrateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 }
 
@@ -135,6 +142,13 @@ type EnvironmentsServer interface {
 	SetAlias(context.Context, *SetAliasRequest) (*emptypb.Empty, error)
 	RemoveAlias(context.Context, *RemoveAliasRequest) (*emptypb.Empty, error)
 	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
+	// Выполнить миграцию окружения. По умолчанию выполняется в синхронном режиме, для асинхронного выполнения можно
+	// передать соответствующую настройку в опциях `MigrateRequest.options`
+	//
+	// При вызове миграции:
+	// - выполняются миграции для всех коллекций окружения
+	//
+	// В случае возникновения ошибок миграции они записываются в поле `Environment.state`
 	Migrate(context.Context, *MigrateRequest) (*emptypb.Empty, error)
 	mustEmbedUnimplementedEnvironmentsServer()
 }
diff --git a/proto/extensions/extension.pb.go b/proto/extensions/extension.pb.go
index ffeb45ce3549c26d76aea4ac2bb997fb76e4e46d..23120cb2360e06a7b62529ff92183044efebe791 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: extensions/extension.proto
 
 package extensions
@@ -978,20 +978,20 @@ func (x *ActionResponse) GetRefs() []*references.Reference {
 	return nil
 }
 
-// *
-// Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
-// получения ответа  (см. `ActionResponse.next`)
+//*
+//Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
+//получения ответа  (см. `ActionResponse.next`)
 //
-// Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
+//Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
 //
-// Коллекция: space_actions (Пространство/Действия)
-// Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
+//Коллекция: space_actions (Пространство/Действия)
+//Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
 //
-// Пользовательские действия добавляются при установке расширений или при
-// настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
-// им действий в коллекции.
+//Пользовательские действия добавляются при установке расширений или при
+//настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
+//им действий в коллекции.
 //
-// Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
+//Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
 type Action struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1027,6 +1027,7 @@ type Action struct {
 	// - :envId
 	// - :colId
 	// - :itemId
+	//
 	NavigationRoute string `protobuf:"bytes,10510,opt,name=navigation_route,json=navigationRoute,proto3" json:"navigation_route,omitempty"`
 }
 
diff --git a/proto/extensions/extension_grpc.pb.go b/proto/extensions/extension_grpc.pb.go
index 2d19448ba786db2501c69cf31b34cb8c91de714b..550f0bdfada581863151e88ec94e4732d9a94508 100644
--- a/proto/extensions/extension_grpc.pb.go
+++ b/proto/extensions/extension_grpc.pb.go
@@ -11,7 +11,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: extensions/extension.proto
 
 package extensions
@@ -63,10 +63,10 @@ type ExtensionClient interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
+	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//   параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.
@@ -153,10 +153,10 @@ type ExtensionServer interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
+	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//   параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.
diff --git a/proto/spaces/spaces.pb.go b/proto/spaces/spaces.pb.go
index e495f108bb1950a678a2f3ee1c02daf76f0fb939..6fb15d8af880c6a8cd39704cee97c860d210fbac 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.30.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: spaces/spaces.proto
 
 package spaces
diff --git a/proto/spaces/spaces_grpc.pb.go b/proto/spaces/spaces_grpc.pb.go
index 757e68b152a7bc52beee9e84d7d3dfd7908819cb..f62bfa6dc1670c60e95a2d98a1db13275f43a3fe 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.2.0
-// - protoc             v3.21.12
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.23.4
 // source: spaces/spaces.proto
 
 package spaces
@@ -19,6 +19,19 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Spaces_Create_FullMethodName        = "/content.spaces.Spaces/Create"
+	Spaces_Get_FullMethodName           = "/content.spaces.Spaces/Get"
+	Spaces_List_FullMethodName          = "/content.spaces.Spaces/List"
+	Spaces_Update_FullMethodName        = "/content.spaces.Spaces/Update"
+	Spaces_UpdateConfig_FullMethodName  = "/content.spaces.Spaces/UpdateConfig"
+	Spaces_Delete_FullMethodName        = "/content.spaces.Spaces/Delete"
+	Spaces_Transfer_FullMethodName      = "/content.spaces.Spaces/Transfer"
+	Spaces_AbortTransfer_FullMethodName = "/content.spaces.Spaces/AbortTransfer"
+	Spaces_ListTransfers_FullMethodName = "/content.spaces.Spaces/ListTransfers"
+	Spaces_Move_FullMethodName          = "/content.spaces.Spaces/Move"
+)
+
 // SpacesClient is the client API for Spaces service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -58,7 +71,7 @@ func NewSpacesClient(cc grpc.ClientConnInterface) SpacesClient {
 
 func (c *spacesClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -67,7 +80,7 @@ func (c *spacesClient) Create(ctx context.Context, in *CreateRequest, opts ...gr
 
 func (c *spacesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -76,7 +89,7 @@ func (c *spacesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Cal
 
 func (c *spacesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -85,7 +98,7 @@ func (c *spacesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.C
 
 func (c *spacesClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -94,7 +107,7 @@ func (c *spacesClient) Update(ctx context.Context, in *UpdateRequest, opts ...gr
 
 func (c *spacesClient) UpdateConfig(ctx context.Context, in *UpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/UpdateConfig", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_UpdateConfig_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -103,7 +116,7 @@ func (c *spacesClient) UpdateConfig(ctx context.Context, in *UpdateConfigRequest
 
 func (c *spacesClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -112,7 +125,7 @@ func (c *spacesClient) Delete(ctx context.Context, in *DeleteRequest, opts ...gr
 
 func (c *spacesClient) Transfer(ctx context.Context, in *TransferRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Transfer", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Transfer_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -121,7 +134,7 @@ func (c *spacesClient) Transfer(ctx context.Context, in *TransferRequest, opts .
 
 func (c *spacesClient) AbortTransfer(ctx context.Context, in *AbortTransferRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/AbortTransfer", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_AbortTransfer_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -130,7 +143,7 @@ func (c *spacesClient) AbortTransfer(ctx context.Context, in *AbortTransferReque
 
 func (c *spacesClient) ListTransfers(ctx context.Context, in *ListTransfersRequest, opts ...grpc.CallOption) (*ListTransfersResponse, error) {
 	out := new(ListTransfersResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/ListTransfers", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_ListTransfers_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -139,7 +152,7 @@ func (c *spacesClient) ListTransfers(ctx context.Context, in *ListTransfersReque
 
 func (c *spacesClient) Move(ctx context.Context, in *MoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Move", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Move_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -233,7 +246,7 @@ func _Spaces_Create_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Create",
+		FullMethod: Spaces_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Create(ctx, req.(*CreateRequest))
@@ -251,7 +264,7 @@ func _Spaces_Get_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Get",
+		FullMethod: Spaces_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Get(ctx, req.(*GetRequest))
@@ -269,7 +282,7 @@ func _Spaces_List_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/List",
+		FullMethod: Spaces_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).List(ctx, req.(*ListRequest))
@@ -287,7 +300,7 @@ func _Spaces_Update_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Update",
+		FullMethod: Spaces_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Update(ctx, req.(*UpdateRequest))
@@ -305,7 +318,7 @@ func _Spaces_UpdateConfig_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/UpdateConfig",
+		FullMethod: Spaces_UpdateConfig_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).UpdateConfig(ctx, req.(*UpdateConfigRequest))
@@ -323,7 +336,7 @@ func _Spaces_Delete_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Delete",
+		FullMethod: Spaces_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Delete(ctx, req.(*DeleteRequest))
@@ -341,7 +354,7 @@ func _Spaces_Transfer_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Transfer",
+		FullMethod: Spaces_Transfer_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Transfer(ctx, req.(*TransferRequest))
@@ -359,7 +372,7 @@ func _Spaces_AbortTransfer_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/AbortTransfer",
+		FullMethod: Spaces_AbortTransfer_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).AbortTransfer(ctx, req.(*AbortTransferRequest))
@@ -377,7 +390,7 @@ func _Spaces_ListTransfers_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/ListTransfers",
+		FullMethod: Spaces_ListTransfers_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).ListTransfers(ctx, req.(*ListTransfersRequest))
@@ -395,7 +408,7 @@ func _Spaces_Move_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Move",
+		FullMethod: Spaces_Move_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Move(ctx, req.(*MoveRequest))